我知道互联网上还有其他一些问题和文章,但还不够。我的问题是,现在,我正在通过叠加具有上升/下降半径的圆来计算球体的点,这是用bresenham的圆绘制算法制作的。这是我的代码,但应该不重要
def drawCircle(self, xyz, r): #Draws circle with radius "r" from midpoint "xyz". Note: Circle is parallel to x-axis
xc, yc, zc = xyz
coords = []
def drawC(xc, yc, zc, x, y):
coords.append((xc+x, yc+y, zc))
coords.append((xc-x, yc+y, zc))
coords.append((xc+x, yc-y, zc))
coords.append((xc-x, yc-y, zc))
coords.append((xc+y, yc+x, zc))
coords.append((xc-y, yc+x, zc))
coords.append((xc+y, yc-x, zc))
coords.append((xc-y, yc-x, zc))
x = 0
y = r
d = 3 - 2 * r
drawC(xc, yc, zc, x, y)
while y >= x:
x += 1
if (d > 0):
y -= 1
d = d + 4 * (x - y) + 10
else:
d = d + 4 * x + 6
drawC(xc, yc, zc, x, y)
for c in coords:
self.drawPixel(c)
return coords
def drawSphere(self,xyz,r): #Draws sphere. Not quite functional yet
x, y, z = xyz
for sr in range(-1,r):
self.drawCircle((x,y,z-r+sr),sr)
index = list(range(-1,r))
for sr in index:
self.drawCircle((x,y,z+sr),index[-sr])
当我渲染其中一个球体时,会发生以下情况:
如果我把厚度增加到两层
和3层:
有洞(球体越薄,孔就越少,但创建速度要慢得多。有没有办法创建无孔球体
我不会继续画圆圈。相反,我将通过扫描投影磁盘的边界框(这是一个正方形)填充磁盘,然后计算
R² - (X-Xc)² - (Y-Yc)²
并在该数量为正时绘制如果需要
Z
坐标,这是上述数量的平方根您可以以增量方式非常快速地对其进行评估,注意
看起来你只画了每个圆的边
消除孔的一种方法是填充每个圆内的区域。您可以在圆的任意位置拾取一个点,然后直接拾取它旁边的两个点,并在它们之间填充一个三角形。然后,将第二个点移动到第三个点的另一侧,并绘制一个新三角形
或者,您可以选择圆的一个轴(x或y),并取位于x上的两个点=每个x的某个值。调用
drawC()
时已经有了相反的点,所以只需将它们插入下面的绘制线即可:您还可以迭代每个圆所在的正方形,并找到其中的点:
如果填充圆时在层之间出现孔,请尝试在另一个轴上绘制圆
相关问题 更多 >
编程相关推荐