python - 如何创建彩虹三角形镶嵌
问题描述
我正在尝试在 Python 中创建如下所示的三角形镶嵌:
我得到的只是谢尔彭斯基的三角形。我假设它会使用一些相同的代码。
import turtle as t
import math
import colorsys
t.hideturtle()
t.speed(0)
t.tracer(0,0)
h = 0
def draw_tri(x,y,size):
global h
t.up()
t.goto(x,y)
t.seth(0)
t.down()
color = colorsys.hsv_to_rgb(h,1,1)
h += 0.1
t.color(color)
t.left(120)
t.fd(size)
t.left(120)
t.fd(size)
t.end_fill()
def draw_s(x,y,size,n):
if n == 0:
draw_tri(x,y,size)
return
draw_s(x,y,size/2,n-1)
draw_s(x+size/2,y,size/2,n-1)
draw_s(x+size/4,y+size*math.sqrt(3)/4,size/2,n-1)
draw_s(-300,-250,600,6)
t.update()
解决方案
正如@ReblochonMasque 所说,有多种方法可以解决这个问题。这是我想出的使用尽可能少的海龟代码来解决问题的方法:
from turtle import Screen, Turtle
TRIANGLE_SIDE = 60
TRIANGLE_HEIGHT = TRIANGLE_SIDE * 3 ** 0.5 / 2
CURSOR_SIZE = 20
screen = Screen()
width = TRIANGLE_SIDE * (screen.window_width() // TRIANGLE_SIDE)
height = TRIANGLE_HEIGHT * (screen.window_height() // TRIANGLE_HEIGHT)
diagonal = width + height
turtle = Turtle('square', visible=False)
turtle.shapesize(diagonal / CURSOR_SIZE, 1 / CURSOR_SIZE)
turtle.penup()
turtle.sety(height/2)
turtle.setheading(270)
turtle = turtle.clone()
turtle.setx(width/2)
turtle.setheading(210)
turtle = turtle.clone()
turtle.setx(-width/2)
turtle.setheading(330)
for _ in range(int(diagonal / TRIANGLE_HEIGHT)):
for turtle in screen.turtles():
turtle.forward(TRIANGLE_HEIGHT)
turtle.stamp()
screen.exitonclick()
它可能可以使用优化,但它可以完成工作。而且看着很有趣...
推荐阅读
- python - 如何创建包含范围内但不在索引中的日期的 MultiIndex 的笛卡尔积
- maven - 如何将maven多模块spring boot部署到docker容器
- javascript - 如何在 JavaScript 中用匹配的对象值替换模板标签?
- angular - Angular 8 模板驱动表单 - 使用 ngTemplateOutlet 传递控件
- python - Django 模型查询按月/年对结果进行分组,并在单独的 DIV 元素中显示每个月的结果
- java - 影响另一个类中的另一个方法的 if 语句
- python - 使用 geopandas 制作多个等值线图,按分类变量着色,并在地图之间保持相同的配色方案
- opencv - OpenCV 4.x+ 需要启用 C++11 支持
- javafx - 在 LineChart 和 AreaChart 之间切换会破坏 LineChart 系列符号点
- sql-server - 在 where 子句中使用相等表达式而不是包含时,SQL Server 使用全文索引