我想在两行之间放置一个圆但是,我只想使用一条线来创建圆。 所以我的方法是在第1行上选择点。 对于第1行的每个点: 我想创建半径增加的圆,该圆与在线上的点1相切。增加半径,直到圆也与另一条线相交。然后以较小的步长减小半径,直到圆与两条线相切。 继续进行第1行的下一个点。
以某种方式,我无法找到一个干净而清晰的代码来做到这一点。可以使用line.arbitrary_point完成线上的点。 如何创建半径为R到点p1的圆,使其以最佳方式切线?
谢谢!
答案 0 :(得分:1)
与两条直线R
和s1
相切的半径s2
的圆的中心是另外两条直线的交点,每条直线平行一段距离{{1 }}
让d= R
从s1
到A1= {ax1,ay1}
,B1= {bx1,by1}
从s2
到A2= {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}·R
和s1
平行的新点是
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) < smallValue
和s1
是平行的或相同的直线。在这种情况下,没有解决方案。
最后,切线现在很容易了:
s2