如何使用扩展的球形扇形(圆锥)来迭代坐标球?

时间:2020-08-10 18:39:59

标签: c++ loops graph 3d linear-algebra

给出一个整数 3D坐标系,一个中心点 P ,某个方向上的矢量 V 和一个最大球体半径 R

我想仅以 P 并沿 V 的方向进行迭代,直到达到最大半径< strong> R 。

然后,对于某个小角度 T ,将圆锥(或球形扇形)内的所有点围绕 V 进行迭代。

逐步扩展 T ,直到T为pi / 2弧度,并且球体中的每个点都已迭代。

我需要使用O(1)空间复杂度来做到这一点。因此,点的顺序无法预先计算/排序,而必须自然地由一些数学得出。

Sphere with expanding spherical sector

示例:

// Vector3 represents coordinates x, y, z
// where (typically) x is left/right, y is up/down, z is depth
Vector3 center = Vector3(0, 0, 0); // could be anything
Vector3 direction = Vector3(0, 100, 0); // could be anything
int radius = 4;
double piHalf = acos(0.0); // half of pi

std::queue<Vector3> list;
for (double angle = 0; angle < piHalf; angle+= .1)
{
    int x = // confusion begins here
    int y = // ..
    int z = // ..
    list.push(Vector3(x, y, z));
}

查看示例图片

应捕获的第一个坐标为:

  • A(0,0,0),C(0,1,0),D(0,2,0),E(0,3,0),B(0,4,0)

然后,稍微扩大角度(橙色圆锥形):

  • K(-1,0,3),X(1,0,3),(0,1,3),(0,-1,3)

进一步扩大角度(绿色圆锥体):

  • F(1,1,3),(-1,-1,3),(1,-1,3)(-1,1,3)

我对接下来的猜测是:

  • L(1,0,2),(-1,0,2),(0,1,2),(0,-1,2)
  • M(2,0,3)在之后会被击中

enter image description here

其他注释和观察结果:

    如果矢量垂直于轴并且起源于整数点,则
  • 一个圆锥体将在其底部达到四个点的 max 。视角度而定,它可能还会沿着圆锥壁撞到点
  • 我正在尝试用c ++做到这一点
  • 我知道如何通过将V和PX与T的角度进行比较来检查点X是否在任何给定的圆锥或球面矢量内,并且目前正在将此知识用于较小的解决方案。
  • 这不是作业问题,我正在开发3D视频游戏〜

1 个答案:

答案 0 :(得分:0)

  1. 迭代您球体中的所有整数位置Q

    for范围内的x,y,z中,简单的3x嵌套<P-R,P+R>循环将完成。只需检查球体内部即可

    u=(x,y,z)-P;
    dot(u,u) <= R*R
    
  2. 测试点Q是否正好位于V

    只需通过点积检查PQV之间的角度即可:

    u = Q-P
    u = u/|u|
    v = V/|V|
    if (dot(u,v)==1) point Q is on V
    
  3. 测试点是否恰好在“圆锥”的表面上

    只需通过点积检查PQV之间的角度即可:

    u = Q-P
    u = u/|u|
    v = V/|V|
    if (dot(u,v)==cos(T/2)) point Q is on "cone"
    

    我假设T是完整的“圆锥”角而不是一半。

请注意,您需要为此使用floats/double并进行比较,以确保出现错误,例如:

if (fabs(dot(u,v)-1.0     )<1e-6) point Q is on V
if (fabs(dot(u,v)-cos(T/2))<1e-6) point Q is on "cone"