RosettaCodeData/Task/Find-the-intersection-of-two-lines/Processing/find-the-intersection-of-two-lines.processing
2023-07-01 13:44:08 -04:00

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);
}