2015-12-19 255 views
10

ポイントを(2dで)持っていた場合、その点を他の点(原点)を中心に度数でどのように回転させることができますか?pythonで別の点を中心に点を回転

たとえば、原点の周りの最初の点を10度傾けることができます。

基本的に1点のPointAと、それが回転する原点があります。以下rotate関数は通常軸規則と、デカルト平面に、origin周りの角度angle(ラジアン反時計回り)によってポイントpointの回転を行う

PointA=(200,300) 
origin=(100,100) 

NewPointA=rotate(origin,PointA,10) #The rotate function rotates it by 10 degrees 
+2

これはC++ですが、まったく同じ問題です。https://stackoverflow.com/questions/2259476/rotating-a-point-about-another-point-2d – CoryKramer

+1

コードを表示してください。 Pythonでは 'point 'の定義はないので、明確にする必要があります。 – iled

+2

回転は1行のコードです。しかし:2Dまたは3D、ポイントの定義方法、回転角度(3Dの場合)などを定義する方法は?これは最初から書き込むと、あなたのユースケースにはまったく合致しないボイラープレートがたくさんあります。 – tom10

答えて

21

: コードは次のように見ることができます: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を使用してラジアンに変換することができます。時計回りの場合は、角度を無効にします。

例:10度の角度で(2, 2)反時計回りの原点を中心点(3, 4)回転:

>>> 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です。私はそれを必要に応じて除外するためにあなたに任せます。

+0

これは素晴らしい解決策です。 Y軸の方向を入れ替える場合(yが垂直方向に下に向かって増加する場合)、これで何が変わるでしょうか?ありがとうございました。 – sosukeinu

+0

あなたのものは私のために働いた唯一の解決策であり、数日間何度も試してきました。あなたは男です – Dantalian

関連する問題