Я рисую большое количество связанных ребер на холсте, все из которых расположены таким образом, что некоторое конкретное расширение этих краев всегда дает точку пересечения с другим расширенным краем , Эта точка необходима для дальнейших вычислений - она не актуальна в контексте того, что появляется на холсте. Мой код отлично подходит для общего случая, но если соответствующие расширения края выходят далеко, пересечения не всегда существуют (однако строки не параллельны) - по крайней мере, не в рамках этой программы. У кого-нибудь есть идеи улучшить точность этого кода? Я действительно работаю с 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));
}
}
Являются ли края «истинными» линиями, которые расширяются до бесконечности в обоих направлениях (и просто проходят через сегмент линии, обозначаемый вашим Line2D.Doubles), или они являются сегментами линий, которые имеют разные начальные и конечные точки, представленные вашей Line2D. Удваивает? – paulk23
. НИКОГДА не может зависеть от двух значений с плавающей запятой, вычисленных различными методами, которые ДОЛЖНЫ быть равными, чтобы быть в точности равными (для ==). Если вы должны использовать плавающую точку, вы должны сравнить ее с небольшим значением epsilon. То есть'if (abs (ab) <1.0E-6)' вместо 'if (a == b)' –
@JimGarrison Это хороший момент и метод, который я использую на более позднем этапе, но я не достаточно посмотреть, как я могу включить это здесь (или даже использовать что-то еще, чем с плавающей запятой?) – Denor