面用osg::Matrix  来表示。

osg::Vec3 ptOri = osg::(0,0,0) * mat;(面的原点)

osg::Vec3 vecX = mat.getRotate() * osg::X_AXIS ;(X轴)

osg::Vec3 vecY = mat.getRotate() * osg::Y_AXIS ;(Y轴)

要求两个面的交线,首先要判断两个面是否相交,方法是判断两个面的Z轴夹角,如果夹角差不多为0或者Pi那么认为面不想交,没有相交。

<pre name="code" class="cpp">double AngleTo(const osg::Vec3d &vec1, const osg::Vec3d&vec2)
{assert(vec1.length() > 1.E-7 && vec2.length() > 1.E-7);osg::Vec3d v1 = vec1, v2 = vec2;v1.normalize();v2.normalize();double dTemp = (v1 * v2) / (v1.length() * v2.length());if (dTemp > 1.0){dTemp = 1.0;}if (dTemp < -1.0){dTemp = -1;}return acos(dTemp);
}int Intersect3dLineSegmentWithPlane( const osg::Vec3d &lineStartPoint, const osg::Vec3d &lineEndPoint, const osg::Vec3d &planeNormal, const osg::Vec3d &planePoint, osg::Vec3d &intPoint )
{osg::Vec3d other = lineEndPoint - lineStartPoint;osg::Vec3d vector2 = lineStartPoint - planePoint;double num = planeNormal * other;double num2 = -planeNormal * vector2;if (fabs(num) < 1.0E-6)){if (num2 == 0.0){return 2;}else{return 0;}}double num3 = num2 / num;if ((num3 < 0.0) || (num3 > 1.0)){return 0;}intPoint = lineStartPoint + other * num3;return 1;
}// 描述:  求两个面的交线
// matBase:一个面的位置矩阵
// matThis: 另外一个面的位置矩阵
// pt1: 交线点1    (世界坐标系)
// pt2: 交线点2 (世界坐标系)
// dTolAngle: 面夹角容差(如果两个面夹角小于等于这个值,那么认为面平行)
// 返回值:是否相交
bool IntersectWith( const osg::Matrix &matBase, const osg::Matrix &matThis,osg::Vec3d &pt1, osg::Vec3d &pt2, double dTolAngle /*= osg::PI / 36.0*/ )
{bool bOk = false;osg::Vec3d vecZThis = matThis.getRotate() * osg::Z_AXIS;osg::Vec3d vecZBase = matBase.getRotate() * osg::Z_AXIS;double dAngle = AngleTo(vecZThis, vecZBase);if ( dAngle - osg::PI_2 > 1.0E-7){dAngle = osg::PI - dAngle;}// 判断方向 if (dAngle - dTolAngle > 1.0E-7){osg::Vec3d vecLine = vecZBase ^ vecZThis;   // 两个面相交线向量osg::Vec3d vecLineInThis = matThis.getRotate().inverse() * vecLine; // 到自身坐标系里// 相交线垂直的向量osg::Quat quat;quat.makeRotate(osg::PI_2, osg::Z_AXIS);vecLineInThis = quat * vecLineInThis;double dLength = 10000.0;osg::Vec3d pt1InThis = vecLineInThis * dLength;osg::Vec3d pt2InThis = -pt1InThis;// 变换到世界坐标系pt1InThis = pt1InThis * matThis;pt2InThis = pt2InThis * matThis;// 计算这条垂线和基本面的交点osg::Vec3d ptRet;osg::Vec3d ptOri = osg::Vec3d(0,0,0) * matBase;int iRet = Intersect3dLineSegmentWithPlane(pt1InThis, pt2InThis, vecZBase, ptOri, ptRet);assert(iRet == 1);// 然后根据交线向量求出两个点来pt1 = ptRet + vecLine * dLength;pt2 = ptRet - vecLine * dLength;bOk = true;}return bOk;
}

