计算空间直线与平面的交点 (C#)

 public class NGlbVec3d
    {// 三维点
        public double x, y, z;
        public NGlbVec3d()
        {
        }
        public NGlbVec3d(double vx, double vy, double vz)
        {
            x = vx; y = vy; z = vz;
        }
        public static double operator *(NGlbVec3d a, NGlbVec3d b)
        {
            return (a.x * b.x + a.y * b.y + a.z * b.z);
        }
        public static NGlbVec3d operator -(NGlbVec3d a, NGlbVec3d b)
        {
            NGlbVec3d t = new NGlbVec3d();
            t.x = a.x - b.x;
            t.y = a.y - b.y;
            t.z = a.z - b.z;
            return t;                 
        }
        public static NGlbVec3d operator ^(NGlbVec3d a, NGlbVec3d b)
        {
            NGlbVec3d t = new NGlbVec3d();
            t.x = a.y*b.z - a.z*b.y;
            t.y = a.z*b.x - a.x*b.z;
            t.z = a.x*b.y - a.y*b.x;
            return t;
        }
        public void set(double vx, double vy, double vz)
        {
            x = vx; y = vy; z = vz;
        }
        public void normalize()
        {
           double t = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2) + Math.Pow(z, 2));     
           if (t == 0.0) return;
           x = x / t;  y = y / t; z = z / t;
        }
    }
    public class NGlbPlane
    {// 平面
        public double A,B,C,D;
        public NGlbPlane()
        {

        }
        public NGlbPlane(double a, double b, double c, double d)
        {
            A = a; B = b; C = c; D = d;
        }
        public NGlbPlane(NGlbVec3d v1, NGlbVec3d v2, NGlbVec3d v3)
        {// 根据三个点计算平面方程 A,B,C,D
            NGlbVec3d v = (v3 - v1) ^ (v2 - v1);
            v.normalize();
            A = v.x;
            B = v.y;
            C = v.z;
            D = -(A * v1.x + B * v1.y + C * v1.z);
        }
    } 

// 计算线ln[2] 与平面plane[4]的交点 interPt
        private bool IsLineInterPlane(NGlbVec3d[] ln, NGlbPlane plane, NGlbVec3d interPt)             
        {
            // 直线方程P(t) = Q + tV
            NGlbVec3d Q = ln[0];
            NGlbVec3d V = ln[1] - ln[0];
            V.normalize();

            // 平面方程 N * P(x,y,z) + D = 0
            NGlbVec3d N = new NGlbVec3d(plane.A,plane.B,plane.C);
            //N.normalize();
            double D = plane.D;

            double s = N * V;

            if (s == 0.0) // 直线与平面平行
                return false;

            double q = - D - N * Q;
            double t = q / s;
            // 将t带入直线方程P(t) = Q + tV,就可得到直线与平面的交点
            interPt.x = Q.x + t * V.x;
            interPt.y = Q.y + t * V.y;
            interPt.z = Q.z + t * V.z;
            return true;
        }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在三维空间中,要计算直线平面交点,可以使用以下方法: ```csharp public Vector3 CalculateLinePlaneIntersection(Vector3 linePoint, Vector3 lineDirection, Vector3 planePoint, Vector3 planeNormal) { // 计算直线平面的方向向量的点积 float dotProduct = Vector3.Dot(planeNormal, lineDirection); // 如果直线平面平行,即点积接近于0,则返回Vector3.zero表示无交点 if (Mathf.Approximately(dotProduct, 0)) { return Vector3.zero; } // 计算直线起点到平面点的向量 Vector3 startToPlane = planePoint - linePoint; // 计算直线平面交点距离 float distance = Vector3.Dot(startToPlane, planeNormal) / dotProduct; // 计算交点坐标 Vector3 intersectionPoint = linePoint + distance * lineDirection; return intersectionPoint; } ``` 以上代码使用了 `Vector3` 类型来表示三维空间中的点和向量。`CalculateLinePlaneIntersection` 方法接受四个参数:直线上的一点 `linePoint`,直线的方向向量 `lineDirection`,平面上的一点 `planePoint` 和平面的法向量 `planeNormal`。该方法首先计算直线平面的方向向量的点积,如果点积接近于 0,则表示直线平面平行,无交点,返回 `Vector3.zero`。否则,计算直线起点到平面点的向量与平面法向量的点积除以直线平面的方向向量的点积,得到交点距离。最后,通过交点距离计算交点坐标。 请注意,以上代码仅适用于使用 `Vector3` 类型表示三维空间中的点和向量,并且平面的法向量已经被归一化的情况。如果你在实际应用中使用其他类型或需要进行额外的处理,请根据具体情况进行相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值