ポイントがある場合(2d)、Pythonで他のポイント(Origin)を中心にそのポイントをどのように回転させることができますか?
たとえば、原点の周りの最初のポイントを10度傾けることができます。
基本的に、1つのポイントPointAとそれが回転する原点があります。コードは次のようになります。
PointA=(200,300)
Origin=(100,100)
NewPointA=rotate(Origin,PointA,10) #The rotate function rotates it by 10 degrees
次のrotate
関数は、デカルト平面でpoint
を中心に角度angle
(反時計回り、ラジアン)でポイントOrigin
の回転を実行します。通常の軸の規則:xは左から右に増加し、yは垂直に上に増加します。すべてのポイントは、(x_coord, y_coord)
という形式の長さ2のタプルとして表されます。
import math
def rotate(Origin, point, angle):
"""
Rotate a point counterclockwise by a given angle around a given Origin.
The angle should be given in radians.
"""
ox, oy = Origin
px, py = point
qx = ox + math.cos(angle) * (px - ox) - math.sin(angle) * (py - oy)
qy = oy + math.sin(angle) * (px - ox) + math.cos(angle) * (py - oy)
return qx, qy
角度が度単位で指定されている場合、math.radians
を使用して最初に角度をラジアンに変換できます。時計回りに回転するには、角度を無効にします。
例:(3, 4)
の原点を中心に(2, 2)
を反時計回りに10度回転させる:
>>> point = (3, 4)
>>> Origin = (2, 2)
>>> rotate(Origin, point, math.radians(10))
(2.6375113976783475, 4.143263683691346)
rotate
関数には明らかな繰り返し計算がいくつかあることに注意してください。math.cos(angle)
とmath.sin(angle)
はそれぞれpx - ox
とpy - oy
と同様に2回計算されます。必要に応じて、それを考慮に入れます。
import math
def rotate(x,y,xo,yo,theta): #rotate x,y around xo,yo by theta (rad)
xr=math.cos(theta)*(x-xo)-math.sin(theta)*(y-yo) + xo
yr=math.sin(theta)*(x-xo)+math.cos(theta)*(y-yo) + yo
return [xr,yr]