所以我需要弄清楚两点之间的角度,这应该是微不足道的。我在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
答案 0 :(得分:1)
你在atan2
的定义中交换了x和y,它应该是y,然后是x:
atan2(y,x) { ; 4-quadrant atan
Return dllcall("msvcrt\atan2","Double",y, "Double",x, "CDECL Double")
}