首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >球面calc点

球面calc点
EN

Stack Overflow用户
提问于 2020-12-06 00:50:05
回答 2查看 155关注 0票数 0

我知道互联网上还有其他几个问题和文章,但它们还不够。我的问题是,现在,我在用bresenham的圆圈绘制算法,用上升/下降半径叠加圆来计算球的点。这是我的代码,但不应该很重要。

代码语言:javascript
复制
    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层

三层:

有洞。(球体的灌木丛有较少的洞,但创建速度要慢得多。)有没有一种无洞球体的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-06 01:36:56

所以看起来你在画每个圆圈的边缘。

消除这些洞的一种方法是在每个圆圈内填充这个区域。你可以在圆上的任何地方选择一个点,然后直接选择它旁边的两个点,并在它们之间填充一个三角形。然后,将第二个点移到第三个点的对面,画一个新的三角形。

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

代码语言:javascript
复制
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)

您还可以在每个圆所在的正方形上迭代,并找到其中的点:

代码语言:javascript
复制
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)

如果在填充圆圈时在各层之间有洞,请尝试在另一个轴上绘制圆圈。

票数 0
EN

Stack Overflow用户

发布于 2020-12-07 16:44:16

我不会继续画圆圈。相反,我会通过扫描投影磁盘的边框(这是一个正方形)来填充磁盘,然后计算R² - (X-Xc)² - (Y-Yc)²并在这个数量为正时绘图。

如果需要Z坐标,这是上述数量的平方根。

您可以以增量的方式快速评估它,请注意

代码语言:javascript
复制
R² - (X+1-Xc)² - (Y-Yc)² = R² - (X-Xc)² - (Y-Yc)² + 2(X-Xc) + 1 = 
R² - (X-Xc)² - (Y-Yc)² + 2X + 1-2Xc`
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65163588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档