生成(任何)多边形线的公式,只有给定的信息是多边形是规则的,中心在给定点,& x 边

Formula for generating lines of (any) polygon with only given information being that the polygon is regular, the center is at a given point, & x sides

我正在 python 中生成 3d 渲染器,当给定 3D 线列表时,它会将它们转换为 2D 并使用海龟图形将它们绘制在屏幕上。

这是一组 3D 线的示例:


#
import math
import turtle
import random
import time
def rotatex(list,rot):
  x=list[0]
  y=list[1]
  z=list[2]
  newx = x;
  newy = y*math.cos(rot) - z*math.sin(rot);
  newz = y*math.sin(rot) + z*math.cos(rot);
  return [newx,newy,newz]
def rotatey(list,rot):
  x=list[0]
  y=list[1]
  z=list[2]
  newx = x*math.cos(rot) + z*math.sin(rot);
  newy = y;
  newz = z*math.cos(rot) - x*math.sin(rot);  
  return [newx,newy,newz]
def rotatez(list,rot):
  x=list[0]
  y=list[1]
  z=list[2]
  newx = x*math.cos(rot) - y*math.sin(rot);
  newy = x*math.sin(rot) + y*math.cos(rot);
  newz = z;  
  return [newx,newy,newz]
def project(p):
  camera=[0,-50,-300]
  return [((p[0]-camera[0])/camera[2])*100,((p[1]-camera[1])/camera[2])*100]
def render(p1,p2):
  turtle.penup()
  turtle.goto(p1[0],p1[1])
  turtle.pendown()
  turtle.goto(p2[0],p2[1])
  turtle.penup()
def degreestoradians(degrees):
  return degrees*0.175
def createpolygonlines(sidelength,sides,center):
  polygonlines=[]
  temp=[]
  apothem=(sidelength/2)/math.tan(360/(sides*2))
  turtle.goto(center[0],center[1])
  turtle.penup()
  turtle.setheading(270)
  turtle.forward(apothem)
  turtle.setheading(0)
  turtle.forward(sidelength/2)
  turtle.setheading(180)
  180*(sides-2)/sides
  for i in range(0,sides):
    temp.append(list(turtle.pos()))
    turtle.forward(sidelength)
    turtle.left(90)
    temp.append(list(turtle.pos()))
    polygonlines.append(temp)
    temp=[]
  print(polygonlines)
  return polygonlines
pointsgenerated=createpolygonlines(100,4,[0,0])
for i in pointsgenerated:
  i[0].append(0)
  i[1].append(0)
print(pointsgenerated)
turtle.clear()
points=pointsgenerated
renderbuffer=[]
rotx=degreestoradians(20)
roty=degreestoradians(20)
rotz=degreestoradians(20)
for i in range(0,len(points)):
  points[i][0]=rotatex(points[i][0],rotx)
  points[i][0]=rotatey(points[i][0],roty)
  points[i][0]=rotatez(points[i][0],rotz)
  points[i][1]=rotatex(points[i][1],rotx)
  points[i][1]=rotatey(points[i][1],roty)
  points[i][1]=rotatez(points[i][1],rotz)
for i in points:
  print(i)
print("Now let's flatten it")
for i in range(0,len(points)):
  renderbuffer.append([project(points[i][0]),project(points[i][1])]);
print(renderbuffer)
for i in range(0,len(renderbuffer)):
  render(renderbuffer[i][0],renderbuffer[i][1])
turtle.update()

以上一组线绘制了制作立方体所需的 12 条线,每行包含绘制一条线所需的两个点(起点和终点)。

我想要一个公式,可以为正多边形(需要 2D,我稍后会解释原因)生成一组线,其中包含中心和边长等信息。

我试着想出一个方程,但代数不对,请告诉我应该使用什么方程!

查看 render_polygon 函数,它可以生成给定边长、中心和边数的正多边形:

import turtle
import math
def render(p1,p2):
  turtle.penup()
  turtle.goto(p1[0],p1[1])
  turtle.pendown()
  turtle.goto(p2[0],p2[1])
  turtle.penup()

def render_polygon(centre,side_length, number_of_sides):
  n=number_of_sides
  xcentre=centre[0]
  ycentre=centre[1]
  pi=math.pi
  r=side_length/math.sqrt(2*(1-math.cos(2*pi/n)))
  xstart=r+xcentre
  ystart=0+ycentre
  xprev=xstart
  yprev=ystart
  for i in range(1,n):
      x=r*math.cos(2*pi*i/n)+xcentre
      y=r*math.sin(2*pi*i/n)+ycentre
      render([xprev,yprev],[x,y])
      xprev=x
      yprev=y
  render([xprev,yprev],[xstart,ystart])
win=turtle.Screen()
win.setup(width=300,height=300)
turtle.shape("circle")
#turtle.hideturtle()
render_polygon([0,0],50,4)
render_polygon([50/math.sqrt(2),-50/math.sqrt(2)],50,4)
render_polygon([50/math.sqrt(2),50/math.sqrt(2)],50,4)
render_polygon([-50/math.sqrt(2),-50/math.sqrt(2)],50,4)
render_polygon([-50/math.sqrt(2),50/math.sqrt(2)],50,4)
render_polygon([20,20],30,3)
render_polygon([60,-30],40,9)
render_polygon([-40,-30],50,6)
render_polygon([-40,50],5,60)