线性变换
This commit is contained in:
42
transform/rotate.py
Normal file
42
transform/rotate.py
Normal file
@ -0,0 +1,42 @@
|
||||
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))
|
Reference in New Issue
Block a user