英文:
The algorithm to find if a line and a cube intersect in 3D space
问题
A line is defined by two (2) points A(Xa, Ya, Za), B(Xb, Yb, Zb)
一条线由两个(2)点A(Xa,Ya,Za)和B(Xb,Yb,Zb)定义。
A cube is defined by one (1) point C(Xc, Yc, Zc)
一个立方体由一个(1)点C(Xc,Yc,Zc)定义。
The cube is axis aligned, therefore its points are defined at (Xc, Yc, Zc) -> (Xc + 1, Yc + 1, Zc + 1)
该立方体是轴对齐的,因此其点被定义在(Xc,Yc,Zc)->(Xc + 1,Yc + 1,Zc + 1)。
I've tried using the 2D algorithm for the same problem and scaling it up another dimension, I was not able to get it to work.
我尝试使用相同问题的二维算法并将其扩展到另一个维度,但未能使其工作。
英文:
A line is defined by two (2) points A(Xa, Ya, Za), B(Xb, Yb, Zb)
A cube is defined by one (1) point C(Xc, Yc, Zc)
The cube is axis aligned, therefore it's points are defined at (Xc, Yc, Zc) -> (Xc + 1, Yc + 1, Zc + 1)
I've tried using the 2D algorithm for the same problem and scaling it up another dimension, i was not able to get it to work
答案1
得分: 1
以下是翻译好的代码部分:
一个可能的方法是将立方体视为被6个平面切割的一部分。然后只需通过这些平面切割线段,看是否有剩余。
为了方便(避免分别考虑线段、射线和线段),我们可以预先通过足够大的半径切割线段,以生成线段。
bool DoesLineIntersectCube(Line line, Cube cube)
{
projectedOrigin = Project(cube.Centre, line);
segment = Segment(projectedOrigin - line.Direction * 2, projectedOrigin + line.Direction * 2);
for (axis : {0, 1, 2})
{
direction = (0, 0, 0);
direction[axis] = 1;
segment = Cut(segment, MakePlane(cube.Centre + direction * 0.5, direction));
segment = Cut(segment, MakePlane(cube.Centre - direction * 0.5, -direction));
}
return !segment.IsEmpty();
}
希望这有所帮助。如果您需要任何进一步的帮助,请随时提问。
英文:
One of possible ways is to look at the cube as a part of space cut by 6 planes. Then just cut the line by those planes and see if anything left.
For convenience (to avoid considering line, ray and segment separately) we can cut the line preemptively by some large enough radius to make a segment from it.
bool DoesLineIntersectCube(Line line,Cube cube)
{
projectedOrigin=Project(cube.Centre,line);
segment=Segment(projectedOrigin-line.Direction*2,projectedorigin+line.Direction*2);
for(axis:{0,1,2})
{
direction=(0,0,0);
direction[axis]=1;
segment=Cut(segment,MakePlane(cube.Centre+direction*0.5,direction);
segment=Cut(segment,MakePlane(cube.Centre-direction*0.5,-direction);
}
return !segment.IsEmpty();
}
答案2
得分: 0
请看分离平面:
- 考虑由线段的一个端点和立方体的一条边(2个端点)定义的平面。
- 检查立方体的剩余6个顶点和线的另一个端点在平面的哪一侧。
- 如果立方体的6个顶点都在同一侧,但只有线的端点在相反的一侧,那么线段和立方体不相交。
对所有可能的平面执行此检查。
英文:
Find separating plane:
- Consider a plane defined by the one endpoint of the line segment and one edge(2 end points) of the cube.
- Check which side of the plane the cube's remaining 6 vertices and line's another endpoint are.
- If the cube's 6 vertices are on the same side but only the line's endpoint is on the opposite side, line segment and cube do not intersect.
Check this for all possible plane.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论