osg 两个面求交线相关推荐

  1. 空间中两个平面求交线

    欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击. 话题:给出2个平面方程,求解交线方程 A1x+B1y+C1z+D1=0A_1x+B_1y+C_1z+D_1=0A1​x+B1​y ...

  2. matlab两曲面的交线,MATLAB里面求两相交三维曲面交线的画法

    问题描述: MATLAB里面求两相交三维曲面交线的画法 原题是这样的,将z1=x.^2+2*y.^2与z2=a的曲面图形和交线图形分别画在两张图上(用subplot) 我的程序是这样的: [x,y]= ...

  3. 两个链表求交集_实现两个排序链表的并集和交集

    两个链表求交集 In computer science, a linked list is a linear collection of data elements, whose order is n ...

  4. 两个整数求平均值,防止溢出的问题

    两个整数求平均值,防止溢出的问题 http://bylijinnan.iteye.com/blog/1463337 bigInteger 没有上限,取决于计算机的内存: https://www.jia ...

  5. python中对两个 list 求交集,并集和差集

    python中对两个 list 求交集,并集和差集: 1.首先是较为浅白的做法: >>> a=[1,2,3,4,5,6,7,8,9,10] >>> b=[1,2,3 ...

  6. python中交集并集用什么符号表示_Python实现两个list求交集,并集,差集的方法示例...

    本文实例讲述了Python实现两个list求交集,并集,差集的方法.分享给大家供大家参考,具体如下: 在python中,数组可以用list来表示.如果有两个数组,分别要求交集,并集与差集,怎么实现比较 ...

  7. 设计一个抽象类图形类,在该类中包含有至少两个抽象方法求周长和求面积,分别定义圆形类、长方形类、正方形类、三角形类来继承图形类,并实现上述两个方法

    设计一个抽象类图形类,在该类中包含有至少两个抽象方法求周长和求面积,分别定义圆形类.长方形类.正方形类.三角形类来继承图形类,并实现上述两个方法 设计抽象类 就要使用abstract关键字,抽象类中的 ...

  8. HDU 4607 Park Visit 两次DFS求树直径

    两次DFS求树直径方法见 这里. 这里的直径是指最长链包含的节点个数,而上一题是指最长链的路径权值之和,注意区分. K <= R: ans = K − 1; K > R:   ans = ...

  9. Python两种方式求多个数的最大公因数(HCF)和最小公倍数(LCM)

    Python两种方式求多个数的最大公因数(HCF)和最小公倍数(LCM) 最大公因数 1. 列表排序 2. 将列表分为两部分 3. 求最大公因数的质因子 4. 得到结果 5. 完整程序 最小公倍数 另 ...

最新文章

  1. 基于SAP的中国式数据分析浅谈
  2. mysql数据库崩溃恢复_MySQL数据库表维护和崩溃恢复
  3. Java如何避免重量级锁,Java 中锁是如何一步步膨胀的(偏向锁、轻量级锁、重量级锁)...
  4. spring学习(6):使用xml方式实现spring基本应用
  5. 记录一次StackOverflowError问题
  6. [置顶文章]打豆豆的一些小问题、不小心会忘记的知识点
  7. 如何在SQL Server中检查日期是否为假期
  8. Excel的python读写
  9. python中sorted方法和列表的sort方法使用详解
  10. 计算机中键盘可以共享吗,两个电脑怎么共用一个键盘
  11. Python(九)- 音频文字转换
  12. html 限制文本框的长度,JavaScript 限制文本框输入长度(支持字符限制)
  13. echarts全国各市地图坐标
  14. python 中无限循环_Python中如何解决无限循环的问题
  15. Android通用适配器CommonAdapter
  16. pycharm运行python程序没有解释器怎么办
  17. 4t gpt索引 linux如何挂载,LINUX教学:Ubuntu 16.04通过GPT挂载硬盘
  18. 使用临时邮箱接收验证码需要注意几点,分享临时发送邮件的邮箱有哪些
  19. NIST cybersecurity framework的五个核心功能
  20. Edge浏览器打开新建标签页速度很慢?如何解决?

热门文章

  1. 可观测性-可视化-Grafana中table列的gradient guage填充度问题
  2. [概念]神经网络的种类(前馈神经网络,反馈神经网络,图网络)
  3. P4 tutorials MRI(INT)
  4. python绘制渐变图_Python利用imshow制作自定义渐变填充柱状图(colorbar)
  5. MySQL第二次作业--库表操作
  6. 神经网络入门基础知识 neural networks basics
  7. 挖掘机技术到底哪家强
  8. pycharm可以运行,打包报错 ModuleNotFoundError: No module named ‘frontend‘
  9. 中国睡眠呼吸机市场研究与未来预测报告(2021版)
  10. 基于python的步态分析_基于Python的步态周期及三维肢体活动角度算法_2017108489397_说明书_专利查询_专利网_钻瓜专利网...