news 2026/4/16 13:58:34

DeepSeek辅助Python编写直角多边形拟合圆轮廓并画图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek辅助Python编写直角多边形拟合圆轮廓并画图

为了测试多边形之间的包含关系,实现了用户设置圆半径和单位长度,程序自动确定圆心位置。

importmathimportturtledefgenerate_polygon_circle(radius,unit_length):""" 生成近似圆的多边形轮廓顶点坐标 参数: radius: 半径 unit_length: 单位长度(多边形的步长) 返回: list: 多边形顶点坐标列表,按顺时针顺序 """ifradius<=0orunit_length<=0:return[]vertices=[]# 圆心设为(r, r)以便所有坐标为正center_x=radius center_y=radius# 计算总步数(每90度圆弧的步数)steps_per_quadrant=max(1,int(radius/unit_length))# 存储第一象限的点(不含起点)first_quadrant_points=[]# 计算第一象限的点(从(0, r)开始,顺时针到(r, 0))foriinrange(steps_per_quadrant+1):x=i*unit_lengthifx>radius:# 防止x大于半径x=radius y_sq=max(0,radius**2-x**2)y=math.sqrt(y_sq)first_quadrant_points.append((x,y))# 起点:正上方 (r, 2r)start_x=center_x start_y=center_y+radius vertices.append((start_x,start_y))# 第一象限:右上1/4圆弧(从顶部到右侧)# 从第一个点(接近顶部)开始foriinrange(len(first_quadrant_points)-1,-1,-1):x_offset,y_offset=first_quadrant_points[i]x=center_x+x_offset y=center_y+y_offsetifvertices:last_x,last_y=vertices[-1]# 插入直角顶点iflast_x!=xandlast_y!=y:vertices.append((last_x,y))vertices.append((x,y))# 第二象限:右下1/4圆弧(从右侧到底部)foriinrange(len(first_quadrant_points)):x_offset,y_offset=first_quadrant_points[i]x=center_x+y_offset# 注意:这里x和y交换,因为是对称的y=center_y-x_offset last_x,last_y=vertices[-1]iflast_x!=xandlast_y!=y:vertices.append((last_x,y))vertices.append((x,y))# 第三象限:左下1/4圆弧(从底部到左侧)foriinrange(len(first_quadrant_points)-1,-1,-1):x_offset,y_offset=first_quadrant_points[i]x=center_x-x_offset y=center_y-y_offset last_x,last_y=vertices[-1]iflast_x!=xandlast_y!=y:vertices.append((last_x,y))vertices.append((x,y))# 第四象限:左上1/4圆弧(从左侧到顶部)foriinrange(len(first_quadrant_points)):x_offset,y_offset=first_quadrant_points[i]x=center_x-y_offset# 注意:这里x和y交换,因为是对称的y=center_y+x_offset last_x,last_y=vertices[-1]iflast_x!=xandlast_y!=y:vertices.append((last_x,y))vertices.append((x,y))# 闭合多边形(回到起点)vertices.append(vertices[0])# 对坐标进行单位长度的整数倍调整adjusted_vertices=[]forx,yinvertices:ifunit_length>=2:adj_x=round(x/unit_length)*unit_length adj_y=round(y/unit_length)*unit_lengthelse:adj_x=round(x)adj_y=round(y)adjusted_vertices.append((adj_x,adj_y))returnadjusted_verticesdefdraw_polygon_with_turtle(vertices,radius):"""使用turtle绘制多边形"""# 设置画布screen=turtle.Screen()screen.title("近似圆的多边形")screen.setup(width=800,height=800)# 计算顶点坐标的范围all_x=[xforx,_invertices]all_y=[yfor_,yinvertices]min_x,max_x=min(all_x),max(all_x)min_y,max_y=min(all_y),max(all_y)# 计算缩放比例,使图形占据画布的70%width=max_x-min_x height=max_y-min_y screen_width=800screen_height=800# 计算缩放比例scale_x=(screen_width*0.7)/max(width,1)scale_y=(screen_height*0.7)/max(height,1)scale=min(scale_x,scale_y)# 计算偏移量使图形居中offset_x=(screen_width-width*scale)/2-min_x*scale offset_y=(screen_height-height*scale)/2-min_y*scale# 创建画笔pen=turtle.Turtle()pen.speed(0)# 最快速度pen.width(2)# 移动到第一个点pen.penup()ifvertices:first_x,first_y=vertices[0]scaled_x=first_x*scale+offset_x-screen_width/2scaled_y=first_y*scale+offset_y-screen_height/2pen.goto(scaled_x,scaled_y)# 绘制多边形pen.pendown()pen.color("blue")forx,yinvertices:scaled_x=x*scale+offset_x-screen_width/2scaled_y=y*scale+offset_y-screen_height/2pen.goto(scaled_x,scaled_y)# 绘制参考圆pen.penup()center_x=(min_x+max_x)/2*scale+offset_x-screen_width/2center_y=(min_y+max_y)/2*scale+offset_y-screen_height/2pen.goto(center_x,center_y-radius*scale)# 圆的底部pen.pendown()pen.color("red")pen.circle(radius*scale)# 标记顶点(只标记部分顶点,避免太密集)pen.penup()pen.color("green")fori,(x,y)inenumerate(vertices):ifi%max(1,len(vertices)//20)==0:# 只标记约20个点scaled_x=x*scale+offset_x-screen_width/2scaled_y=y*scale+offset_y-screen_height/2pen.goto(scaled_x,scaled_y-10)pen.write(f"{i}",align="center",font=("Arial",8,"normal"))pen.hideturtle()screen.mainloop()# 测试函数deftest_circle_polygon():"""测试生成近似圆的多边形"""print("测试1: 半径10,单位长度1")radius1=10unit1=1vertices1=generate_polygon_circle(radius1,unit1)#draw_polygon_with_turtle(vertices1, radius1)print("顶点坐标:")fori,(x,y)inenumerate(vertices1):print(f"{x:.0f},{y:.0f}")print(f"\n共{len(vertices1)}个顶点")print("\n"+"="*50)print("测试2: 半径10,单位长度2")radius2=10unit2=2vertices2=generate_polygon_circle(radius2,unit2)#draw_polygon_with_turtle(vertices2, radius2)print("顶点坐标:")fori,(x,y)inenumerate(vertices2):print(f"{x:.0f},{y:.0f}")print(f"\n共{len(vertices2)}个顶点")print("\n"+"="*50)print("测试3: 半径21,单位长度3")radius3=21unit3=3vertices3=generate_polygon_circle(radius3,unit3)draw_polygon_with_turtle(vertices3,radius3)print("顶点坐标:")fori,(x,y)inenumerate(vertices3):print(f"{x:.0f},{y:.0f}")print(f"\n共{len(vertices3)}个顶点")# 使用turtle绘制验证#draw_option = input("\n是否使用turtle绘制验证图形?(y/n): ")#if draw_option.lower() == 'y':# draw_polygon_with_turtle(vertices1, radius1)# 主程序if__name__=="__main__":test_circle_polygon()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 3:37:02

