python绘制多边形组合,在Python 3.2中绘制具有n个边的多边形

我必须用python编写一个程序,读取n值并在屏幕上绘制n个边的多边形。我可以使用Turtle图形模块或graphics.py模块。

当n=你输入的点数,然后在屏幕上点击n次,我知道如何画一个多边形,但是我对如何将许多边转换成多边形有一些困难。

这是我对n个点的多边形的代码:

def newPolygon(self,cmd):

p = eval(input("how many points"))

print("click",p,"times")

num = []

for i in range(p):

vertices = self.win.getMouse()

num.append(vertices)

poly = Polygon(num)

poly.setFill(self.color)

poly.draw(self.win)

self.figs.append(poly)

这不是程序的全部代码(384行)。这只是程序的一部分,其中draw polygon函数是self.figs=[],一个已绘制图形的列表。

你应该使用int(input(...))-"eval是邪恶的"

提示:龟可能是更容易的方法,因为你可以画一个多边形,通过"向前移动,然后X度旋转"N次。唯一困难的是找出x应该是什么。

@凯文,对我来说,拥有一支有方向性和相对运动的笔,听起来总是更为复杂和无意。在这种情况下,它实际上可能会有所帮助。

@凯文,我不知道怎么计算角度。我不应该要求用户输入学位。

在这种情况下,本文可能对您有用。

我假设你想要的是一种生成等边多边形坐标的方法,你可以把它输入你的绘图程序。我不确定您使用的是哪个库,所以我将坚持使用成对值的列表:

import math

def polygon(sides, radius=1, rotation=0, translation=None):

one_segment = math.pi * 2 / sides

points = [

(math.sin(one_segment * i + rotation) * radius,

math.cos(one_segment * i + rotation) * radius)

for i in range(sides)]

if translation:

points = [[sum(pair) for pair in zip(point, translation)]

for point in points]

return points

有一个公平的一点在那里进行,所以我会讨论它。基本方法是扫出一个圆,并在上面放置等距的点。这些将是多边形的点,从12点钟的位置开始。

首先要做的是从中心向外计算出每个楔形物的角度(以弧度为单位)。一个圆的弧度总数是2pi,所以我们的值是每段2pi/n。

在那之后,一些基本的三角学给了我们一些观点(https://en.wikipedia.org/wiki/trigonometry扩展了的定义)。在这一点上,我们按所需的半径缩放,并有机会将旋转偏移一个固定的量。

之后,我们将值转换一定量,因为您可能希望多边形位于屏幕的中心,而不是角落。

几个例子

print polygon(5)    # A unit pentagon

# [(0.0, 1.0), (0.9510565162951535, 0.30901699437494745), (0.5877852522924732, -0.8090169943749473), (-0.587785252292473, -0.8090169943749476), (-0.9510565162951536, 0.30901699437494723)]

print polygon(4, 100) # A square, point up, 100 from the center to the points

# [(0.0, 100.0), (100.0, 6.123233995736766e-15), (1.2246467991473532e-14, -100.0), (-100.0, -1.8369701987210297e-14)]

print polygon(4, 2, math.pi / 4, [10, 10])  # A flat square centered on 10, 10

# [[11.414213562373096, 11.414213562373096], [11.414213562373096, 8.585786437626904], [8.585786437626904, 8.585786437626904], [8.585786437626904, 11.414213562373094]]

正如您所看到的,这些都是浮动的,所以您可能需要在使用它们之前将它们挤压成整数。

简单而优雅。谢谢!

这个函数工作正常吗?它真的能做到EDOCX1 0吗?我正在检查Eucqliden距离(由math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)所示),它显示了不同路段的mi不同长度。

我已经快速检查过了,我想是的。确保您的x1和x2来自连续点非常重要。所有点与中心的距离相等,但如果您横切多边形,则不会彼此相距。当然有一些浮点噪声。

我不知道这是否有帮助,但要使用边数和长度定义多边形,我将使用我的代码:

import turtle as t

def polygon(n,l):

f = (n - 2) * 180/n

for i in range(n):

t.forward(l)

t.right(180 - f)

polygon()

在这种情况下,n是边数,L是边的长度。

这花了我相当长的一段时间,因为我只有13岁,我没有进步,但这是一个有趣的项目!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python绘制多边形和复合多边形有一些区别。 1. 多边形多边形是一个简单的封闭图形,由一系列的连续直线段组成,首尾相接。可以是三角形、四边形、五边形等等。绘制多边形时,只需要提供多边形的顶点坐标即可。 2. 复合多边形:复合多边形是由多个简单多边形组合而成的更复杂的图形。它可以由相邻的多个简单多边形共享一部分边界而形成。绘制复合多边形时,需要提供每个简单多边形的顶点坐标,并按照一定的顺序连接它们来构建复合多边形绘制多边形和复合多边形的方法在Python略有不同。对于多边形,你可以使用OpenCV库的`cv2.polylines()`函数来绘制。该函数接受一个包含顶点坐标的数组,并在图像上绘制多边形。 对于复合多边形,你需要将每个简单多边形的顶点坐标分别存储在一个数组,并使用`cv2.polylines()`函数分别绘制它们。然后,你可以使用`cv2.fillPoly()`函数填充整个复合多边形的区域。 这是一个简单的示例代码,演示如何使用OpenCV绘制多边形和复合多边形: ```python import numpy as np import cv2 # 创建一个空白图像 image = np.zeros((400, 400, 3), dtype=np.uint8) # 绘制一个三角形 triangle = np.array([[100, 300], [200, 100], [300, 300]], np.int32) cv2.polylines(image, [triangle], True, (0, 255, 0), thickness=2) # 绘制一个矩形 rectangle = np.array([[50, 50], [50, 200], [200, 200], [200, 50]], np.int32) cv2.polylines(image, [rectangle], True, (0, 0, 255), thickness=2) # 绘制一个复合多边形 compound_polygon = [np.array([[250, 50], [350, 50], [350, 150], [250, 150]], np.int32), np.array([[270, 70], [330, 70], [330, 130], [270, 130]], np.int32)] cv2.polylines(image, compound_polygon, True, (255, 0, 0), thickness=2) cv2.fillPoly(image, compound_polygon, (255, 0, 0)) # 显示图像 cv2.imshow('Polygon and Compound Polygon', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段代码将创建一个400x400大小的空白图像,并使用`cv2.polylines()`函数绘制了一个三角形、一个矩形和一个复合多边形。你可以根据需要修改顶点坐标和颜色来绘制不同的多边形。最后,使用`cv2.imshow()`函数显示图像。 希望这能帮助到你!如有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值