algorithm - 如何判断线段是否与圆相切?

标签 algorithm math graphics language-agnostic geometry

我有一个原点为 (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 之间,则切点位于 p1p2 之间。这是一个相当便宜的计算。如果是这样,您可以进行半径检查

(c - p1 - tv) dot (c - p1 - tv) ~= r^2  ?

请注意,上面已经计算了子项c - p1

您提到只有圆在移动,因此您可以计算 v dot v 一次并保存。

关于algorithm - 如何判断线段是否与圆相切?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38603185/

相关文章:

java - 如何模块化 A* 中的启发式(运行时启发式)

python - 使用 Beautiful Soup 的 Python 网络爬虫 BFS 算法?

java - 将图像从一个角度逐渐旋转到另一个角度

java - 数组元素的算术方程不起作用

android - 在 Android TextView 中显示进度

c - 光强与R、G、B的关系

c - 合并两个已排序数组的困难

algorithm - 转换数组中的第 K 个元素

php - & 作为 PHP 中的算术运算符

r - R 中的高性能 2D OpenGL 图形用于使用 qtpaint (qt) 或 rdyncall (SDL/OpenGL) 包快速显示光栅图像?