2017-02-11 34 views
2

問題:マウス入力をポイントとして円形パスに沿ってポイントを移動します。マウスの動き(python/pygame)を経由して円軌道に沿ってポイントを移動する

点を円軌道に沿って移動するには、center + math.sin || cos(angle)* radius方程式を使用して角度を増やす方法がたくさんあります。ただし、これはマウス入力では機能しません。元のx/y値の一部であってもラジアンに変換された場合、「円」は一定の半径を持たず、パスポイントはマウスの位置と奇妙な関係で移動します。

パスポイント(円周上の点)を原点から特定の距離(強制半径)に制限する必要があるということです。私はまた、yのいずれかがxまたはxの関数である必要があるという感情をyの関数にする必要があります。

私は、距離の公式を使ってパスの点から円の中心までの距離を調べる道を踏み出しました。その考えは、xとyの値を許容距離 - 真の距離だけ「スナップ」することでしたが、それは...うまくいかなかったのです。すなわち、2点間の距離と2点間の差に違いがあるからです(どのようにを理解するのは、2点の違いによってベクトルが得られるということです)。とにかく、もっと簡単な解決策があると確信しています。

rotating arm guided by a mouse、マウスのX、Y円の原点であり、x、y座標を使用することができ

答えて

0

になります。三角関数の必要はありません。 あなたは、中心までの距離を計算することによって、良い道を歩いていました。 円の中心からマウスの位置までのベクトルを想像してください。 ポイントはこのベクトルとして同じ方向の のどこかにある必要があります。つまり、 という位置を単純な0​​で計算することができます。おかげで@マーク

from __future__ import division # For Python 2.7 
import pygame 

pygame.init() 
screen = pygame.display.set_mode((400, 400)) 

CENTER = (200, 200) 
RADIUS = 100 

satelliteCenter = (CENTER[0]+RADIUS, CENTER[1]) 

running = True 
while running: 
    for event in pygame.event.get(): 
    if event.type == pygame.QUIT: running = False 

    mouse = pygame.mouse.get_pos() 
    vector = (mouse[0]-CENTER[0], mouse[1]-CENTER[1]) 
    distance = (vector[0]**2 + vector[1]**2)**0.5 

    if distance > 0: 
    scalar = RADIUS/distance 
    satelliteCenter = (
     int(round(CENTER[0] + vector[0]*scalar)), 
     int(round(CENTER[1] + vector[1]*scalar))) 

    screen.fill((152,206,231)) 
    pygame.draw.circle(screen, (71,153,192), CENTER, RADIUS) 
    pygame.draw.circle(screen, (243,79,79), satelliteCenter, 16) 
    pygame.display.update() 
+0

:残っている唯一のものは、マウスの距離や円半径との割合 あるスカラーを計算する です!三角関数は、ゼロ除算エラーを発生させました。これはおそらく、mousexとmouseyのすべての値が1に設定されている円の中心の周りに障壁を作ることでうまくいく可能性があります。私も感受性に遭遇しました - マウスを動かすと、これを改善するために方程式に角速度を含める方法がないのだろうかと思います。 @Meyer、これは素晴らしいです!ベクトルタプルの内部にある要素は何ですか? (名前があれば) –

+0

また、トピックではなく、CENTER [0] + vector [0] * scalarはcenter + cos(theta)* radiusと同じ形式になっています。好奇心。 –

+0

私は要素をベクトル座標またはベクトル成分として知っています。 ゼロ除算に関しては、私もそれを忘れて、 を忘れて、それに応じてコードを修正しました。 'satelliteCenter'は距離がゼロでないときにのみ更新されることに注意してください。はい、ベクトル間の角度の余弦との関係は、 たとえば[ベクトル投影](https://en.wikipedia.org/wiki/Vector_projection)のWikipediaの記事を参照してください。 – Meyer

0

(説明のために、回転アームを中心とするふり...みましょう) tan((y_mouse-y_circle)/(x_mouse-x_circle))を使用してマウスと円の間の角度を計算すると、点の位置は(x_circle + r * cos(angle), y_circle + r * sin(angle))

関連する問題