gpt4 book ai didi

delphi - 两个向量之间的角度

转载 作者:行者123 更新时间:2023-12-03 18:05:48 25 4
gpt4 key购买 nike

所以,我试图在 Delphi 中获得两个 TPoints 之间的角度,结果比我预期的更难。我得到的结果我无法解释(似乎是“度数”部分的问题,或者 ArcTan2 没有以我预期的形式返回总和。
- 德尔皮-v7:

function Modulo(x,y:Extended): Extended;
var d: Extended;
begin
d := x / y;
Result := (d - floor(d)) * y;
end;

function Degrees(Rads: Extended): Extended;
begin
Result := Rads*(180/Pi);
end;

function GetPointAngle(P1, P2: TPoint): Extended;
begin
Result := Modulo(Degrees(ArcTan2(-(P1.Y - P2.Y), P1.X - P2.X)) - 90, 360);
end;

然而,当我将代码移植到 Python 或在另一个 Pascal 变体中测试时,上述 作品 .但是现在,它似乎返回一个静态的总和(如果我“移动”第二个 TPoint 不会改变)。

万一你想知道;我创建了“模”函数只是因为“模”运算符中使用的除法运算符舍入为 0,而不是向下舍入(因此负数不起作用)。

编辑:我注意到从 GetPointAngle() 返回的值(角度)当 p时增加离另一点越远 c (反之亦然),即使 TPoint ( p ) 沿第二个 TPoint ( c ) 的 X 轴拖动。

编辑 :

你们已经超越了自我,我看了大部分答案,似乎很难选择最佳答案!既然你们写了这么详细的所有内容,我将用相同的细节来处理所有内容:-)

另外:我在最初的帖子中没有分享的是,我的函数正在作为 DLL 导出,以便从另一个 pascal 解释器(与 delphi 兼容)访问。

终于解决了 (更改):
GetPointAngle(P1, P2: TPoint)至: GetPointAngle(const P1, P2: TPoint)
^ 我不明白声明常量的必要性......

最佳答案

我假设您要计算相对于这两点之间形成的线的 X 轴的角度。

enter image description here

对于这种情况,以下公式适用:

Tan(a) = (P2.Y - P1.Y) / (P2.X - P1.X)

翻译成:
a = ArcTan((P2.Y - P1.Y) / (P2.X - P1.X))

当两个点具有相同的 X 坐标时,这显然会导致 EDivByZero异常(exception),所以你必须自己处理。此外, ArcTan导致角度在 0°..90°(即 0..π/2)范围内,因此忽略了正确的象限,而 ArcTan2产生 -180°...180° 范围内的角度。将 360° 添加到结果中以将负角转换为正角:
function AngleOfLine(const P1, P2: TPoint): Double;
begin
if P2.X = P1.X then
if P2.Y > P1.Y then
Result := 90
else
Result := 270
else
Result := RadToDeg(ArcTan2(P2.Y - P1.Y, P2.X - P1.X));
if Result < 0 then
Result := Result + 360;
end;

结果是:
  A := AngleOfLine(Point(10, 10), Point(20, 10)); // 0
A := AngleOfLine(Point(10, 10), Point(20, 20)); // 45
A := AngleOfLine(Point(10, 10), Point(10, 20)); // 90
A := AngleOfLine(Point(10, 10), Point(0, 20)); // 135
A := AngleOfLine(Point(10, 10), Point(0, 10)); // 180
A := AngleOfLine(Point(10, 10), Point(0, 0)); // 225
A := AngleOfLine(Point(10, 10), Point(10, 0)); // 270
A := AngleOfLine(Point(10, 10), Point(20, 0)); // 315

现在,这是相对于默认情况下其正 Y 轴指向上方的世界坐标系。如果要将结果转换为正 Y 轴向下的设备坐标系,则从 360° 中减去结果:
Result := 360 - Result;

更新:

好像 ArcTan2确实会被零除,(即使在 D7 中,尽管有文档),所以例程变得更简单:
function AngleOfLine(const P1, P2: TPoint): Double;
begin
Result := RadToDeg(ArcTan2((P2.Y - P1.Y),(P2.X - P1.X)));
if Result < 0 then
Result := Result + 360;
end;

编辑:

I noted that the value returned from GetPointAngle() increases when p gets furter away from the other point c (and vice versa).



那要看。查看上图,如果第二个点沿 x 轴进一步移动,则角度会减小。如果第二个点沿 y 轴进一步移动,则角度会增加。当然,这取决于两个点在哪个象限。

此外,您的代码否定了 ArcTan2 的第一个参数并从结果中减去另一个 90°。我不知道你的意思是什么以及它是否是故意的,但这可能是意外结果的根源。

关于delphi - 两个向量之间的角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15596217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com