Skip to content

Commit 266a760

Browse files
committed
- Fix use of id in *formula* sketch (change to index).
- Change to `+=` syntax in *Number_003_A_Ngan*'s `circle.py`. - First works-as-expected commit for *Number_003_B_Ngan*.
1 parent 8d10608 commit 266a760

File tree

6 files changed

+172
-210
lines changed

6 files changed

+172
-210
lines changed

Whitney Artport - (Software) Structures/#003/A/Interpretation/Number_003_A_Ngan/circle.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ def intersect(self, other):
9696
return True
9797

9898
def repel(self, angle):
99-
self.x = self.x + cos(angle) / 4
100-
self.y = self.y + sin(angle) / 4
99+
self.x += cos(angle) / 4
100+
self.y += sin(angle) / 4
101101

102102
def renderHair(self):
103103
for hair in self.hairs:

Whitney Artport - (Software) Structures/#003/B/Interpretation/Number_003_B_Ngan/Number_003_B_Ngan.pde

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515

1616
float[][] field;
17-
int[][] fieldShade;
17+
// int[][] fieldShade;
1818
int gaph, gapv;
1919
int marginh, marginv; // margin
2020
float cnt = 0;
@@ -34,7 +34,7 @@ int cTimer = 0;
3434
void setup()
3535
{
3636
size( 500, 500 );
37-
frameRate( 30 );
37+
// frameRate( 30 );
3838

3939
gaph = 3;
4040
gapv = 3;
@@ -52,19 +52,19 @@ void setup()
5252

5353
// field
5454
field = new float[(width-marginh*2)/gaph][(height-marginv*2)/gapv];
55-
fieldShade = new int[field.length][field[0].length];
55+
// fieldShade = new int[field.length][field[0].length];
5656

5757
for (int i=0; i<field.length; i++) {
5858
for (int k=0; k<field[0].length; k++) {
5959
field[i][k] = PI2-PI/3;
60-
fieldShade[i][k] = 1;
60+
// fieldShade[i][k] = 1;
6161
}
6262
}
6363

6464
circles = new Circle[100];
6565

66-
ellipseMode( CENTER );
67-
noFill();
66+
// ellipseMode( CENTER );
67+
// noFill();
6868
}
6969

7070
void draw()
@@ -90,11 +90,11 @@ void draw()
9090
}
9191
}
9292

93-
noStroke();
94-
noFill();
93+
// noStroke();
94+
// noFill();
9595

9696
for (int i =0; i<cCounter; i++) {
97-
circles[i].render();
97+
circles[i].move();
9898
circles[i].getGrid();
9999
}
100100

@@ -158,7 +158,7 @@ class Circle
158158
}
159159

160160
void move() {
161-
float angle = sin( sp1 ) - cos(sp2);
161+
float angle = getSin( sp1 ) - getCos(sp2);
162162

163163
sp1+=ac1;
164164
sp2+=ac2;
@@ -182,8 +182,8 @@ class Circle
182182
}
183183

184184
void repel( float angle ) {
185-
x = x + getCos(angle)/10;
186-
y = y + getSin(angle)/10;
185+
x = x + getCos(angle)*0.1;
186+
y = y + getSin(angle)*0.1;
187187
}
188188

