zoukankan      html  css  js  c++  java
  • 计算空间直线与平面的交点 (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;
            }

  • 相关阅读:
    nginx 点播mp4方法
    NGINX 添加MP4、FLV视频支持模块
    用nginx搭建基于rtmp或者http的flv、mp4流媒体服务器
    obs nginx-rtmp-module搭建流媒体服务器实现直播 ding
    利用nginx搭建RTMP视频点播、直播、HLS服务器
    使用nginx搭建媒体点播服务器
    nginx支持flv MP4 扩展nginx_mod_h264_streaming,nginx-rtmp-module-master,yamdi
    the odb manual
    Zookeeper——启动闪退
    Zookeeper之启动常见错误及解决方法
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/6187719.html
Copyright © 2011-2022 走看看