5

我试图在块游戏中创建一个 3D 圆环,所以我需要评估一系列坐标以查看它们是否在圆环内。我用球体做的方式是:

shapefunc = function (pos,fields)
  map = {}
  pos.x = math.floor(pos.x+0.5)
  pos.y = math.floor(pos.y+0.5)
  pos.z = math.floor(pos.z+0.5)

  for x=-fields.radius,fields.radius do
    for y=-fields.radius,fields.radius do
      for z=-fields.radius,fields.radius do
        if x*x+y*y+z*z <= fields.radius*fields.radius then
          table.insert(map,{x=pos.x+x,y=pos.y+y,z=pos.z+z})
        end
      end
    end
  end
  return map
end

给定高度(在 y 轴上)、小半径和大半径(在 xz 轴上)和原点,我尝试过的评估表达式都没有给我任何接近圆环的东西。

4

3 回答 3

2

据此,是一个测试表达式符号的问题:

(x^2+y^2+z^2-(a^2+b^2))^2 - 4*a*b*(b^2-z^2)

其中点为 {x,y,z},环面的小半径为 b,大半径为 a。

于 2012-11-19T21:04:13.227 回答
2

上面的公式对我不起作用。考虑 b = 0,公式应该减少为一个圆圈,而实际上在接受的答案中它减少为一个球体。

根据我的计算,您必须测试表达式的符号

(x^2+y^2+z^2+a^2-b^2)^2-4a^2(x^2+y^2)

其中点为 {x,y,z},环面的小半径为 b,大半径为 a。

编辑:等效地,并且更接近于原始接受的答案,表达式将是

(x^2+y^2+z^2-(a^2+b^2))^2-4a^2(b^2-z^2)

于 2015-01-26T15:45:07.883 回答
0

保罗的解决方案对我不起作用。相反,我在 Python 中提出了这个简单的工作解决方案:

def INSIDE_TORUS(p):
    angle_xy = np.arctan2(p[1], p[0])
    p = [p[0] - TOROIDAL_RADIUS * np.cos(angle_xy), p[1] - TOROIDAL_RADIUS * np.sin(angle_xy), p[2]]
    return -POLOIDAL_RADIUS <= np.linalg.norm(p) <= POLOIDAL_RADIUS

其中TOROIDAL_RADIUS是大半径,POLOIDAL_RADIUS是小半径。假设环面以原点为中心,其主要半径位于 XY 平面内。

它的工作原理是通过减去主半径矢量简单地将小圆“拉回”到原点。然后我们可以检查该点p是否在小圆内。

为此,首先使用 计算 XY 平面中的角度np.arctan2(y, x)

于 2021-09-19T17:27:00.427 回答