我有一个原点为 (cx, cy) 的圆。 半径为r。 那么,有一条线段定义为 两个点:(x1,y1) 和 (x2,y2)。 如何判断是否是线段(不是延长线) 与圆相切吗?如果是,两者在哪里接触?
我现在在做什么:找出该点的距离 (cx, cy) 从延长线。如果距离!= r,那么 当然,线段不与圆相切。甚至 如果距离== r,那么我们需要找出该点 他们接触的地方。然后检查该点是否位于 (x1,y1) 和 (x2,y2) 之间的线段。如果是,则该行 线段与圆和触摸点相切 已经计算出来了。这可行,但涉及太多数学。 并且全部带有浮点或 double 变量。难道没有一个 更智能、更快的算法来达到相同的结果?
谢谢和问候, 普拉莫德
最佳答案
我建议你停止用斜率进行推理,因为垂直方向上的奇点总是很难处理。尝试使用参数形式:
p = p1 + t v where v = p2 - p1
现在将向量 p1 - c
投影到 v
上,对 t
求导,设置为零,您很快就会得到一个表达式t
的值描述了无限直线上最接近 c
的点,即切点:
(c - p1) dot v
t = --------------
v dot v
如果该值介于 0 和 1 之间,则切点位于 p1
和 p2
之间。这是一个相当便宜的计算。如果是这样,您可以进行半径检查
(c - p1 - tv) dot (c - p1 - tv) ~= r^2 ?
请注意,上面已经计算了子项c - p1
。
您提到只有圆在移动,因此您可以计算 v dot v
一次并保存。
关于algorithm - 如何判断线段是否与圆相切?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38603185/