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;
        }

计算空间直线与平面的交点 (C#)的更多相关文章

  1. OpenCASCADE直线与平面求交

    OpenCASCADE直线与平面求交 在<解析几何>相关的书中都给出了直线和平面的一般方程和参数方程.其中直线的一般方程有点向式形式的. 由于过空间一点可作且只能作一条直线平行于已知直线, ...

  2. 简单几何(直线与圆的交点) ZOJ Collision 3728

    题目传送门 题意:有两个一大一小的同心圆,圆心在原点,大圆外有一小圆,其圆心有一个速度(vx, vy),如果碰到了小圆会反弹,问该圆在大圆内运动的时间 分析:将圆外的小圆看成一个点,判断该直线与同心圆 ...

  3. HDU2050 由直线分割平面推广到折线分割平面

    直线分割平面问题: 加入已有n-1条直线,那么再增加一条直线,最多增加多少个平面? 为了使增加的平面尽可能的多,我们应该使新增加的直线与前n条直线相交,且不存在公共交点.那么我们可以将新增加的这条直线 ...

  4. max of 直线划平面

    在一个无限延伸平面上有一个圆和n条直线,这些直线中每一条都在一个圆内,并且同其他所有的直线相交,假设没有3条直线相交于一点,试问这些直线最多将圆分成多少区域. Input 第一行包含一个整数T,(0& ...

  5. 用python计算一条射线到两个平面的交点

    前两天,一个朋友找我(半个程序猿)用python帮他写数学模型,当时的我直接是懵逼的,当听到三维啥的时候,整个人就好了,最终在周末花了3个小时把逻辑理了一遍,给小伙伴一个满意的答复了,话不多说,我来整 ...

  6. UVALive 6263 The Dragon and the knights --统计,直线分平面

    题意:给n条直线,将一个平面分成很多个部分,再给m个骑士的坐标,在一个部分内只要有一个骑士即可保护该部分,问给出的m个骑士是不是保护了所有部分. 解法:计算每个骑士与每条直线的位置关系(上面还是下面) ...

  7. sizeof计算空间大小的总结

    sizeof,看起来还真不简单,总结起来还是一大堆的东西,不过这是笔试面试中出现比较频繁的,我也是考过才觉得很重要,有些规则如果不注意,还真是拿到一道题目摸不着头脑,所有总结一下,方面忘记的时候瞄一瞄 ...

  8. [转]sizeof计算空间大小的总结

    原文链接:http://www.cnblogs.com/houjun/p/4907622.html 关于sizeof的总结 1.sizeof的使用形式:sizeof(var_name)或者sizeof ...

  9. OpenCV计算点到直线的距离 数学法

    我们在检测图像的边缘图时,有时需要检测出直线目标,hough变换检测出直线后怎么能更进一步的缩小区域呢?其中,可以根据距离来再做一判断,就涉及到了点与直线的距离问题. 点到直线距离代码如下: //== ...

随机推荐

  1. FastReport代码计算高度

    Dim iHeight As Double        Dim columnData_form As DataSourceBase             iHeight=Page1.TopMarg ...

  2. 去哪儿网mysql语法审核工具Inception正式开源

    Inception不仅仅是一个自动化审核工具,同时还具备执行SQL,并且生成对影响数据的回滚语句(类似于闪回的功能),这样一条龙便捷服务的工具.

  3. step by step 之餐饮管理系统二

    昨天写了餐饮管理系统的相关需求,得到了园友的一些好的建议,感到很高兴,确实写的也不全面,现在补充一下需要的业务,这次主要做的主要是前台收银系统,所以业务主要集中在前台点菜收银这块,而后面数据管理这块则 ...

  4. Dynamic CRM 2013学习笔记(十六)用JS控制Tab可见,可用

    一个Form里经常会有好几个Tab,有时要根据一些条件设置哪些Tab可用,可见.下面就介绍下如何用JS对Tab进行控制. 1. 控制可见   function setTabVisableByName( ...

  5. node-webkit教程(9)native api 之Tray(托盘)

    node-webkit教程(9)native api 之Tray(托盘) 文/玄魂 目录 node-webkit教程(9)native api 之Tray(托盘) 前言 9.1  Tray简介 9.2 ...

  6. 冲刺阶段 day5

    day5 项目进展 今天我们组的成员聚在一起进行了讨论,首先我们继续编写了学生管理这部分的代码,然后负责数据库的同学完成了数据库的部分,最后进行了学生管理这部分的代码复审 存在问题 因为代码不是一天之 ...

  7. 简单SQL分页

    Select * From (     Select     Row_Number() Over(Order By 表1.CreateTime desc) as rowId,     表1.Alumn ...

  8. [JS9] document's bgColor改变背景颜色

    <HTML> <HEAD> <TITLE>设置背景颜色</TITLE> </HEAD> <BODY> <CENTER> ...

  9. java包装类的作用

    转载自http://zhidao.baidu.com/question/2052192149152534987.html 第一,基本数据类型之间的相互转换不是都可以制动转换的,而你强制转换又会出问题, ...

  10. CentOS Minimal版最小化安装后VMware联网详解

    最近想搞个mailman邮件列表,又不想在我常用的CentOS 6.4上做实验,怕破坏了环境,于是就想装个试验机,又嫌它占空间太大,于是找了半天发现CentOS 6.0的minimal版本最适合了,装 ...