首页 > 解决方案 > 创建与半径为 r [几何] 的两条线相切的圆

问题描述

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

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

谢谢!

标签: geometrysympylines

解决方案


R与两条直线相切s1并且是另外两条直线的交点的半径圆的中心s2,每条直线平行一段距离d= R

在此处输入图像描述

让行s1from A1= {ax1,ay1}toB1= {bx1,by1}s2from A2= {ax2,ay2}toB2= {bx2,by2}

使用参数表示,一个点s1

s1x= ax1 + k1·v1x
s1y= ay1 + k1·v1y

其中k1是每个点的不同值并且{v1x,v1y}是方向上的向量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

现在,要获得平行,s1我们只需通过添加一个 垂直于 A1-B1 且长度为A1的向量来更改点。垂直酉向量是:。注意:如果您想要其他解决方案,请在两条线的另一侧使用。 因此,与和平行于和的新点是vp1d= Rvpu1= {-v1y, v1x}{v1y, -v1x}
vp1 = vpu1·Rvp2= {-v2y, v2x}·Rs1s2

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。它abs(den) < smallValue(IOW,这个分母接近于零),那么s1s2是平行的或者是同一条直线。在这种情况下,没有解决方案。

最后,切点现在很容易:

tx1 = ax1 + k1·v1x
ty1 = ay1 + k1·v1y
tx2 = ax2 + k2·v2x
ty2 = ay2 + k2·v2x

推荐阅读