gpt4 book ai didi

javascript - 为什么这个线段相交算法不起作用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:22 24 4
gpt4 key购买 nike

我试图计算两条线段的交点。每个线段要么是垂直的,要么是水平的(0°、90°、180°、270°)。如果两个线段都是垂直或水平的,我还需要计算交点。

enter image description here

function intersection(line1, line2) {
var origin1x = Math.min(line1.getStartPosition().x, line1.getEndPosition().x);
var origin1y = Math.min(line1.getStartPosition().y, line1.getEndPosition().y);
var origin2x = Math.min(line2.getStartPosition().x, line2.getEndPosition().x);
var origin2y = Math.min(line2.getStartPosition().y, line2.getEndPosition().y);

var dx = origin2x - origin1x;
var dy = origin2y - origin1y;

if((line1.isHorizontal() && (dx < 0 || dx > line2.getLength())) || (!line1.isHorizontal() && (dy < 0 || dy > line1.getLength()))) {
return null;
}

return {
x: line1.isHorizontal() ? origin1x + dx : origin1x,
y: !line2.isHorizontal() ? origin2y - dy : origin2y
}
}

该代码在某些情况下运行良好,但有时会失败。

例如:

line1 = ((0, 50), (0, 30)) // ((startX, startY), (endX, endY))
line2 = ((0, 0), (0, 30))
shouldBe = (0, 30)

谢谢。

最佳答案

这里有一种方法可以解决这个问题:

使用 y = m1x + c1y = m2x + c2 写出两条线的方程。注意特殊情况:如果一条线是水平的,那么它有等式 y = c,如果是垂直的,那么它有等式 x = c(在最后一种情况下 c 实际上是 x 轴上的截点,但代数仍然可以很好地计算)。

使用为第一行提供的顶点求解系数 m1c1,类似地求解 m2c2 使用第二行的顶点。

一旦你有了这些方程,交点就是两个联立方程的解,这两个方程将根据计算的系数给出 xy 的值。

请注意,这适用于任何非平行排列的线条。 (对于并行情况,联立方程将是彼此的线性倍数,因此不会产生解。)

有点代数,但你应该能够快速思考。

关于javascript - 为什么这个线段相交算法不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24526865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com