矩形射线交点

时间:2013-07-20 01:49:39

标签: c# .net linear-algebra raytracing

我在C#中制作一个简单的Ray Traycer。对于我的视口,我有一个矩形类。

public class Rectangle3D
{
    public readonly Point3D Point1;
    public readonly Point3D Point2;
    public readonly Point3D Point3;
    public readonly Point3D Point4;

    public Rectangle3D(Point3D point1, Point3D point2, Point3D point3, Point3D point4)
    {
        this.Point1 = point1;
        this.Point2 = point2;
        this.Point3 = point3;
        this.Point4 = point4;
    }

    public Point3D FindCrossPoint(Ray ray)
    {
        //Intersection
    }

我将如何编写此功能。非常感谢帮助。 P.S Point3D具有所有需要的功能。如交叉,规范化等......

1 个答案:

答案 0 :(得分:2)

好吧,让我们以答案的形式而不是所有这些评论。

将问题分解为子问题:

1)找到矩形所在的平面,格式为Ax+By+Cz+D=0两种方法:

方法一:

  • 求出两条正交线的方程;根据定义,矩形的边缘将是正交的。

  • 给定两条正交线,弄清楚如何以Ax+By+Cz+D=0的形式得到线条定义的平面方程。

这里有一些提示:

  • 假设两条正交线都穿过原点。让他们成为矢量。这两个载体的叉积是什么意思?

  • 交叉乘积矢量与您正在寻找的飞机之间有什么关系?具体来说,叉积矢量与常数A,B和C之间的关系是什么?

方法二:

  • 选择矩形中不包含在一条线上的三个点;显然任何三个角都可以。用Ax+By+Cz+D=0中的x,y,z替换那些点来制作三个新方程;解决A,B,C和D的那些方程。

2)获得平面方程后,计算出平面与光线的交点。

3)现在您有交叉点 - 如果它存在,请记住,光线可能与平面平行或者可能完全在平面内 - 检查交叉点是否在矩形内。< / p>

  • 提示:这是“一个多边形内的这个点”这个更普遍的问题的一个特例。