【发布时间】:2021-06-14 20:10:04
【问题描述】:
编辑:我刚刚将控制点更改为交叉点。这就是它不再适合的原因。
我知道这很冒昧。但我正在开发一个 Web 应用程序,我需要计算与二次贝塞尔曲线和一条线的交点。
- 线性贝塞尔曲线:
P=s(W-V)+V - 二次贝塞尔曲线:
P=t²(A-2B+C)+t(-2A+2B)+A
因为W、V、A、B 和C 是点,所以我可以做两个等式。我将第一个方程重新排列为单独的 s 来求解方程。
我很确定我做对了,但我的路口不在线上。所以我想知道并通过正确的公式制作了我自己的二次贝塞尔曲线,我的交点达到了这条曲线。现在我想知道我做错了什么?
这是我的功能:
intersectsWithLineAtT(lineStartPoint, lineEndPoint)
{
let result = []
let A = this.startPoint, B = this.controlPoint, C = this.endPoint, V = lineStartPoint, W = lineEndPoint
if (!Common.isLineIntersectingLine(A, B, V, W)
&& !Common.isLineIntersectingLine(B, C, V, W)
&& !Common.isLineIntersectingLine(A, C, V, W))
return null
let alpha = Point.add(Point.subtract(A, Point.multiply(B, 2)), C)
let beta = Point.add(Point.multiply(A, -2), Point.multiply(B, 2))
let gamma = A
let delta = V
let epsilon = Point.subtract(W, V)
let a = alpha.x * (epsilon.y / epsilon.x) - alpha.y
let b = beta.x * (epsilon.y / epsilon.x) - beta.y
let c = (gamma.x - delta.x) * (epsilon.y / epsilon.x) - gamma.y + delta.y
let underSquareRoot = b * b - 4 * a * c
if (Common.compareFloats(0, underSquareRoot))
result.push(-b / 2 * a)
else if (underSquareRoot > 0)
{
result.push((-b + Math.sqrt(underSquareRoot)) / (2 * a))
result.push((-b - Math.sqrt(underSquareRoot)) / (2 * a))
}
result = result.filter((t) =>
{
return (t >= 0 && t <= 1)
})
return result.length > 0 ? result : null
}
我希望有人可以帮助我。
莉娜
【问题讨论】:
标签: javascript html5-canvas line intersection bezier