【问题标题】:How to find intersection of two tangent lines in javascript如何在javascript中找到两条切线的交点
【发布时间】:2015-12-25 02:23:58
【问题描述】:

我在一个圆上有两个点(x1,y1 和 x2,y2),一个圆的中心(c1,c2) 并且需要 javascript 代码来计算通过点 x1,y1 和 x2,y2 的两条切线的交点。

我正在使用它来将圆(实际上是由上述点定义的弧)转换为二次贝塞尔曲线。

【问题讨论】:

  • 可以得到每条(circleOrigin, point)线的线性方程。然后你可以得到正切的线性方程。然后用这两个线性方程,就可以得到交点坐标。这只是三角函数(顺便说一句,我不是英语,如果我不使用确切的词,请见谅)
  • 您是在使用画布绘制圆圈还是仅使用数字而不是图像。
  • 不需要三角函数来找到切线的方程。它是半径的垂线。

标签: javascript math geometry intersection


【解决方案1】:

切线的法线是:

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

【讨论】:

  • 谢谢,这正是我想要的。我会试一试。我想我应该使用 cx,cy 而不是 c1,c2 但你似乎已经理解了。
【解决方案2】:

从中心(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₁

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多