web-dev-qa-db-ja.com

度単位で別の点を中心に点を回転python

ポイントがある場合(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
26
user2592835

次の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 - oxpy - oyと同様に2回計算されます。必要に応じて、それを考慮に入れます。

49
Mark Dickinson
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]
4
Gabriel Eng