|
|
1.1 root 1: % from Lucasfilm Ltd.
2:
3: ballsdemo = proc ()
4: ai = array[int]
5: n = 20
6: bsize = 21
7: rad = bsize / 2
8: nx = 48
9: ny = -36
10: nz = 80
11: qi = sequence[int]
12: dmat = sequence[qi]$[qi$[1, 13, 4, 16],
13: qi$[9, 5, 12, 8],
14: qi$[3, 15, 2, 14],
15: qi$[11, 7, 10, 6]]
16:
17: bwidth: int := int$parse(xdemo_default("balls", "BorderWidth"))
18: except when not_found, overflow, bad_format: bwidth := 2 end
19: back: x_pixmap := x_display$white()
20: bdr: x_pixmap := x_display$black()
21: plane: int := 1
22: if x_display$cells() > 2
23: then begin
24: r, g, b: int := x_parse_color(xdemo_default("balls", "Border"))
25: bdr := x_pixmap$tile(x_display$alloc_color(r, g, b))
26: end except when not_found: end
27: cback: string := xdemo_default("balls", "Background")
28: except when not_found: cback := "" end
29: cfore: string := xdemo_default("balls", "Foreground")
30: except when not_found: cfore := "" end
31: if string$empty(cback) cand string$empty(cfore)
32: then exit done end
33: pixs: pixellist
34: pixs, plane := x_display$alloc_cells(1, 1, false)
35: back := x_pixmap$tile(pixs[1])
36: r, g, b: int
37: if string$empty(cback)
38: then r, g, b := x_display$query_color(WhitePixel)
39: else r, g, b := x_parse_color(cback)
40: end
41: x_display$store_color(pixs[1], r, g, b)
42: if string$empty(cfore)
43: then r, g, b := x_display$query_color(BlackPixel)
44: else r, g, b := x_parse_color(cfore)
45: end
46: x_display$store_color(pixs[1] + plane, r, g, b)
47: end except when done: end
48: w: x_window, wid0, hgt0: int := x_cons("balls", back, bdr,
49: xdemo_geometry(), "=400x400+1+1",
50: 40, 40, bwidth)
51: w.name := "balls"
52: w.input := UnmapWindow
53: x_window$map(w)
54: w.input := ExposeWindow + UnmapWindow
55: x: ai := ai$fill(0, n, 0)
56: y: ai := ai$fill(0, n, 0)
57: vx: ai := ai$fill(0, n, 0)
58: vy: ai := ai$fill(0, n, 0)
59: r: _wordvec := _wordvec$create(bsize)
60: r[1] := 1
61: swap: bool := _wordvec$bfetch(r, 1) = 0
62: r[1] := 0
63: for xx: int in int$from_to(-rad, rad) do
64: maxy: int := isqrt(rad * rad - xx * xx)
65: for yy: int in int$from_to(-maxy, maxy) do
66: if (nx * xx + ny * yy +
67: nz * isqrt(rad * rad - xx * xx - yy * yy)) *
68: 17 / (100 * rad) < dmat[xx // 4 + 1][yy // 4 + 1]
69: then yy := yy + rad + 1
70: r[yy] := r[yy] + 2 ** (xx + rad)
71: end
72: end
73: end
74: if swap
75: then for i: int in int$from_to_by(1, 4 * bsize, 4) do
76: v: int := _wordvec$bfetch(r, i)
77: _wordvec$bstore(r, i, _wordvec$bfetch(r, i + 2))
78: _wordvec$bstore(r, i + 2, v)
79: v := _wordvec$bfetch(r, i + 1)
80: _wordvec$bstore(r, i + 1, _wordvec$bfetch(r, i + 3))
81: _wordvec$bstore(r, i + 3, v)
82: end
83: end
84: ball: x_pixmap := x_pixmap$create(x_bitmap$create(bsize, bsize, r),
85: plane, 0)
86: ev: event := x_input$empty_event()
87: while true do
88: sx, sy, width, height, bw, ms, wk: int, iw: x_window := x_window$query(w)
89: if width <= 5 * bsize cor height <= 5 * bsize
90: then x_window$destroy(w)
91: return
92: end
93: x_window$clear(w)
94: width := width - bsize
95: height := height - bsize
96: for i: int in int$from_to(0, n - 1) do
97: x[i] := random$next(width)
98: y[i] := random$next(height)
99: vx[i] := random$next(13) - 6
100: vy[i] := random$next(13) - 6
101: x_window$pixmap_put(w, ball, 0, 0, bsize, bsize, x[i], y[i],
102: GXxor, plane)
103: end
104: count: int := 0
105: while count ~= 0 cor ~x_input$pending() do
106: if count = 4
107: then count := 0
108: else count := count + 1
109: end
110: for i: int in int$from_to(0, n - 1) do
111: x0: int := x[i]
112: y0: int := y[i]
113: xx: int := x0 + vx[i]
114: if xx < 0
115: then xx := -xx
116: vx[i] := -vx[i]
117: elseif xx >= width
118: then xx := 2 * (width - 1) - xx
119: vx[i] := -vx[i]
120: end
121: x[i] := xx
122: yy: int := y0 + vy[i]
123: if yy < 0
124: then yy := -yy
125: vy[i] := -vy[i]
126: elseif yy >= height
127: then yy := 2* (height - 1) - yy
128: vy[i] := -vy[i]
129: end
130: y[i] := yy
131: x_window$pixmap_put(w, ball, 0, 0, bsize, bsize, x0, y0,
132: GXxor, plane)
133: x_window$pixmap_put(w, ball, 0, 0, bsize, bsize, xx, yy,
134: GXxor, plane)
135: end
136: for i: int in int$from_to(1, n - 1) do
137: for j: int in int$from_to(0, i - 1) do
138: x0: int := x[i] - x[j]
139: y0: int := y[i] - y[j]
140: if int$abs(x0) >= bsize cor int$abs(y0) >= bsize cor
141: x0 * x0 + y0 * y0 >= bsize * bsize
142: then continue end
143: if y0 < 0
144: then y0 := -y0
145: x0 := -x0
146: end
147: if rad * int$abs(x0) > rad * int$abs(y0)
148: then vx[i] := -vx[i]
149: vx[j] := -vx[j]
150: elseif rad * int$abs(y0) > (rad + 2) * int$abs(x0)
151: then vy[i] := -vy[i]
152: vy[j] := -vy[j]
153: elseif y0 > 0
154: then t: int := vx[i]
155: vx[i] := -vy[i]
156: vy[i] := -t
157: t := vx[j]
158: vx[j] := -vy[j]
159: vy[j] := -t
160: else t: int := vx[i]
161: vx[i] := -vy[i]
162: vy[i] := t
163: t := vx[j]
164: vx[j] := -vy[j]
165: vy[j] := t
166: end
167: end
168: end
169: end
170: x_input$deq(ev)
171: if ev.kind = UnmapWindow
172: then x_input$deq(ev) end
173: end
174: end ballsdemo
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.