added fractals
This commit is contained in:
@@ -8,6 +8,7 @@ import math, random
|
|||||||
from PIL import Image, ImageDraw
|
from PIL import Image, ImageDraw
|
||||||
import svgwrite
|
import svgwrite
|
||||||
import datetime
|
import datetime
|
||||||
|
from sympy.geometry import Circle, Point
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -56,6 +57,9 @@ def generatePolygon( ctrX, ctrY, aveRadius, irregularity, spikeyness, numVerts )
|
|||||||
|
|
||||||
angle = angle + angleSteps[i]
|
angle = angle + angleSteps[i]
|
||||||
|
|
||||||
|
for i in range(10):
|
||||||
|
points = fractalize(points)
|
||||||
|
|
||||||
return points
|
return points
|
||||||
|
|
||||||
def clip(x, min, max) :
|
def clip(x, min, max) :
|
||||||
@@ -65,6 +69,66 @@ def clip(x, min, max) :
|
|||||||
else : return x
|
else : return x
|
||||||
|
|
||||||
|
|
||||||
|
def fractalize(pts) :
|
||||||
|
print("Fractalize")
|
||||||
|
print(pts)
|
||||||
|
points = []
|
||||||
|
for v in range(0, len(pts)):
|
||||||
|
p1 = pts[v]
|
||||||
|
print(p1)
|
||||||
|
points.append(p1)
|
||||||
|
p2 = pts[0] if v >= len(pts)-1 else pts[v+1];
|
||||||
|
d = distance(p1,p2)
|
||||||
|
# print(d)
|
||||||
|
r = d*0.52
|
||||||
|
ps1,ps2 = circle_intersection((p1[0],p1[1],r), (p2[0],p2[1],r))
|
||||||
|
print(ps1)
|
||||||
|
# print(ps2)
|
||||||
|
if random.randint(1,2) == 2:
|
||||||
|
points.append(ps2)
|
||||||
|
else:
|
||||||
|
points.append(ps1)
|
||||||
|
return points
|
||||||
|
|
||||||
|
# Distance function
|
||||||
|
def distance(p1,p2):
|
||||||
|
sq1 = (p1[0]-p2[0])*(p1[0]-p2[0])
|
||||||
|
sq2 = (p1[1]-p2[1])*(p1[1]-p2[1])
|
||||||
|
return math.sqrt(sq1 + sq2)
|
||||||
|
|
||||||
|
def circle_intersection(circle1, circle2):
|
||||||
|
'''
|
||||||
|
@summary: calculates intersection points of two circles
|
||||||
|
@param circle1: tuple(x,y,radius)
|
||||||
|
@param circle2: tuple(x,y,radius)
|
||||||
|
@result: tuple of intersection points (which are (x,y) tuple)
|
||||||
|
'''
|
||||||
|
# return self.circle_intersection_sympy(circle1,circle2)
|
||||||
|
x1,y1,r1 = circle1
|
||||||
|
x2,y2,r2 = circle2
|
||||||
|
# http://stackoverflow.com/a/3349134/798588
|
||||||
|
dx,dy = x2-x1,y2-y1
|
||||||
|
d = math.sqrt(dx*dx+dy*dy)
|
||||||
|
if d > r1+r2:
|
||||||
|
print("#1")
|
||||||
|
return None # no solutions, the circles are separate
|
||||||
|
if d < abs(r1-r2):
|
||||||
|
print("#2")
|
||||||
|
return None # no solutions because one circle is contained within the other
|
||||||
|
if d == 0 and r1 == r2:
|
||||||
|
print("#3")
|
||||||
|
return None # circles are coincident and there are an infinite number of solutions
|
||||||
|
|
||||||
|
a = (r1*r1-r2*r2+d*d)/(2*d)
|
||||||
|
h = math.sqrt(r1*r1-a*a)
|
||||||
|
xm = x1 + a*dx/d
|
||||||
|
ym = y1 + a*dy/d
|
||||||
|
xs1 = xm + h*dy/d
|
||||||
|
xs2 = xm - h*dy/d
|
||||||
|
ys1 = ym - h*dx/d
|
||||||
|
ys2 = ym + h*dx/d
|
||||||
|
|
||||||
|
return (xs1,ys1),(xs2,ys2)
|
||||||
|
|
||||||
# create maps export folder
|
# create maps export folder
|
||||||
base = "maps"
|
base = "maps"
|
||||||
@@ -79,13 +143,10 @@ except OSError as exception:
|
|||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
for i in range(0, 1):
|
||||||
|
|
||||||
|
nv = random.randint(5,30)
|
||||||
|
verts = generatePolygon( ctrX=500, ctrY=500, aveRadius=300, irregularity=1, spikeyness=0.4, numVerts=nv )
|
||||||
for i in range(0, 99):
|
|
||||||
|
|
||||||
nv = random.randint(10,20)
|
|
||||||
verts = generatePolygon( ctrX=500, ctrY=500, aveRadius=300, irregularity=1, spikeyness=0.15, numVerts=nv )
|
|
||||||
|
|
||||||
index = str(i) if i > 9 else '0'+str(i)
|
index = str(i) if i > 9 else '0'+str(i)
|
||||||
|
|
||||||
@@ -105,15 +166,15 @@ for i in range(0, 99):
|
|||||||
# print(p1)
|
# print(p1)
|
||||||
# print(p2)
|
# print(p2)
|
||||||
|
|
||||||
if random.randint(0,10) > 8:
|
# if random.randint(0,10) > 8:
|
||||||
sda = "4 4"
|
# sda = "4 4"
|
||||||
sdo = "5"
|
# sdo = "5"
|
||||||
else:
|
# else:
|
||||||
sda = "0 0"
|
sda = "0 0"
|
||||||
sdo = "0"
|
sdo = "0"
|
||||||
|
|
||||||
line = svg.line(p1, p2,
|
line = svg.line(p1, p2,
|
||||||
stroke_width = "2",
|
stroke_width = "1",
|
||||||
stroke = "black",
|
stroke = "black",
|
||||||
stroke_linecap = "round",
|
stroke_linecap = "round",
|
||||||
stroke_dasharray = sda,
|
stroke_dasharray = sda,
|
||||||
|
|||||||
Reference in New Issue
Block a user