Python 2.7 如何使用大量的点来制作复杂的形状……比如椅子、火箭等等,使用pygame和numpy

Python 2.7 如何使用大量的点来制作复杂的形状……比如椅子、火箭等等,使用pygame和numpy,python-2.7,numpy,pygame,pickle,Python 2.7,Numpy,Pygame,Pickle,我正在做一个swarm算法的项目,我正在尝试使用swarm共识制作复杂的形状。然而,要实现这一目标,数学对我来说似乎相当困难 我已经能够做出像星星、圆和三角形这样的形状,但要做出其他复杂的形状似乎更难。如果我有了使用numpy阵列来使用群集构建这些复杂形状的想法,那将非常有帮助 #将弧度角重置为[-pi,pi)的常规功能 def复位弧度(弧度): 弧度>=math.pi时: 弧度=弧度-2*math.pi 而弧度那样): 然后用一个类似于你的程序,你可以开始画一条90度的线,画20个点,然后画

我正在做一个swarm算法的项目,我正在尝试使用swarm共识制作复杂的形状。然而,要实现这一目标,数学对我来说似乎相当困难

我已经能够做出像星星、圆和三角形这样的形状,但要做出其他复杂的形状似乎更难。如果我有了使用numpy阵列来使用群集构建这些复杂形状的想法,那将非常有帮助


#将弧度角重置为[-pi,pi)的常规功能
def复位弧度(弧度):
弧度>=math.pi时:
弧度=弧度-2*math.pi
而弧度<-math.pi:
弧度=弧度+2*math.pi
回程弧度
#沿航向方向计算下一个位置节点的通用函数
定义校准下一个节点(节点姿态、索引当前、航向角度、重复次数):
对于范围内的(重复次数):
下一个索引=当前索引+1
x=节点姿态[索引当前][0]+1.0*math.cos(航向角)
y=节点姿态[索引当前][1]+1.0*math.sin(航向角)
node_poses[index_next]=np.array([x,y])
index\u curr=index\u next
返回索引\u next
#####生成star的脚本#####
文件名='star'
群集大小=30
节点位置=np.0((群集大小,2))
外倾角=2*math.pi/5.0
devia_right=外倾角
左偏差=2*外倾角
#第一个节点位于左下角
航向角=外航向角/2.0#当前航向
航向_dir=0#当前航向方向:0表示左侧,1表示右侧
分段计数=0#当前分段计数
对于范围内的i(1,群集大小):
节点摆姿势[i]=(节点摆姿势[i-1]+
数组([math.cos(航向角),math.sin(航向角)])
分段计数=分段计数+1
如果seg_count==3:
分段计数=0
如果标题_dir==0:
航向角=重置弧度(航向角-右偏差)
航向_dir=1
其他:
航向角=重置弧度(航向角+设备左)
航向_dir=0
打印(节点位置)
将open(filename,'w')作为f:
pickle.dump(节点,f)
pygame.init()
#找到正确的世界和屏幕大小
x_max,y_max=np.max(节点姿态,轴=0)
x_min,y_min=np.min(节点姿态,轴=0)
每像素长度=30
世界大小=(x最大-x最小+2.0,y最大-y最小+2.0)
屏幕大小=(int(世界大小[0])*像素/长度,int(世界大小[1])*像素/长度)
#将世界中的节点姿势转换为屏幕上的显示姿势
def cal_disp_poses():
姿势温度=np.0((群集大小,2))
#将循环移动到世界中央
middle=np.数组([(x_max+x_min)/2.0,(y_max+y_min)/2.0])
对于范围内的i(群集大小):
poses_temp[i]=(节点_poses[i]-中间+
数组([world\u size[0]/2.0,world\u size[1]/2.0]))
#转换为显示坐标
姿势温度[:,0]=姿势温度[:,0]/世界大小[0]
姿势温度[:,0]=姿势温度[:,0]*屏幕尺寸[0]
姿势温度[:,1]=姿势温度[:,1]/世界大小[1]
姿势温度[:,1]=1.0-姿势温度[:,1]
姿势温度[:,1]=姿势温度[:,1]*屏幕尺寸[1]
返回姿势\u温度astype(int)
disp_poses=cal_disp_poses()
#在pygame窗口上绘制循环形状
颜色\白色=(255255)
颜色_黑色=(0,0,0)
screen=pygame.display.set_模式(屏幕大小)
屏幕填充(颜色为白色)
对于范围内的i(群集大小):
pygame.draw.circle(屏幕,黑色,显示姿势[i],5,0)
对于范围内的i(swarm_尺寸-1):
pygame.draw.line(屏幕,颜色为黑色,显示姿势[i],显示姿势[i+1],2)
pygame.draw.line(屏幕,颜色为黑色,显示姿势[0],显示姿势[swarm\u size-1],2)
pygame.display.update()

你的绘制方法充分利用了你正在绘制的形状的对称性。更复杂的形状的对称性会更少,因此你的方法需要大量繁琐的工作才能用星星来绘制。如果没有对称性,你最好将每一行“命令”写在一个列表中,并遵循列表例如,从底部开始绘制数字4(假设0度为-->那样):

然后用一个类似于你的程序,你可以开始画一条90度的线,画20个点,然后画225度的线,画15个点等等。然后通过添加到这两个列表中,你可以建立一个非常复杂的形状,而不依赖于对称性

angles = [90,225,0]
distances = [20,15,12]