axi/examples/circles_offset.py

57 lines
1.3 KiB
Python

import axi
import math
import random
W, H = axi.A3_SIZE
def circle_ray_intersection(cx, cy, cr, ox, oy, dx, dy):
xd = ox - cx
yd = oy - cy
a = dx * dx + dy * dy
b = 2 * (dx * (ox - cx) + dy * (oy - cy))
c = xd * xd + yd * yd - cr * cr
d = b * b - 4 * a * c
if d < 0:
return None
t = (-b + math.sqrt(d)) / (2 * a)
x = ox + dx * t
y = oy + dy * t
return (x, y)
def path(x0, y0, r0, x1, y1, r1):
t = random.random()
a0 = random.random() * 2 * math.pi
a1 = a0 + math.radians(10)
n = 100
result = []
for i in range(n + 1):
u = i / n
a = a0 + (a1 - a0) * u
dx = math.cos(a)
dy = math.sin(a)
ax, ay = circle_ray_intersection(x0, y0, r0, x0, y0, dx, dy)
bx, by = circle_ray_intersection(x1, y1, r1, x0, y0, dx, dy)
x = ax + (bx - ax) * t
y = ay + (by - ay) * t
result.append((x, y))
return result
def main():
x0 = 0
y0 = 0
r0 = 1.5
x1 = -0.25
y1 = 0
r1 = 2
paths = []
for i in range(500):
paths.append(path(x0, y0, r0, x1, y1, r1))
d = axi.Drawing(paths).rotate_and_scale_to_fit(W, H)#.sort_paths()
im = d.render()
im.write_to_png('circles_offset.png')
d.dump('circles_offset.axi')
# axi.draw(d)
if __name__ == '__main__':
main()