circles offset
This commit is contained in:
parent
aa12c04186
commit
1569f75fd1
|
@ -0,0 +1,56 @@
|
|||
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()
|
Loading…
Reference in New Issue