geometry - 创建与半径为 r [几何] 的两条线相切的圆
问题描述
我想在两条线之间放一个圆圈但是,我只想用一条线来创建圆圈。所以我的方法是选择第 1 行上的点。对于第 1 行上的每个点:我想创建半径增加的圆,这些圆与行上的第 1 点相切。增加半径,直到圆也与另一条线相交。之后以较小的步长减小半径,直到圆与两条线相切。继续第 1 行的下一点。
不知何故,我无法找到一个干净清晰的代码来做到这一点。线上的点可以使用 line.arbitrary_point 来完成。如何创建一个半径为 R 到点 p1 的圆,以便它以最佳方式相切?
谢谢!
解决方案
R
与两条直线相切s1
并且是另外两条直线的交点的半径圆的中心s2
,每条直线平行一段距离d= R
让行s1
from A1= {ax1,ay1}
toB1= {bx1,by1}
和s2
from 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
的向量来更改点。垂直酉向量是:。注意:如果您想要其他解决方案,请在两条线的另一侧使用。
因此,与和平行于和的新点是vp1
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
。它abs(den) < smallValue
(IOW,这个分母接近于零),那么s1
和s2
是平行的或者是同一条直线。在这种情况下,没有解决方案。
最后,切点现在很容易:
tx1 = ax1 + k1·v1x
ty1 = ay1 + k1·v1y
tx2 = ax2 + k2·v2x
ty2 = ay2 + k2·v2x
推荐阅读
- r - 计算并附加列中相等字符串的日期差异
- r - 在 Ubuntu 18.04 上编译 R 3.6.1 时出错
- c# - Selenium 网格在浏览器之间混合测试
- python - python - 用 001,002 等重命名文件
- php - Html2Canvas 通过 php 将 png 图像保存到服务器,显示一半图像并且文件大小减小
- jenkins - 詹金斯管道脚本处理子目录中的模块
- java - 在 PaginatedScanList 上使用 batchDelete() 时出现 Java 堆大小错误 - DynamoDB
- c++ - 声明在 C++ 中调用的函数的以下方法是什么?
- python - SpeechRecognition Package (https://pypi.org/project/SpeechRecognition/) 可以离线工作吗?
- javascript - Heroku 返回 400 错误请求响应 (Socket.IO Node.js)