/*
Line.java
Test if two line segments are intersecting or not
Line segment 1 is between endpoints (x1,y1) and (x2,y2)
Line segment 2 is between endpoints (u1,v1) and (u2,v2)
Usage: java Line x1 y1 x2 y2 u1 v1 u2 v2
> java Line
java Line 0 1 1 0 0 0 1 1
> java Line 0 1 1 0 0 0 1 1
t * 1.000000 = 0.000000 + u * 1.000000
t * -1.000000 = -1.000000 + u * 1.000000
---
t * 1.000000 = 0.000000 + u * 1.000000
t * -1.000000 = -1.000000 + u * 1.000000
---
t = nom(1.000000) / denom(2.000000) = 0.500000
u = nom(-1.000000) / denom(-2.000000) = 0.500000
true
*/
public class Line
{
// line1: 0 <= t <= 1
// x = ax1 + t * (ax2 - ax1)
// y = ay1 + t * (ay2 - ay1)
// line2: 0 <= u <= 1
// x = bx1 + u * (bx2 - bx1)
// y = by1 + u * (by2 - by1)
// returns true if two lines intersect; and false otherwise
public static boolean isTwoLinesIntersecting(
double ax1, double ay1, double ax2, double ay2,
double bx1, double by1, double bx2, double by2)
{
double nom, denom;
double ax21 = ax2 - ax1;
double bax1 = bx1 - ax1;
double bx21 = bx2 - bx1;
double ay21 = ay2 - ay1;
double bay1 = by1 - ay1;
double by21 = by2 - by1;
// t * (ax2 - ax1) = (bx1 - ax1) + u * (bx2 - bx1)
// t * (ay2 - ay1) = (by1 - ay1) + u * (by2 - by1)
System.out.printf(" t * %f = %f + u * %f\n", ax21, bax1, bx21);
System.out.printf(" t * %f = %f + u * %f\n", ay21, bay1, by21);
System.out.printf(" ---\n");
// ==>
// t * (ax2 - ax1) * (by2 - by1) = (bx1 - ax1) * (by2 - by1) + u * (bx2 - bx1) * (by2 - by1)
// t * (ay2 - ay1) * (bx2 - bx1) = (by1 - ay1) * (bx2 - bx1) + u * (by2 - by1) * (bx2 - bx1)
System.out.printf(" t * %f = %f + u * %f\n", ax21*by21, bax1*by21, bx21*by21);
System.out.printf(" t * %f = %f + u * %f\n", ay21*bx21, bay1*bx21, by21*bx21);
System.out.printf(" ---\n");
// ==>
// t = (bx1 - ax1) * (by2 - by1) - (by1 - ay1) * (bx2 - bx1)
// / [ (ax2 - ax1) * (by2 - by1) - (ay2 - ay1) * (bx2 - bx1)]
// u = (ax1 - bx1) * (ay2 - ay1) - (ay1 - by1) * (ax2 - ax1)
// / [ (bx2 - bx1) * (ay2 - ay1) - (by2 - by1) * (ax2 - ax1)]
nom = (bx1 - ax1) * (by2 - by1) - (by1 - ay1) * (bx2 - bx1);
denom = (ax2 - ax1) * (by2 - by1) - (ay2 - ay1) * (bx2 - bx1);
double t = nom / denom;
System.out.printf(" t = nom(%f) / denom(%f) = %f\n", nom, denom, t);
nom = (ax1 - bx1) * (ay2 - ay1) - (ay1 - by1) * (ax2 - ax1);
denom = (bx2 - bx1) * (ay2 - ay1) - (by2 - by1) * (ax2 - ax1);
double u = nom / denom;
System.out.printf(" u = nom(%f) / denom(%f) = %f\n", nom, denom, u);
if(t>=0 && t <=1 && u>=0 && u<=1) return true;
else return false;
}
public static void main(String[] args)
{
if(args.length != 8)
{
System.out.println("java line 0 1 1 0 0 0 1 1");
System.exit(0);
}
double ax1 = Double.parseDouble(args[0]);
double ay1 = Double.parseDouble(args[1]);
double ax2 = Double.parseDouble(args[2]);
double ay2 = Double.parseDouble(args[3]);
double bx1 = Double.parseDouble(args[4]);
double by1 = Double.parseDouble(args[5]);
double bx2 = Double.parseDouble(args[6]);
double by2 = Double.parseDouble(args[7]);
System.out.println(Line.isTwoLinesIntersecting(
ax1,ay1,ax2,ay2,bx1,by1,bx2,by2));
}
}
2009年7月21日 星期二
code for testing if two line segments are intersecting
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言