我知道互联网上还有其他几个问题和文章,但它们还不够。我的问题是,现在,我在用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])当我呈现其中一个球体时,会发生这样的情况:

如果我把厚度增加到2层

三层:

有洞。(球体的灌木丛有较少的洞,但创建速度要慢得多。)有没有一种无洞球体的方法?
发布于 2020-12-06 01:36:56
所以看起来你在画每个圆圈的边缘。
消除这些洞的一种方法是在每个圆圈内填充这个区域。你可以在圆上的任何地方选择一个点,然后直接选择它旁边的两个点,并在它们之间填充一个三角形。然后,将第二个点移到第三个点的对面,画一个新的三角形。
或者,您可以选择圆(x或y)的一个轴,并取每一个x的x=some值上的两个点。当您调用drawC()时,已经有了相反的点,所以只需将它们插入下面的draw_line:
def fill_line(x1, x2, y, z):
max = max(x1,x2)
min = min(x1,x2)
for i in range(min, max):
coords.append(i, y, z)您还可以在每个圆所在的正方形上迭代,并找到其中的点:
def fill_circle(xy, r, z):
for i in range(xy[0]-r, xy[0]+r):
for j in range(xy[1]-r, xy[1]+r):
if (i - xy[0])**2 + (j - xy[1])**2 < r**2:
coords.append(i,j,z)如果在填充圆圈时在各层之间有洞,请尝试在另一个轴上绘制圆圈。
发布于 2020-12-07 16:44:16
我不会继续画圆圈。相反,我会通过扫描投影磁盘的边框(这是一个正方形)来填充磁盘,然后计算R² - (X-Xc)² - (Y-Yc)²并在这个数量为正时绘图。
如果需要Z坐标,这是上述数量的平方根。
您可以以增量的方式快速评估它,请注意
R² - (X+1-Xc)² - (Y-Yc)² = R² - (X-Xc)² - (Y-Yc)² + 2(X-Xc) + 1 =
R² - (X-Xc)² - (Y-Yc)² + 2X + 1-2Xc`https://stackoverflow.com/questions/65163588
复制相似问题