计算空间直线与平面的交点 (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;
}
计算空间直线与平面的交点 (C#)的更多相关文章
- OpenCASCADE直线与平面求交
OpenCASCADE直线与平面求交 在<解析几何>相关的书中都给出了直线和平面的一般方程和参数方程.其中直线的一般方程有点向式形式的. 由于过空间一点可作且只能作一条直线平行于已知直线, ...
- 简单几何(直线与圆的交点) ZOJ Collision 3728
题目传送门 题意:有两个一大一小的同心圆,圆心在原点,大圆外有一小圆,其圆心有一个速度(vx, vy),如果碰到了小圆会反弹,问该圆在大圆内运动的时间 分析:将圆外的小圆看成一个点,判断该直线与同心圆 ...
- HDU2050 由直线分割平面推广到折线分割平面
直线分割平面问题: 加入已有n-1条直线,那么再增加一条直线,最多增加多少个平面? 为了使增加的平面尽可能的多,我们应该使新增加的直线与前n条直线相交,且不存在公共交点.那么我们可以将新增加的这条直线 ...
- max of 直线划平面
在一个无限延伸平面上有一个圆和n条直线,这些直线中每一条都在一个圆内,并且同其他所有的直线相交,假设没有3条直线相交于一点,试问这些直线最多将圆分成多少区域. Input 第一行包含一个整数T,(0& ...
- 用python计算一条射线到两个平面的交点
前两天,一个朋友找我(半个程序猿)用python帮他写数学模型,当时的我直接是懵逼的,当听到三维啥的时候,整个人就好了,最终在周末花了3个小时把逻辑理了一遍,给小伙伴一个满意的答复了,话不多说,我来整 ...
- UVALive 6263 The Dragon and the knights --统计,直线分平面
题意:给n条直线,将一个平面分成很多个部分,再给m个骑士的坐标,在一个部分内只要有一个骑士即可保护该部分,问给出的m个骑士是不是保护了所有部分. 解法:计算每个骑士与每条直线的位置关系(上面还是下面) ...
- sizeof计算空间大小的总结
sizeof,看起来还真不简单,总结起来还是一大堆的东西,不过这是笔试面试中出现比较频繁的,我也是考过才觉得很重要,有些规则如果不注意,还真是拿到一道题目摸不着头脑,所有总结一下,方面忘记的时候瞄一瞄 ...
- [转]sizeof计算空间大小的总结
原文链接:http://www.cnblogs.com/houjun/p/4907622.html 关于sizeof的总结 1.sizeof的使用形式:sizeof(var_name)或者sizeof ...
- OpenCV计算点到直线的距离 数学法
我们在检测图像的边缘图时,有时需要检测出直线目标,hough变换检测出直线后怎么能更进一步的缩小区域呢?其中,可以根据距离来再做一判断,就涉及到了点与直线的距离问题. 点到直线距离代码如下: //== ...
随机推荐
- iOS自动适配
自iphone4s以后,苹果先后推出了iphone5.iphone5s.iphone6.iphone6plus.iphone6s.iphone6splus这些新的机型,它们的屏幕大小各有所异,从此给我 ...
- [Xamarin] 關於發出Notification 的大小事 (转帖)
關於Anroid 的使用者來說,Notification 是一個非常會看到且用到的功能 他可以提醒使用者甚麼東西需要待處理,像是郵件或是會議的提醒等.. 甚至有些APP ,直接使用Notificati ...
- SqlServer=>MySql
原文:http://www.cnblogs.com/andrew-blog/archive/2011/12/03/SQL_mss2sql.html#3242272 工具:http://files.cn ...
- C语言 串 顺序结构 实现
一个能够自动扩容的顺序结构的串 ArrString (GCC编译). /** * @brief C语言 串 顺序结构 实现 * @author wid * @date 2013-11-01 * * @ ...
- 从源代码分析Android-Universal-Image-Loader图片下载技巧
在手机上尤其需要考虑网络对图片下载的影响,常见的情况是在2G网络.在3G网络需要不同的下载策略,也就是说在慢速网络与快速网络中下载需要考虑不同的策略.一种常见的策略就是Android客户端和服务端相配 ...
- 编写高质量代码改善C#程序的157个建议读书笔记【11-20】
章节索引 建议11:区别对待 == 和Equals 建议12:重写Equals也要重写GetHashCode 建议13:为类型输出格式化字符串 建议14:正确实现浅拷贝和深拷贝 建议15:使用dyna ...
- SignalR + MVC5 简单示例
本文和前一篇文章很类似,只不过是把 SignalR 应用在了 MVC 中 新建项目,选择 MVC 模板 安装 SignalR Install-Package Microsoft.AspNet.Sign ...
- Microsoft Azure开发体验 – 网络报名系统
去年底RP好抢到了中国版Azure的使用机会,最近社团里讨论到9月份招新的问题,就用Azure Website和Azure Table Storage打造了这个报名系统. 网站放在 http://jo ...
- Nhibernate基础使用教程以及简易封装
1.Nhibernate简介 NHibernate是一个面向.NET环境的对象/关系数据库映射工具.对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技 ...
- Java-基础练习1
1. Java为什么能跨平台运行?请简述原理. 因为Java程序编译之后的代码不是能被硬件系统直接运行的代码,而是一种“中间码”——字节码.然后不同的硬件平台上安装有不同的Java虚拟机(J ...