给定圆环的原点和半径,如何确定点p(x,y,z)是否在圆环内部?

我正在尝试在方块游戏中创建一个三维环面体,因此需要评估一系列坐标,查看它们是否在环面内。我使用球体的方式是:

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轴上)以及一个起点,我尝试的任何评估表达式都没有给我任何接近环面的东西。

点赞
用户1442917
用户1442917

根据此处的说法,这是测试表达式符号的问题:

(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-19 21:04:13
用户2799136
用户2799136

上面的公式对我不起作用。考虑 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-26 15:45:07
用户2035671
用户2035671

保留原本的 markdown 格式:

The solution by Paul didn't work for me. Instead, I came up with this simple working solution in 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 平面上。

这个函数实现的方法很简单,只需将小圆环“推回”至原点,通过减去大半径向量(在 XY 平面上)。 然后我们可以检查点 p 是否在小圆环内部。

在计算前,需要根据 np.arctan2(y, x) 获取 XY 平面中的角度。

2021-09-19 17:27:00