42 lines
949 B
Python
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)) |