将其用作[引用][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 度范围内。
所以你想要的两个角度的答案是 b+a
和 b-a
。在您的两个案例中使用 acos
而不是 asin
为您的第一象限示例生成 97.7592 & -16.5566(或等效 343.4434),以及 -164.7385 & -56.3736(或等效 195.2615 和303.6264)作为您的第三象限示例。 (注意:不是在 t_1
和 t-2
的公式中添加 180 度,您可以只切换 dx
和 dy
)
关于matlab - 点与圆相切,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17012853/