我正在绘制画布上的大量连接边,所有这些边都以这样的方式排列,即这些边的某些特定扩展总是给出与另一个扩展边的交点。这一点是进一步计算所必需的 - 它与画布上显示的内容无关。我的代码适用于一般情况,但如果边缘的相应扩展很远,则交叉点并不总是存在(但是,行不是并行的) - 至少不在此程序的范围内。有没有人有任何想法来提高这段代码的精确度?我实际上是在稍后使用BigDecimals,但是对于绘图步骤我最初认为使用double就足够了。
这个将边缘延伸到两边:
public Line2D.Double ExteLine(Point2D p, Point2D q){
double slope, y3, y4;
slope = (q.getY() - p.getY())/(q.getX() - p.getX());
y3 = (slope * (100000 - p.getX())) + p.getY();
y4 = (slope * (-100000 - p.getX())) + p.getY();
Point2D out1 = new Point2D.Double(100000, y3);
Point2D out2 = new Point2D.Double(-100000, y4);
Line2D.Double line = new Line2D.Double(out1, out2);
return line; }
这个找到了交集:
public Point2D.Double getIntersectionPoint(Line2D.Double line1, Line2D.Double line2) {
if (! line1.intersectsLine(line2)) {
System.out.println("No intersection");
return null;}
double s1 = line1.getX1(),
sp2 = line1.getY1(),
rx = line1.getX2()-s1,
ry = line1.getY2()-sp2;
double qx = line2.getX1(),
qy = line2.getY1(),
sx = line2.getX2()-qx,
sy = line2.getY2()-qy;
double det = sx*ry - sy*rx;
if (det == 0) { System.out.println("Det = 0");
return null;}
else {
double z = (sx*(qy-sp2)+sy*(s1-qx))/det;
if (z==0 || z==1) return null;
return new Point2D.Double(
(double)(s1+z*rx), (double)(sp2+z*ry));
}
}
答案 0 :(得分:1)
使用齐次坐标的投影几何是处理几乎平行或甚至完全平行的线的一种很好的方法。这是一个速成课程:
正如您所看到的,这实现起来相当简单,甚至更好:您无需在任何地方进行任何区分!对于实际的绘图材料,您可能希望将线条与画布的边界相交,然后使用连接这些交叉点的线条作为图形基元的定义。