创建与半径为r [几何]的两条线的切线圆

时间:2018-07-07 13:28:25

标签: geometry sympy lines

我想在两行之间放置一个圆但是,我只想使用一条线来创建圆。 所以我的方法是在第1行上选择点。 对于第1行的每个点: 我想创建半径增加的圆,该圆与在线上的点1相切。增加半径,直到圆也与另一条线相交。然后以较小的步长减小半径,直到圆与两条线相切。 继续进行第1行的下一个点。

以某种方式,我无法找到一个干净而清晰的代码来做到这一点。可以使用line.arbitrary_point完成线上的点。 如何创建半径为R到点p1的圆,使其以最佳方式切线?

谢谢!

1 个答案:

答案 0 :(得分:1)

与两条直线Rs1相切的半径s2的圆的中心是另外两条直线的交点,每条直线平行一段距离{{1 }}

enter image description here

d= Rs1A1= {ax1,ay1}B1= {bx1,by1}s2A2= {ax2,ay2}

使用参数表示法,B2= {bx2,by2}中的一个点是

s1

其中s1x= ax1 + k1·v1x s1y= ay1 + k1·v1y 是每个点的不同值,而k1是方向{v1x,v1y} ary 向量:

A1,B1

le1 = sqrt((bx1-ax1)^2 + (by1-ay1)^2) //length of A1-B1 segment v1x = (bx1-ax1) / le1 v1y = (by1-ay1) / le1 行也一样:

s2

现在,要与s2x= ax2 + k2·v2x s2y= ay2 + k2·v2y with le2 = sqrt((bx2-ax2)^2 + (by2-ay2)^2) //length of A2-B2 segment v2x = (bx2-ax2) / le2 v2y = (by2-ay2) / le2 平行,我们只需添加垂直于A1-B1且长度为s1的向量A1来改变点vp1。垂直ary矢量为:d= R注意:如果您想要另一种解决方案,请在这两行的另一侧,使用vpu1= {-v1y, v1x}
因此,对于{v1y, -v1x}vp1 = vpu1·R,与vp2= {-v2y, v2x}·Rs1平行的新点是

s2

现在我们必须找到这些直线的交点px1= ax1 - v1y·R py1= ay1 + v1x·R px2= ax2 - v2y·R py2= ay2 + v2x·R

C

解决sp1x= px1 + k1·v1x sp1y= py1 + k1·v1y sp2x= px2 + k2·v2x sp2y= py2 + k2·v2y with sp1x = sp2x sp1y = sp2y ,我们得到:

k1, k2, sp1x, sp1y

关注,注意den = v1x·v2y - v2x·v1y k1 = (v2y·(px2-px1) - v2x·(py2-py1)) / den k2 = (v1y·(px2-px1) - v1x·(py2-py1)) / den cx = px1 + k1·v1x = px2 + k2·v2x //choose one cy = py1 + k1·v1y = py2 + k2·v2y //choose one 的值。它den(IOW,该分母接近于零),则abs(den) < smallValues1是平行的或相同的直线。在这种情况下,没有解决方案。

最后,切线现在很容易了:

s2