私は入りませんが、お互いに本質的に逆の2つの関数が必要です。Pythonを使用して、時計回り/反時計回りの方向に、与えられたピクセル座標を返します(逆も同様)。
angle_to()
は(p1
が回転の中心である。すなわち)clockhandがp2
にp1
を結ぶ線に対して0°から移動する回転しなければならない度の数を返す必要があり、どこp1
とp2
両方がピクセル座標であります。
point_pos()
は、時計ハンドの長さがamplitude
であるピクセル座標をangle
に戻す必要があります。
正のx軸= 0°= 3時、引数rotation
は、時計回りまたは反時計回りのいずれかで計算が開始される前にその軸をシフトする必要があります。この計算はこの調整された基準で同じ方向に動くべきである。
それぞれの進捗状況を以下に示します。
時計回り= Falseの場合、時計回りの条件の正解を返します。 clockwise = Trueの場合、angle_between()は丸め誤差の正解を返し、point_pos()は私に間違った答えを与えます。
私はイラストレーターでこれを解決できないためにインターネットに謝罪し、私が求めていることがはっきりしない場合には、私はイラストレーターで嘲笑した視覚的説明を添付しました。
編集:以下の1つの答えに従って不必要に複雑な行をクリーンアップしました。
from math import sin, cos, radians, pi, atan2, degrees
def angle_to(p1, p2, rotation=0, clockwise=False):
if abs(rotation) > 360:
rotation %= 360
p2 = list(p2)
p2[0] = p2[0] - p1[0]
p2[1] = p2[1] - p1[1]
angle = degrees(atan2(p2[1], p2[0]))
if clockwise:
angle -= rotation
return angle if angle > 0 else angle + 360
else:
angle = (360 - angle if angle > 0 else -1 * angle) - rotation
return angle if angle > 0 else angle + 360
def point_pos(origin, amplitude, angle, rotation=0, clockwise=False):
if abs(rotation) > 360:
rotation %= 360
if clockwise:
rotation *= -1
if clockwise:
angle -= rotation
angle = angle if angle > 0 else angle + 360
else:
angle = (360 - angle if angle > 0 else -1 * angle) - rotation
angle = angle if angle > 0 else angle + 360
theta_rad = radians(angle)
return int(origin[0] + amplitude * cos(theta_rad)), int(origin[1] + amplitude * sin(theta_rad))
編集#2:私は終わり、私はそれを修正しようとしたとき
angle_to()
は(時計回りを反転し、反時計回りにされています。要求に応じは、ここでいくつかの出力に失敗します時計回りの方向で、回転して異なる方向に計算する。
>>> print angle_to((100,100), (25,25)) # should be 225
135.0
>>> print angle_to((100,100), (25,25), 45) # should be 180
90.0
>>> print angle_to((100,100), (25,25), clockwise=True) # should be 135
225.0
>>> print angle_to((100,100), (25,25), 45, clockwise=True) # should be 90
180.0
point_pos()
が反時計回りにちょうど間違っている
# dunno what these should be (i'm bad at trig) but when I visually place the
# given p1 and the output p2 on screen it's obvious that they're wrong
>>> print point_pos((100,100), 75, 225)
(46, 153)
>>> print point_pos((100,100), 75, 225, 45)
(100, 175)
# these are basically correct, rounding-errors notwithstanding
>>> print point_pos((100,100), 75, 225, clockwise=True)
(46, 46)
>>> print point_pos((100,100), 75, 225, 45, clockwise=True)
(99, 25)
コードの問題点を教えてください。 –
第3段落。時計回り/反時計回りの状態を正しく処理していません。 'clockwise = False'のときは、時計回りの条件に対する正解を返します。 'clockwise = True'のとき、' angle_between() 'は丸め誤差の正解を返し、' point_pos() 'は私に間違った答えを与えます。 – Jonline
入力の例と期待される結果(例えば、90度の回転)を与えることができますか? –