Matlab 与圆相切的点

Matlab 与圆相切的点,matlab,geometry,latitude-longitude,angle,Matlab,Geometry,Latitude Longitude,Angle,将此用作[参考][1]: 点(7,6)的角度为7.9572/73.4434,-3,-8)的角度为213.6264/285.2615因此对于第一象限,角度没有意义,但是对于第三象限,角度有意义。我做错了什么?好吧,看起来你没有解释asin,atan,(任何a-trig函数)无法知道你传递的值在两个可能的象限中的哪一个是谎言。为了弥补这一点,a-trig函数将假设您的点位于第一象限或第四象限(东北/东南)。因此,如果调用atan函数且原点位于第二象限或第三象限,则需要在其返回的任何值上添加180度/

将此用作[参考][1]:


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

好吧,看起来你没有解释asin,atan,(任何a-trig函数)无法知道你传递的值在两个可能的象限中的哪一个是谎言。为了弥补这一点,a-trig函数将假设您的点位于第一象限或第四象限(东北/东南)。因此,如果调用atan函数且原点位于第二象限或第三象限,则需要在其返回的任何值上添加180度/pi弧度

请参阅此处说明asin从[-pi/2,pi/2]返回值的文档:

希望有帮助:)

编辑 我最初误解了情况

以下是我认为你已经计算过的: t_1和t_2表示如果从切点开始在圆上移动并希望移动到原始起点,则移动的角度

从这个角度看,你的角度是正确的

关于这一点(7,6)

如果在圆上以大约(0,5)的角度开始,并以7度的角度移动,则会到达该点。 如果您以大约(5,0)的角度在圆上开始,并以70度的角度行驶,您将到达该点

现在,比角度更有用、更少混淆的是知道直线的斜率。要从角度获取此值,请使用角度(以度为单位)执行以下操作:

angle = (angle + 90 + 360) % 180 - 90 // this gives us the angle as it would be in quad 1 or 4
slope = tan( deg2rad( angle ) )

此MathWorld条目就是您想要的:。

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

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

a = asin(5 / ((dx*dx + dy*dy)^0.5))
i、 e.使用
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
的符号即可)

首先——我花了大约10分钟的时间弄清楚你到底想做什么(最后,我从一个答案中的一条评论中得到了这一点),而解决你的问题需要2分钟。因此,为了将来的参考,请首先尽可能清楚地描述您的问题

现在,我想你只是把你的标志弄乱了。请尝试以下操作:

%// difference vector
%// NOTE: these go the other way around for the atan2 to come out right
dx = px - cx;
dy = py - cy;

%// tip angle of the right triangle
a = asin( 5 / sqrt(dx*dx + dy*dy) );
%// angle between the (local) X-axis and the line of interest
b = atan2(dy, dx);
%// the third angle in the right triangle
%// NOTE: minus a here instead of plus b
g = pi/2 - a;

%// Angles of interest
%// NOTE1: signs are flipped; this automatically takes care of overshoots
%// NOTE2: don't forget to mod 360
t_1 = mod( rad2deg(b - g), 360)
t_2 = mod( rad2deg(b + g), 360)
或者,您可以使用
acos
而不是
asin
跳过计算中间角
a

%// difference vector    
dx = px - cx;
dy = py - cy;

%// Directly compute the third angle of the right triangle 
%// (that is, the angle "at the origin")
g = acos( 5 / sqrt(dx*dx + dy*dy) );
%// angle between the (local) X-axis and the line of interest
b = atan2(dy, dx);

%// Angles of interest
t_1 = mod( rad2deg(b - g), 360)
t_2 = mod( rad2deg(b + g), 360)

这是重新发现
acos(x)=pi/2-asin(x)
:)

的另一种方法,因此根据您的评论,我不需要像对第三象限那样为第一象限添加任何内容。但是,第一象限的角度仍然错误,为187.7592/253.4434。让我确保我正确理解您的要求。你想知道,给定一个点和一个圆,如果你在圆上的两个点和原点之间画一条线,那么圆上的哪两个点会产生一条与圆相切的线?我的朋友就是我想要的。欢迎来到这里。请将您的答案与第一个答案合并。谢谢Andrey,将我的第二个答案作为本答案的编辑。这不会占用我与圆圈的距离。怎么会不占用呢?您使用的距离就是从圆心到点的距离:
d=x0^2+y0^2
。该条目假设圆位于
x0
y0
,点位于
0
0
(您可以轻松添加偏移以移动该点),但情况和方程式相同。而且直到现在你才提到距离。您想知道相对于点(笛卡尔坐标)或相对于角度和距离(极坐标)的切线吗?你的代码是从笛卡尔坐标开始的,我想得到给定一点在圆外距离为d的圆的切线角。这就是我在发布代码时试图实现的目标。请澄清你到底想实现什么。代码应该做什么?输入是什么?预期产量是多少?也许把它写成函数会更清楚。这感觉有点像一场灾难,但我认为它可以被拯救。我已经更新了我的答案。您的
a
公式有误。标签有误吗?这与地理纬度经度标签有什么关系?(拉特朗不在笛卡尔平面上)
%// difference vector    
dx = px - cx;
dy = py - cy;

%// Directly compute the third angle of the right triangle 
%// (that is, the angle "at the origin")
g = acos( 5 / sqrt(dx*dx + dy*dy) );
%// angle between the (local) X-axis and the line of interest
b = atan2(dy, dx);

%// Angles of interest
t_1 = mod( rad2deg(b - g), 360)
t_2 = mod( rad2deg(b + g), 360)