36 lines
1.1 KiB
Text
36 lines
1.1 KiB
Text
void setup() {
|
|
// test lineIntersect() with visual and textual output
|
|
float lineA[] = {4, 0, 6, 10}; // try 4, 0, 6, 4
|
|
float lineB[] = {0, 3, 10, 7}; // for non intersecting test
|
|
PVector pt = lineInstersect(lineA[0], lineA[1], lineA[2], lineA[3],
|
|
lineB[0], lineB[1], lineB[2], lineB[3]);
|
|
scale(9);
|
|
line(lineA[0], lineA[1], lineA[2], lineA[3]);
|
|
line(lineB[0], lineB[1], lineB[2], lineB[3]);
|
|
if (pt != null) {
|
|
stroke(255);
|
|
point(pt.x, pt.y);
|
|
println(pt.x, pt.y);
|
|
} else {
|
|
println("No point");
|
|
}
|
|
}
|
|
|
|
PVector lineInstersect(float Ax1, float Ay1, float Ax2, float Ay2,
|
|
float Bx1, float By1, float Bx2, float By2) {
|
|
// returns null if there is no intersection
|
|
float uA, uB;
|
|
float d = ((By2 - By1) * (Ax2 - Ax1) - (Bx2 - Bx1) * (Ay2 - Ay1));
|
|
if (d != 0) {
|
|
uA = ((Bx2 - Bx1) * (Ay1 - By1) - (By2 - By1) * (Ax1 - Bx1)) / d;
|
|
uB = ((Ax2 - Ax1) * (Ay1 - By1) - (Ay2 - Ay1) * (Ax1 - Bx1)) / d;
|
|
} else {
|
|
return null;
|
|
}
|
|
if (0 > uA || uA > 1 || 0 > uB || uB > 1) {
|
|
return null;
|
|
}
|
|
float x = Ax1 + uA * (Ax2 - Ax1);
|
|
float y = Ay1 + uA * (Ay2 - Ay1);
|
|
return new PVector(x, y);
|
|
}
|