你的直线方程
x * A + y * B + C = 0
Run Code Online (Sandbox Code Playgroud)
可以以正常形式表示为
x * Cos(Theta) + y * Sin(Theta) - p = 0
Run Code Online (Sandbox Code Playgroud)
在哪里
Theta = ArcTan(B/A)
- OX 轴与法式坐标原点到直线之间的角度
p = -C/Sqrt(A^2 + B^2)-
从原点到线的距离(正常长度)。
如果要将直线相对于坐标原点 (0,0) 旋转角度 Alpha,只需创建新方程(注意相同的 p 值): Beta = Theta + Alpha
x * Cos(Beta) + y * Sin(Beta) - p = 0
Run Code Online (Sandbox Code Playgroud)
如果要绕任意点 (x0, y0) 旋转直线:从该点到直线的法向距离为
d = x0 * Cos(Theta) + y0 * Sin(Theta) - p
Run Code Online (Sandbox Code Playgroud)
新方程将
x * Cos(Beta) + y * Sin(Beta) - pnew = 0
Run Code Online (Sandbox Code Playgroud)
并保持正常距离:
d = x0 * Cos(Beta) + y0 * Sin(Beta) - pnew
Run Code Online (Sandbox Code Playgroud)
所以
pnew = p + x0 * (Cos(Beta)-Cos(Theta)) + y0 * (Sin(Beta)-Sin(Theta))
Run Code Online (Sandbox Code Playgroud)