生成(任何)多边形线的公式,只有给定的信息是多边形是规则的,中心在给定点,& 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)
我正在 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)