我在圆圈上有两个点(x1,y1和x2,y2),圆圈的中心(c1,c2) 并且需要javascript代码来计算通过点x1,y1和x2,y2的两条切线的交点。
我用它将圆形(实际上是由上述点定义的圆弧)转换为二次贝塞尔曲线。
答案 0 :(得分:3)
切线的法线是:
n1x = x1 - c1
n1y = y1 - c2
n2x = x2 - c1
n2y = y2 - c2
使用以下参数:
d1 = n1x * x1 + n1y * y1
d2 = n2x * x2 + n2y * y2
切线方程可以写成:
x * n1x + y * n1y = d1
x * n2x + y * n2y = d2
在一般情况下,求解线性方程组得到以下结果:
x = (d2 * n1y - d1 * n2y) / (n1y * n2x - n1x * n2y)
y = (d1 * n2x - d2 * n1x) / (n1y * n2x - n1x * n2y)
在javascript中:
var x1,y1,x2,y2,c1,c2; // inputs
var x, y; // outputs
... get the parameters somehow
var n1x = x1 - c1;
var n1y = y1 - c2;
var n2x = x2 - c1;
var n2y = y2 - c2;
var d1 = n1x * x1 + n1y * y1;
var d2 = n2x * x2 + n2y * y2;
var det = n1y * n2x - n1x * n2y;
if (det === 0) {
// The lines are parallel
} else {
x = (d2 * n1y - d1 * n2y) / det;
y = (d1 * n2x - d2 * n1x) / det;
}
答案 1 :(得分:1)
从中心(c₁, c₂)
到圆周上的(xᵢ, yᵢ)
点的向量为(xᵢ-c₁, yᵢ-c₂)
。
这意味着通过(c₁, c₂)
和(xᵢ, yᵢ)
的行具有斜率sᵢ = (yᵢ-c₂)/(xᵢ-c₁)
。
设tᵢ
为(xᵢ, yᵢ)
上切线的斜率。 tᵢ = -1/sᵢ = (c₁-xᵢ)/(yᵢ-c₂)
。
让oᵢ = yᵢ-tᵢxᵢ
。然后通过(xᵢ, yᵢ)
的切线是
y = tᵢ(x-xᵢ) + yᵢ = tᵢx + oᵢ
为i = 1, i = 2
执行此操作会生成线性方程组系统。
y = t₁x + o₁
y = t₂x + o₂
解决它会给出切线的交点
o₁-o₂
x = ─────
t₂-t₁
o₁-o₂
y = t₁ ───── + o₁
t₂-t₁