Python turtle绘制圆周点全连接图案的连线实现问题
问题描述
需要实现圆周上指定数量点位的两两全连接,生成对称几何图案:圆周上共n个点时,每个点都和其余所有点连线。目前已实现点位绘制、底部固定点到其余所有点的连线,但无法完成剩余点位的全连接逻辑,曾尝试抓取已绘制点的坐标实现连线未成功,需要更简便的实现方案。
现有问题代码
import turtle tur = turtle.Turtle() bob = turtle.Turtle() screen = turtle.Screen() screen.setup(800,800) stippen = int(screen.numinput("How many?" , "How many dots do you want to draw? " , minval = 1 , maxval = 25)) #用户可输入1-25之间的点数量 formula = 360/stippen #计算点位间隔角度,保证点位均匀分布 r = 300 #圆半径 def roos(): tur.ht() bob.ht() bob.speed(0) tur.speed(0) bob.up() tur.up() tur.goto(0,-300) #固定底部点位 bob.goto(0,-300) for i in range(stippen): #绘制圆周和点位 tur.down() bob.down() tur.circle(r,formula,150) #绘制一段圆弧 tur.dot() #绘制点位 bob.goto(tur.pos()) #bob移动到当前点位画线 bob.up() bob.goto(0,-300) #回到最底部点位准备画下一条线 tur.up() roos() turtle.done()
实现思路
不需要在绘制过程中实时抓取turtle的位置,直接通过三角函数预计算所有圆周均匀点位的坐标存入列表,再遍历所有点对连线即可,逻辑更简单也不容易出错:
- 导入
math模块做角度、坐标计算 - 从底部点位开始,按固定角度间隔计算每个点的(x,y)坐标,存入点位列表:圆周上角度为θ的点坐标为
(r*cosθ, r*sinθ),注意三角函数需要传入弧度值 - 遍历点位列表完成所有点的绘制
- 用双层循环遍历所有不重复的点对,依次连线即可:外层循环取起点索引i,内层循环取索引大于i的终点j,避免重复绘制两点之间的同一条线
修改后完整代码
import turtle import math tur = turtle.Turtle() line_pen = turtle.Turtle() screen = turtle.Screen() screen.setup(800, 800) stippen = int(screen.numinput("How many?", "How many dots do you want to draw? ", minval=1, maxval=25)) angle_step = 360 / stippen r = 300 def roos(): # 初始化画笔 tur.ht() line_pen.ht() tur.speed(0) line_pen.speed(0) tur.up() line_pen.up() # 预计算所有点位坐标,从底部(0,-r)位置开始 points = [] for i in range(stippen): # 初始角度为-90度(对应底部点位),逐次加角度间隔 deg = -90 + i * angle_step rad = math.radians(deg) x = r * math.cos(rad) y = r * math.sin(rad) points.append((x, y)) # 绘制所有点位 for (x, y) in points: tur.goto(x, y) tur.dot() # 两两连线 for i in range(len(points)): x1, y1 = points[i] for j in range(i + 1, len(points)): x2, y2 = points[j] line_pen.goto(x1, y1) line_pen.down() line_pen.goto(x2, y2) line_pen.up() roos() turtle.done()
代码运行后输入对应点数,即可生成完整的全连接圆周几何图案,点数在25以内时绘制速度很快,不会出现重复画线的问题。
内容的提问来源于stack exchange,提问作者beginnercoder
相关产品推荐
相关产品推荐

