我实施这个角度计算公式出了什么问题?

时间:2017-08-24 03:24:51

标签: algorithm autohotkey trigonometry

所以我需要弄清楚两点之间的角度,这应该是微不足道的。我在SO上发现了至少5个不同的问题。但是当我尝试多种算法时,我得到了错误的结果,所以我将展示我的设置:

首先,这部分不应该有问题,但无论如何我会将其列出来,因为它是过程的一部分,可能是错误的来源,但基本上我正在生成0到360之间的度数列表,作为屏幕中心周围圆圈中像素坐标的关键:

getRadialPixels(){
    centerX := 960
    centerY := 540
    distance := 250
    pixels := []
    loop, 360
    {
        Fi := A_Index * 3.14159265359 / 180
        x := Round(centerX + distance * Cos(Fi))
        y := Round(centerY + distance * Sin(Fi))
        realDegree := A_Index + 90
        if (realDegree > 360)
        {
            realDegree := realDegree - 360
        }
        pixels[realDegree] := {}
        pixels[realDegree]["x"] := x
        pixels[realDegree]["y"] := y
        ;FileAppend, % "Added coordinate [" . x . ", " . y . "] to radial list for degree " . realDegree . ".`n", Log.txt
    }
    return pixels
}

你会看到我正在为每个键添加90度,然后将其标准化为360度限制,因为基本上我希望0度位于顶部[0,1],90度位于右侧[1,0]等等,加上90度似乎达到了。我从其他地方得到了公式,但我测试了这个,我认为是对的。我不认为代码是问题,但它就是以防万一。

计算两点之间角度的实际公式如下:

getAngleBetweenPoints(x1, y1, x2, y2){
    angle := floor(atan2(y2 - y1, x2 - x1) * 180 / 3.14159265359)
    if (angle > 359) {
        angle := angle - 360
    }
    if (angle < 0) {
        angle := 360 - abs(angle)
    }
    return angle
}

我也尝试过:

angle := ceil((ACos((x1 * x2 + y1 * y2) / (Sqrt(x1**2 + y1**2) * Sqrt(x2**2 + y2**2))) * 57.2957795) * 180 / 3.14159265359)

作为旁注,我不得不将atan2添加到AHK,因为它本身不受支持:

atan2(x,y) {    ; 4-quadrant atan
   Return dllcall("msvcrt\atan2","Double",y, "Double",x, "CDECL Double")
}

但两个版本似乎都得到了不正确的结果。到目前为止。我做错了什么?

试验:

originX := 0
originY := 0

x1 := 0
y1 := 1

x2 := 1
y2 := 0

x3 := 0
y3 := -1

x4 := -1
y4 := 0

x5 := 1
y5 := 1

x6 := 1
y6 := -1

x7 := -1
y7 := -1

x8 := -1
y8 := 1

result1 := getAngleBetweenPoints(originX,originY,x1,y1) ; 0 deg
result2 := getAngleBetweenPoints(originX,originY,x2,y2) ; 89 deg
result3 := getAngleBetweenPoints(originX,originY,x3,y3) ; 179 deg
result4 := getAngleBetweenPoints(originX,originY,x4,y4) ; 270 deg
result5 := getAngleBetweenPoints(originX,originY,x5,y5) ; 44 deg
result6 := getAngleBetweenPoints(originX,originY,x6,y6) ; 134 deg
result7 := getAngleBetweenPoints(originX,originY,x7,y7) ; 225 deg
result8 := getAngleBetweenPoints(originX,originY,x8,y8) ; 315 deg

1 个答案:

答案 0 :(得分:1)

你在atan2的定义中交换了x和y,它应该是y,然后是x:

atan2(y,x) {    ; 4-quadrant atan
   Return dllcall("msvcrt\atan2","Double",y, "Double",x, "CDECL Double")
}
相关问题