matlab - 点与圆相切

标签 matlab geometry latitude-longitude angle

将其用作[引用][1]:Find a tangent point on circle?

cx = 0;
cy = 0;

px = -3;
py = -8;

dx = cx - px;
dy = cy - py;

a = asin(5 / ((dx*dx + dy*dy)^0.5));
b = atan2(dy, dx);

t_1 = deg2rad(180) + b - a;
t_2 = deg2rad(180) + b + a;

点 (7,6) 的角度为 7.9572/73.4434,点 (-3, -8) 的角度为 213.6264/285.2615。 所以对于第一象限,角度没有意义,但对于第三象限,它们有意义。我做错了什么?

最佳答案

a 的公式是错误的。你应该使用

a = acos(5 / ((dx*dx + dy*dy)^0.5))

代替

a = asin(5 / ((dx*dx + dy*dy)^0.5))

即使用 acos(...) 而不是 asin(...)。原因如下图所示。角度 a 的公式是 a=acos(r/H),其中 r 是圆的半径,H 是直角三角形斜边的长度。所以这与 asin(...) 无法知道传递的值位于两个可能象限中的哪一个这一事实无关。 asin 的参数始终为正,您希望答案始终在 0 到 90 度范围内。

image of circle with two tangents from an external point

所以你想要的两个角度的答案是 b+ab-a。在您的两个案例中使用 acos 而不是 asin 为您的第一象限示例生成 97.7592 & -16.5566(或等效 343.4434),以及 -164.7385 & -56.3736(或等效 195.2615 和303.6264)作为您的第三象限示例。 (注意:不是在 t_1t-2 的公式中添加 180 度,您可以只切换 dxdy)

关于matlab - 点与圆相切,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17012853/

相关文章:

image - 使用 Matlab 将形状检测为圆形

mysql - 将纬度、经度的 MYSQL 5.7 点表示形式插入表中

python - 如何在 Python3 中的 MatLab imshow() 中使用 'xdata' imshow()

matlab - 如何根据引脚连接获取 Simulink block 的顺序?

matlab - Fminsearch Matlab(非线性回归)

php - mySQL-显示最近的商店,没有范围或限制

python - 在给定起始坐标、方位和距离的情况下查找目的地坐标

matlab - 在MATLAB中从结构中删除字段

c# - 如何在 3D 三角形上的给定点 (x,z) 处找到 y?

math - 线和球之间的相交