Files
linear_math_note/transform/rotate.py
2025-07-10 15:58:14 +08:00

42 lines
949 B
Python

import math
from trans import linear_trans
def rotate_point(p1:list[float],p2:list[float],dgr:float) -> list[float]:
'''
Rotate p1 with p2 for dgr.
dgr measured in radians.
'''
arr = [
[math.cos(dgr),-math.sin(dgr)],
[math.sin(dgr), math.cos(dgr)]
]
vec = [p1[0]-p2[0],p1[1]-p2[1]]
rvec = linear_trans(arr,vec)
return [p2[0]+rvec[0], p2[1]+rvec[1]]
def rotate_line(line,p,dgr):
'''
Rotate y=kx+b with p for dgr.
dgr measured in radians.
@param line:
tuple[k, b] => y = kx + b
'''
k,b = line
arr = [
[math.cos(dgr),-math.sin(dgr)],
[math.sin(dgr), math.cos(dgr)]
]
vec = [1, k]
rvec = linear_trans(arr,vec)
rk = rvec[1]/rvec[0] # (a,b) => (1,b/a)
p1 = [0,b]
rp1 = rotate_point(p1,p,dgr)
return [rk,rp1[1]-rk*rp1[0]]
if __name__ == "__main__":
print(rotate_line((3,4),(2,1),math.pi/4))