给出一个整数 3D坐标系,一个中心点 P ,某个方向上的矢量 V 和一个最大球体半径 R :
我想仅以 P 并沿 V 的方向进行迭代,直到达到最大半径< strong> 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, 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));
}
查看示例图片
应捕获的第一个坐标为:
然后,稍微扩大角度(橙色圆锥形):
进一步扩大角度(绿色圆锥体):
我对接下来的猜测是:
其他注释和观察结果:
答案 0 :(得分:0)
迭代您球体中的所有整数位置Q
在for
范围内的x,y,z
中,简单的3x嵌套<P-R,P+R>
循环将完成。只需检查球体内部即可
u=(x,y,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"