189189
void setState( float px, float py ) {
@@ -199,7 +199,7 @@ class Circle
199199
float dx = circles[i].x - x;
200200
float dy = circles[i].y - y;
201201
float drr = dx*dx + dy*dy;
202-
float brr = circles[i].rr + 2*circles[i].r*r + rr;
202+
// float brr = circles[i].rr + 2*circles[i].r*r + rr;
203203
float d = sqrt( drr );
204204

205205
if ( d>r+circles[i].r || d<abs(r-circles[i].r) ) continue; // no solution
@@ -228,22 +228,22 @@ class Circle
228228
int numy = (int)floor(d/gapv);
229229

230230
int[] pos;
231-
float dx, dy, ang;
231+
// float dx, dy, ang;
232232

233233
for (int i=sx; i<sx+numx; i++) {
234234
if (i>=0 && i<field.length) {
235235
for (int k=sy; k<sy+numy; k++) {
236236
if (k>=0 && k<field[0].length) {
237237
if (over) {
238238
pos = getLocation(i, k);
239-
dx = pos[0]-x;
240-
dy = pos[1]-y;
239+
// dx = pos[0]-x;
240+
// dy = pos[1]-y;
241241

242242
if (dist( x, y, pos[0], pos[1]) < r) {
243243
float da = atan2( pos[1]-iny, pos[0]-inx );
244244
if (field[i][k] < da) field[i][k] += PI/20;
245245
else if (field[i][k] > da) field[i][k] -= PI/20;
246-
fieldShade[i][k] = 2;
246+
// fieldShade[i][k] = 2;
247247
}
248248
}
249249
}

Whitney Artport - (Software) Structures/#003/B/Interpretation/Number_003_B_Ngan/Number_003_B_Ngan.pyde

Lines changed: 20 additions & 189 deletions
Original file line numberDiff line numberDiff line change
@@ -11,203 +11,34 @@ Processing v.68 <http://processing.org>
1111
1212
Port to Processing.py/Processing 2.0 by Ben Alkov 5 September 2014
1313
'''
14+
from circle import Circle
15+
from grid import Grid
1416

15-
field
16-
fieldShade
17-
gaph
18-
gapv
19-
marginh, marginv # margin
20-
cnt = 0
21-
sintable = 628
22-
costable = 628
23-
PI2 = 2 * PI
24-
tiltAngle = 0
25-
circles = Circle[]
17+
18+
grid = None
19+
NumCircles = 10
20+
circles = []
2621
counter = 0
27-
cCounter = 0
28-
cTimer = 0
22+
CirclePosition = 250
23+
Radius = 40
2924

3025

3126
def setup():
27+
global grid
3228
size(500, 500)
33-
frameRate(30)
34-
gaph = 3
35-
gapv = 3
36-
marginh = 20
37-
marginv = 20
38-
39-
# lookup table
40-
for i = 0 in range( i < sintable.length): # i++
41-
sintable[i] = sin(i / 100.0)
42-
for i = 0 in range( i < costable.length): # i++
43-
costable[i] = cos(i / 100.0)
44-
45-
# field
46-
field = (width - marginh * 2) / gaph][(height - marginv * 2) / gapv]
47-
fieldShade = field.length][field[0].length]
48-
for i = 0 in range( i < field.length): # i++
49-
for k = 0 in range( k < field[0].length): # k++
50-
field[i][k] = PI2 - PI / 3
51-
fieldShade[i][k] = 1
52-
circles = Circle[100]
53-
ellipseMode(CENTER)
54-
noFill()
29+
# Init here because of sketch `width` & `height` being undefined prior to
30+
# this point.
31+
grid = Grid(TAU - PI / 3, 20, 3)
5532

5633

5734
def draw():
35+
global counter
5836
background(50)
5937
stroke(255, 255, 255, 50)
60-
ax, ay
61-
cTimer++
62-
if cTimer > 5 and cCounter < circles.length - 1:
63-
circles[cCounter] = Circle(250, 250, 40, cCounter)
64-
cCounter++
65-
cTimer = 0
66-
len = 10
67-
for i = 0 in range( i < field.length): # i++
68-
for k = 0 in range( k < field[0].length): # k++
69-
ax = marginh + i * gaph
70-
ay = marginv + k * gapv
71-
line(ax, ay, ax + len * getCos(field[i][k]), ay + len * getSin(field[i][k]))
72-
noStroke()
73-
noFill()
74-
for i =0 in range( i < cCounter): # i++
75-
circles[i].render()
76-
circles[i].getGrid()
77-
78-
79-
def getLocation(i, k):
80-
return marginh + i*gaph, marginv + k*gapv
81-
82-
83-
def getSin(val):
84-
if val < 0:
85-
val = 6.28 + val
86-
if val >= 6.28:
87-
val -= 6.28
88-
val = min(6.27, max(0, val))
89-
return sintable[floor(val * 100)]
90-
91-
92-
def getCos(val):
93-
if val < 0:
94-
val = 6.28 + val
95-
if val >= 6.28:
96-
val -= 6.28
97-
val = min(6.27, max(0, val))
98-
return costable[floor(val * 100)]
99-
100-
101-
class Circle(object):
102-
x
103-
y
104-
r
105-
d
106-
rr
107-
ac1
108-
ac2
109-
ac3
110-
sp1
111-
sp2
112-
sp3
113-
id
114-
inx = 0
115-
iny = 0
116-
over = True
117-
118-
def __init__(self, px, py, pr, id):
119-
x = px
120-
y = py
121-
r = pr
122-
d = r * 2
123-
rr = r * r
124-
this.id = id
125-
sp1 = random(2)
126-
sp2 = random(2)
127-
sp3 = random(2)
128-
ac1 = random(0.5) - random(0.5)
129-
ac2 = random(0.5) - random(0.5)
130-
ac3 = random(0.5) - random(0.5)
131-
132-
133-
def render(self):
134-
move()
135-
ellipse(x, y, d, d)
136-
137-
138-
def move(self):
139-
angle = sin(sp1) - cos(sp2)
140-
sp1 += ac1
141-
sp2 += ac2
142-
sp3 += ac3
143-
angle = (angle < 0) ? angle + PI2: ((angle >= PI2) ? angle - PI2: angle)
144-
x = x + getSin(angle)
145-
y = y + getCos(angle)
146-
checkBounds()
147-
checkOverlap()
148-
149-
def checkBounds(self):
150-
if x > width:
151-
x = 0
152-
if x < 0:
153-
x = width
154-
if y > height:
155-
y = 0
156-
if y < 0:
157-
y = height
158-
159-
160-
def repel(self, angle):
161-
x = x + getCos(angle) / 10
162-
y = y + getSin(angle) / 10
163-
164-
165-
def setState(self, px, py):
166-
inx = px
167-
iny = py
168-
over = True
169-
170-
171-
def checkOverlap(self):
172-
for i = id + 1 in range( i < cCounter): # i++
173-
if i != id:
174-
dx = circles[i].x - x
175-
dy = circles[i].y - y
176-
drr = dx * dx + dy * dy
177-
brr = circles[i].rr + 2 * circles[i].r * r + rr
178-
d = sqrt(drr)
179-
if d > r + circles[i].r or d < abs(r - circles[i].r):
180-
continue # no solution
181-
ang = atan2(dy, dx)
182-
repel(ang + PI)
183-
circles[i].repel(ang)
184-
a = (rr - circles[i].rr + drr) / (2 * d)
185-
h = sqrt(rr - a * a)
186-
x2 = x + a * (circles[i].x - x) / d
187-
y2 = y + a * (circles[i].y - y) / d
188-
setState(x2, y2)
189-
circles[i].setState(x2, y2)
190-
191-
192-
def getGrid(self):
193-
sx = ceil((x - r - marginh) / gaph)
194-
sy = ceil((y - r - marginv) / gapv)
195-
numx = floor(d / gaph)
196-
numy = floor(d / gapv)
197-
pos
198-
dx, dy, ang
199-
for i = sx in range( i < sx + numx): # i++
200-
if i >= 0 and i < field.length:
201-
for k = sy in range( k < sy + numy): # k++
202-
if k >= 0 and k < field[0].length:
203-
if over:
204-
pos = getLocation(i, k)
205-
dx = pos[0] - x
206-
dy = pos[1] - y
207-
if dist(x, y, pos[0], pos[1]) < r:
208-
da = atan2(pos[1] - iny, pos[0] - inx)
209-
if field[i][k] < da:
210-
field[i][k] += PI / 20
211-
elif field[i][k] > da:
212-
fieldShade[i][k] = 2
213-
over = False
38+
if frameCount % 5 == 0 and counter < NumCircles:
39+
circles.append(Circle(CirclePosition, CirclePosition, Radius, counter))
40+
counter += 1
41+
grid.update()
42+
for circle in circles:
43+
circle.move(circles)
44+
circle.getGrid(grid)

0 commit comments

Comments
 (0)