球面计算点

2024-05-29 05:58:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道互联网上还有其他一些问题和文章,但还不够。我的问题是,现在,我正在通过叠加具有上升/下降半径的圆来计算球体的点,这是用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])

当我渲染其中一个球体时,会发生以下情况:

one

如果我把厚度增加到两层

two

和3层:

th

有洞(球体越薄,孔就越少,但创建速度要慢得多。有没有办法创建无孔球体


Tags: inselfforindexdefzccoords球体
2条回答

我不会继续画圆圈。相反,我将通过扫描投影磁盘的边界框(这是一个正方形)填充磁盘,然后计算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`

看起来你只画了每个圆的边

消除孔的一种方法是填充每个圆内的区域。您可以在圆的任意位置拾取一个点,然后直接拾取它旁边的两个点,并在它们之间填充一个三角形。然后,将第二个点移动到第三个点的另一侧,并绘制一个新三角形

或者,您可以选择圆的一个轴(x或y),并取位于x上的两个点=每个x的某个值。调用drawC()时已经有了相反的点,所以只需将它们插入下面的绘制线即可:

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)

如果填充圆时在层之间出现孔,请尝试在另一个轴上绘制圆

相关问题 更多 >

    热门问题