/
rotate.pyde
79 lines (70 loc) · 1.83 KB
/
rotate.pyde
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
from __future__ import division
class Circle:
def __init__(self, x, y, radius):
self.x = x
self.y = y
self.vx = 0
self.vy = 0
self.a = 0
self.va = 0
self.ax = 0
self.ay = 0
self.aa = 0
self.da = 0.99
self.dx = 0.99
self.dy = 0.99
self.radius = radius
def draw(self):
fill(0)
noStroke()
ellipse(self.x, self.y, self.radius*2, self.radius*2)
stroke(255)
line(self.x, self.y,
self.x + self.radius*cos(self.a),
self.y + self.radius*sin(self.a))
def apply_force(self, fx, fy, d):
self.ax = fx
self.ay = fy
self.aa = sqrt(fx**2 + fy**2) * d / (0.5 * self.radius**2)
def update(self):
self.vx += self.ax
self.vy += self.ay
self.va += self.aa
self.x += self.vx
self.y += self.vy
self.a += self.va
self.va *= self.da
self.vx *= self.dx
self.vy *= self.dy
self.ax = 0
self.ay = 0
self.aa = 0
c = Circle(400, 400, 20)
def setup():
size(800, 800)
stage = 0
def draw():
background(255)
c.draw()
stroke(255, 0, 0)
global px, py, stage, fx, fy
if stage == 0:
dd = dist(c.x, c.y, mouseX, mouseY)
dx = (mouseX - c.x)/dd
dy = (mouseY - c.y)/dd
px = c.radius*dx
py = c.radius*dy
elif stage == 1:
dd = dist(px, py, mouseX, mouseY)
fx = -(mouseX - c.x - px)/dd
fy = -(mouseY - c.y - py)/dd
elif stage == 2:
ca = (fx*px + fy*py)/c.radius
sa = sqrt(1 - ca**2)
c.apply_force(10*fx, 10*fy, c.radius*sa)
stage = 0
line(c.x + px, c.y + py, mouseX, mouseY)
c.update()
def mousePressed():
global stage
stage += 1