如何解决如何使用扩展的球形扇形圆锥来迭代坐标球?
给出一个整数 3D坐标系,一个中心点 P ,某个方向上的矢量 V 和一个最大球体半径 R :
我想仅以 P 并沿 V 的方向进行迭代,直到达到最大半径 R 。
然后,对于某个小角度 T ,将圆锥(或球形扇形)内的所有点围绕 V 进行迭代。
逐步扩展 T ,直到T为pi / 2弧度,并且球体中的每个点都已迭代。
我需要使用O(1)空间复杂度来做到这一点。因此,点的顺序无法预先计算/排序,而必须自然地由一些数学得出。
示例:
// Vector3 represents coordinates x,y,z
// where (typically) x is left/right,y is up/down,z is depth
Vector3 center = Vector3(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,z));
}
查看示例图片
应捕获的第一个坐标为:
- A(0,0),C(0,1,0),D(0,2,0),E(0,3,0),B(0,4,0)
然后,稍微扩大角度(橙色圆锥形):
- K(-1,3),X(1,3),(0,3),(0,-1,3)
进一步扩大角度(绿色圆锥体):
- F(1,3),(-1,-1,3),(1,-1,3)(-1,3)
我对接下来的猜测是:
- L(1,2),(-1,2),(0,2),(0,-1,2)
- M(2,3)在之后会被击中
其他注释和观察结果:
-
如果矢量垂直于轴并且起源于整数点,则
- 一个圆锥体将在其底部达到四个点的 max 。视角度而定,它可能还会沿着圆锥壁撞到点
- 我正在尝试用c ++做到这一点
- 我知道如何通过将V和PX与T的角度进行比较来检查点X是否在任何给定的圆锥或球面矢量内,并且目前正在将此知识用于较小的解决方案。
- 这不是作业问题,我正在开发3D视频游戏〜
解决方法
-
迭代您球体中的所有整数位置
Q
在
for
范围内的x,y,z
中,简单的3x嵌套<P-R,P+R>
循环将完成。只需检查球体内部即可u=(x,z)-P; dot(u,u) <= R*R
-
测试点
Q
是否正好位于V
只需通过点积检查
PQ
和V
之间的角度即可:u = Q-P u = u/|u| v = V/|V| if (dot(u,v)==1) point Q is on V
-
测试点是否恰好在“圆锥”的表面上
只需通过点积检查
PQ
和V
之间的角度即可: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"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。