【发布时间】:2022-01-08 19:26:35
【问题描述】:
我在 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,我稍后会解释为什么)生成一组线条,其中包含中心和边长等信息。
我试着想出一个方程,但代数不正确,请告诉我应该使用什么方程!
【问题讨论】:
-
请提供足够的代码,以便其他人更好地理解或重现问题。
标签: python math turtle-graphics