找到线段和圆

时间:2017-12-27 07:59:11

标签: javascript math

我有一个线段A(x1,y1),B(x2,y2)和一个带有中心C(x3,y3)的圆。我也有圆的半径。我如何获得切线?

This is what I am trying to make

这些切线应始终与线段平行。

P.S。对不起,如果这对你没有意义,我在数学方面非常糟糕。问我任何问题,我只是不知道还有什么需要解决这个任务。感谢。

3 个答案:

答案 0 :(得分:0)

我假设您正在寻找斜率= =线斜率的切线。我将详细介绍算法,并将实际代码留给您。

  1. 因此,第一个linelope =(y2-y1)/(x2-x1)。
  2. 接下来,半径r以(x3,y3)为中心的圆可以用参数方程x = r * cos(t)+ x3来描述; y = r * sin(t)+ y3。
  3. 给定t的圆的斜率是(dy / dt)/(dx / dt)= -cos(t)/ sin(t)= -1 / tan(t)。
  4. 设置-1 / tan(t)= lineslope =(y2-y1)/(x2-x1)。求解t得到t =(pi / 2) - arctan( - (y2-y1)/(x2-x1))。 (这应该为[0,2pi]上的t产生两个值,这两个值将是切线的斜率等于段的斜率的两个位置。)
  5. 将刚刚计算出的t的值插入(3)中的圆方程中,并且您将在圆上的点(x4,y4)处切线与线段具有相同的斜率。
  6. 切线的方程式就是y - y4 = lineslope *(x-x4)

答案 1 :(得分:0)

段定义方向向量

 D = (dx, dy) = (b.x - ax, b.y - a.y)
 dlen = Length(D) = Sqrt(dx * dx + dy * dy)

半径矢量垂直于切线,它的长度为R.设圆中心为(0,0)(我们将在之后进行校正)。所以

 x * x + y * y = R^2
 x * dx + y * dy = 0  //scalar product

为未知的x,y解决这个系统,我们有

 x =  +- R * dy / dlen
 y =  -+ R * dx / dlen

在修正后,切线的两个基点是

px1 = x3 + R * dy / dlen  
py1 = y3 - R * dx / dlen 

px2 = x3 - R * dy / dlen  
py2 = y3 + R * dx / dlen 

这些切线的方向矢量为D,因此您可以将切线的第二个点定义为

px1_2 = x3 + R * dy / dlen + dx 
py1_2 = y3 - R * dx / dlen + dy 

第一个切线是直通(px1,py1)和(px1_2,py1_2)

请注意,该解决方案适用于任何段的方向(包括水平和垂直)

答案 2 :(得分:0)

以隐式形式

写出AB线的等式
a X + b Y + c = 0

其中系数被归一化以便a² + b² = 1https://en.wikipedia.org/wiki/Linear_equation#Two-point_form

两个请求的切线与AB平行,方程

a X + b Y + c' = 0

并且足以表示线条与圆心的距离为R

|a Xc + b Yc + c'| = R

c'中提供两个解决方案。