2014-10-30 4 views
0

저는 젤리 그래픽을 사용하여 파이썬에서 간단한 룰렛 프로그램을 만들고 있습니다. 나는 아래의 코드를 가지고 있으며, 두 개의 원 (트랙) 사이에서 공을 움직이려고 시도하고있다. 그렇게 할 방법이 있습니까? 내 생각은 .0 초 두 번째 시간 간격 (time.sleep (.10))으로 다시 뽑아서 (ball.undraw()) 다시 그리는 것이지만 수학적으로 어떻게 할 것인지 모르므로 트랙을 따라 이동합니다. . 그래픽에서Zelle 그래픽 애니메이션

가져 * 데프 주() : 승리 = GraphWin()

Circle1 = Circle(Point(100,100),95) #Makes the first Circle 
Circle1.draw(win) 

Circle2 = Circle(Point(100,100),80) #Makes the second Circle 
Circle2.draw(win) 

Ball = Circle(Point(100,12),5) #Makes the ball Circle 
Ball.draw(win) 

win.getMouse() 
win.close() 

주()

+0

질문 본문 내에서 서식을 수정하고 코드 블록을 즉시 둘러 쌀 수 있습니까? – BlackVegetable

답변

2

당신이 찾고있는 방법은 이동 (DX, DY)입니다.

볼을 움직여야하는 각 방향의 거리를 계산하려면 볼의 새 위치를 찾아야합니다. 이 위치의 x 및 y 좌표는 볼을 휠의 중심에 연결하는 선의 각도의 사인 및 코사인 (수학 라이브러리에서 호출 됨)과 상호 관련됩니다.

x = radius*sin(angle) 
y = radius*cos(angle) 

참고 : 그것은 당신이 원의 중심은 0,0되도록 (-100, -100,100,100)로 좌표를 설정하면 계산하기 쉽게 만들 것입니다.

이제 공의 새 위치를 얻었으므로 각 방향으로 이동하는 거리가 최종 위치 인 초기 위치가됩니다.

Ball.move(x - Ball.getCenter().getX(), y - Ball.getCenter().getY()) 

반복적으로 던져서 각도를 일정하게 누적하면 공이 반경을 따라 꾸준히 움직입니다.

angle = 0 
radius = 87 
while angle < 360: 
    x = radius*sin(angle) 
    y = radius*cos(angle) 
    Ball.move(x - Ball.getCenter().getX(), y - Ball.getCenter().getY()) 
    angle += 0.01 

참고 : 각도 라이브러리의 기본 각도 단위는 라디안이므로 각도 = 360은 1 회전을 의미하지 않습니다. 알아야 할 사항은 1 회전 = 2 * pi 또는 약 6.28입니다.

원하는 속도로 이동하려면 루프에서 time.sleep()을 사용하여 속도를 줄이십시오.