所以在这种情况下,
C
不相关,你想要的是旋转向量
BA
围绕
B
顺时针旋转30度。看见
here
怎么做,你不需要
atan
函数,它的数值精度很差。
这是代码,输入点
a
和
b
,返回旋转的点
a'
:
function rotate(a, b)
local ba_x = a.x - b.x
local ba_y = a.y - b.y
local x = (math.sqrt(3) * ba_x + ba_y)/2
local y = (-ba_x + math.sqrt(3) * ba_y)/2
local ap = {}
ap.x = b.x + x
ap.y = b.y + y
return ap
end
编辑
function cross(v1, v2)
return v1.x*v2.y - v2.x*v1.y
end
function make_vec(a, b)
local r = {}
r.x = b.x - a.x
r.y = b.y - a.y
return r
end
function rotate(a, b, c)
local ba_x = a.x - b.x
local ba_y = a.y - b.y
local x, y
if cross(make_vec(b, c), make_vec(b, a)) > 0 then
x = (math.sqrt(3) * ba_x + ba_y)/2
y = (-ba_x + math.sqrt(3) * ba_y)/2
else
x = (math.sqrt(3) * ba_x - ba_y)/2
y = (ba_x + math.sqrt(3) * ba_y)/2
end
local ap = {}
ap.x = b.x + x
ap.y = b.y + y
return ap
end