为什么不采用级联删除而选择软删除

在数据库设计中&#xff0c;如果涉及级联删除的问题&#xff0c;不要通过外键的方式来进行操作&#xff0c;需要使用事务的方式来进行操作&#xff0c;为什么不采用外键的方式主要有以下两点&#xff1a;在数据库中&#xff0c;外键会关联主键&#xff0c;在主键进行删除的同时…

作者头像 李华
网站建设 2026/4/16 10:20:08

传统开发成本过高?低代码平台如何降低企业数字化转型预算

在数字化浪潮席卷各行各业的今天&#xff0c;“成本太高” 成为阻碍企业尤其是中小企业数字化转型的首要难题。传统开发模式下&#xff0c;人力薪资、漫长周期、维护损耗等成本层层叠加&#xff0c;一套常规业务系统的开发投入动辄数十万甚至上百万&#xff0c;让不少企业望而却…

作者头像 李华
网站建设 2026/4/16 11:58:55

如何备份docker images

备份Docker镜像主要有以下几种方式&#xff1a;方法一&#xff1a;docker save / docker load&#xff08;推荐&#xff09;备份单个镜像bash复制# 保存镜像为tar文件&#xff08;包含所有标签&#xff09; docker save -o backup.tar <镜像名>:<标签># 示例 docke…

作者头像 李华
网站建设 2026/4/16 11:56:49

探索成熟的FTP替代方案:现代化文件传输的新选择

随着数据规模的扩大和安全需求的提升&#xff0c;传统FTP协议已逐渐显露出诸多局限。企业和技术团队需要更安全、高效、可靠的文件传输解决方案来满足现代化业务需求。本文将系统梳理当前主流的FTP替代方案&#xff0c;为不同场景下的文件传输需求提供参考。 云存储与文件同步服…

作者头像 李华
网站建设 2026/4/16 11:57:08

抽卡机小程序比较常见的功能汇总

盲盒抽卡机小程序的功能丰富多样&#xff0c;最主要的功能有这些&#xff1a;基础抽卡功能&#xff1a;支持单次抽卡和十连抽等方式&#xff0c;用户可以根据自己的喜好来选择奖池参与体验。可设置消耗不同数量的货币或积分对应不同的抽卡池&#xff0c;里面的卡牌稀有度等也会…

作者头像 李华