Draw a circle that is perfectly inscribed inside an equilateral triangle as shown. You may want to use some math skills in solving this problem.
Daily Archives: 05/30/2021
Zooming 10^13 Times into Julia Set Animation
Write a Python program to generate hundreds of images of Julia Set with ever zooming ranges. Please note that Turtle is not used in this project for speed consideration. Then use an external software to combine the images into a video:
The video above zooms into the center at 0.0958598997051 + 1.1501990019993i with c = 0.355 + 0.355i. In each iteration the range shrinks by 5% until the range becomes 1/10^13 the size of the original range. You can modify the code to try different centers and c. The following is the source code:
from PIL import Image
import colorsys
cx = -0.7269
cy = 0.1889
R = (1+(1+4*(cx**2+cy**2)**0.5)**0.5)/2+0.001
max_iteration = 512
print(R)
w, h, zoom = 1500,1500,1
def julia(cx,cy,RZ,px,py,R,max_iteration,x,y,minx,maxx,miny,maxy):
zx = (x-minx)/(maxx-minx)*2*RZ-RZ+px
zy = (y-miny)/(maxy-miny)*2*RZ-RZ+py
i=0
while zx**2 + zy**2 < R**2 and i < max_iteration:
temp = zx**2 - zy**2
zy = 2*zx*zy + cy
zx = temp + cx
i += 1
return i
def gen_julia_image(sequence,cx,cy,RZ):
bitmap = Image.new("RGB", (w, h), "white")
pix = bitmap.load()
for x in range(w):
for y in range(h):
# smllaer: right,down
c=julia(cx,cy,RZ,0.0958598997051,1.1501990019993,R,max_iteration,x,y,0,w-1,0,h-1)
v = c/max_iteration
hv = 0.67-v*0.67
r,g,b = colorsys.hsv_to_rgb(hv,1,v/2+0.45)
r = min(255,round(r*255))
g = min(255,round(g*255))
b = min(255,round(b*255))
pix[x,y] = int(r) + (int(g) << 8) + (int(b) << 16)
bitmap.save("julia_"+str(sequence)+".jpg")
# bitmap.show()
f = 0.95
RZF = 1/1000000000000
RZ = 1
k=1
while RZ>RZF:
print(k,RZ)
gen_julia_image(k,0.355,0.355,RZ)
RZ *= f
k+=1
Related Projects:
N Overlapping Circle with Python and Turtle (Source Code)
Generalize the three overlapping circles project by letting it draw any number of overlapping circles. The following is the overlapping circles from size 2 to size 7.
Solution
import turtle
import math
screen = turtle.Screen()
screen.title('N Overlapping Circles - PythonTurtle.Academy')
screen.setup(1000,1000)
turtle.hideturtle()
turtle.speed(0)
turtle.pensize(2)
def draw_circle(x,y,radius):
turtle.up()
turtle.goto(x,y-radius)
turtle.seth(0)
turtle.down()
turtle.circle(radius,steps=360)
r = 150
n = 3
r2 = r/2/math.sin(math.radians(180/n))
angle = 90
for _ in range(n):
draw_circle(r2*math.cos(math.radians(angle)),
r2*math.sin(math.radians(angle)),
r)
angle += 360/n
Three Overlapping Circles with Python and Turtle (Tutorial)
Draw the following overlapping circles. Please note that each circle passes through the center of the other two circles.
Solution
We observe that the centers of the three circles form an equilateral triangle and the length of the equilateral triangle is the radius of the circle. So, the first step is to figure out the coordinates of the vertices of the equilateral triangle (with some math), and then draw three circles given the these three coordinates as the centers. So, it will be helpful to create a function that draws circle based on the center and radius. The following is the source code:
import turtle
screen = turtle.Screen()
screen.title('Three Circles - PythonTurtle.Academy')
screen.setup(1000,1000)
turtle.hideturtle()
turtle.speed(0)
def draw_circle(x,y,radius):
turtle.up()
turtle.goto(x,y-radius)
turtle.seth(0)
turtle.down()
turtle.circle(radius,steps=360)
r = 150
draw_circle(0,r,r*3**0.5)
draw_circle(-r/2*3**0.5,-r/2,r*3**0.5)
draw_circle(r/2*3**0.5,-r/2,r*3**0.5)