空间中任意多边形相交算法

        public static string Mypf_Function()
        {
            var lee = 0;
            float d1 = 0, d2 = 0;
            var ret = "多面体不相交!!";

            //空间两多面体
            p1[0] = new PolytopePoint(0, 0, 1);
            p1[1] = new PolytopePoint(0, 0, 2);
            p1[2] = new PolytopePoint(2, 2, 2);
            p1[3] = new PolytopePoint(2, 2, 1);

            p2[0] = new PolytopePoint(2, 1, 0);
            p2[1] = new PolytopePoint(0, 1, 0);
            p2[2] = new PolytopePoint(0, 1, 3);
            p2[3] = new PolytopePoint(2, 1, 3);

            var x1 = p1[1].X - p1[0].X;
            var y1 = p1[1].Y - p1[0].Y;
            var z1 = p1[1].Z - p1[0].Z;

            var x2 = p1[2].X - p1[0].X;
            var y2 = p1[2].Y - p1[0].Y;
            var z2 = p1[2].Z - p1[0].Z;

            var a1 = p2[1].X - p2[0].X;
            var b1 = p2[1].Y - p2[0].Y;
            var c1 = p2[1].Z - p2[0].Z;

            var a2 = p2[2].X - p2[0].X;
            var b2 = p2[2].Y - p2[0].Y;
            var c2 = p2[2].Z - p2[0].Z;

            //两面法向量
            var n1 = new PolytopePoint(y1 * z2 - z1 * y2, z1 * x2 - x1 * z2, x1 * y2 - y1 * x2);
            var n2 = new PolytopePoint(b1 * c2 - c1 * b2, c1 * a2 - a1 * c2, a1 * b2 - b1 * a2);

            //第一平面点到第二平面的有符号距离
            var a=new float[4];
            for (var i = 0; i < 4; i++)
            {
                a[i] = n1.X * (p2[i].X - p1[0].X) + n1.Y * (p2[i].Y - p1[0].Y) + n1.Z * (p2[i].Z - p1[0].Z);
            }

            //不相交条件
            if (a[0] * a[1] > 0 && a[0] * a[2] > 0 && a[0] * a[3] > 0)
            {
                return ret;
            }

            //共面
            if (Math.Abs(a[0]) < 0.00000000000001 && Math.Abs(a[1]) < 0.00000000000001 && Math.Abs(a[2]) < 0.00000000000001 && Math.Abs(a[3]) < 0.00000000000001)
            {
                ret = "两多面体共面!";
                return ret;
            }

            //第一平面点到第一平面的有符号距离
            var b = new float[4];
            for (var i = 0; i < 4; i++)
            {
                b[i] = n2.X * (p1[i].X - p2[0].X) + n2.Y * (p1[i].Y - p2[0].Y) + n2.Z * (p1[i].Z - p2[0].Z);
            }

            for (var i = 0; i < 3; i++)
            {
                for (var j = 0; j < 3; j++)
                {
                    //第二平面上的夹边边对存在条件
                    if (a[i] * a[i + 1] < 0)
                    {
                        //第一平面上的夹边边对存在条件
                        if (b[j] * b[j + 1] < 0)
                        {
                            var l = p1[j + 1].X - p1[j].X;
                            var m = p1[j + 1].Y - p1[j].Y;
                            var n = p1[j + 1].Z - p1[j].Z; 

                            var o = p2[i + 1].X - p2[i].X;
                            var p = p2[i + 1].Y - p2[i].Y;
                            var q = p2[i + 1].Z - p2[i].Z;

                            //一二面上各取一条夹边组成边对与向量nt垂直
                            var nt=new PolytopePoint(m*q-n*p,n*o-l*q,l*p-m*o);

                            if (lee == 0)
                            {
                                d1 = nt.X*(p1[i].X - p2[j].X) + nt.Y*(p1[i].Y - p2[j].Y) + nt.Z*(p1[i].Z - p2[j].Z);
                                lee++;
                            }
                            else
                            {
                                d2 = nt.X * (p1[i].X - p2[j].X) + nt.Y * (p1[i].Y - p2[j].Y) + nt.Z * (p1[i].Z - p2[j].Z);
                            }

                            //面相交的条件
                            if (d1 * d2 < 0 || (Math.Abs(d1) < 0.00000000000001 && Math.Abs(d2) < 0.00000000000001))    //稍有缺陷  把条件放宽泛至只要有线相交多面体就相交
                            {
                                ret = "两多面体相交!";
                                return ret;
                            }
                        }
                    }
                }
            }

            ret = "异常";
            return ret;
        }

  

时间: 2024-08-11 05:44:02

空间中任意多边形相交算法的相关文章

hdu3060Area2(任意多边形相交面积)

链接 多边形的面积求解是通过选取一个点(通常为原点或者多边形的第一个点)和其它边组成的三角形的有向面积. 对于两个多边形的相交面积就可以通过把多边形分解为三角形,求出三角形的有向面积递加.三角形为凸多边形,因此可以直接用凸多边形相交求面积的模板. 凸多边形相交后的部分肯定还是凸多边形,所以只需要判断哪些点是相交部分上的点,最后求下面积. 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #inc

3D空间中射线与轴向包围盒AABB的交叉检测算法

引言 在上一节中,我讲述了如何实现射线与三角形的交叉检测算法.但是,我们应该知道,在游戏开发中,一个模型有很多的三角形构成,如果要对所有的物体,所有的三角形进行这种检测,就算现在的计算机运算能力,也是无法高效的完成.所以,我们需要通过其他的手段来提早剔除一些不可能发生交叉的物体,这种早退的思想,大量的运用在3D游戏技术中.在本篇文章中,我将像大家讲述如何实现射线与轴向包围盒AABB的交叉检测.如果读者不明白什么是轴向包围盒,请看这篇文章. Ray-AABB交叉检测算法 现如今,有很多的Ray-A

3D空间中射线与三角形的交叉检测算法

引言 射线Ray,在3D图形学中有很多重要的应用.比如,pick操作就是使用射线Ray来实现的,还有诸如子弹射线的碰撞检测等等都可以使用射线Ray来完成.所以,在本次博客中,将会简单的像大家介绍下,如何进行Ray-Triangle的交叉检测. Ray-Triangle交叉检测算法 在Tomas Moller的MT97论文中,提出了一种新的算法.这种算法能够减少以前进行Ray-Triangle交叉检测所需要的内存消耗.在以前,进行Ray-Triangle交叉检测,主要是计算射线与三角形所构成的平面

任意多边形切割/裁剪(附C#代码实现)

本实现主要参考了发表于2003年<软件学报>的<一个有效的多边形裁剪算法>(刘勇奎,高云,黄有群)这篇论文,所使用的理论与算法大都基于本文,对论文中部分阐述进行了详细解释,并提取了论文中一些重要的理论加以汇总.另外对于论文描述无法处理的一些情况也进行了试探性的分析. 多边形裁剪用于裁剪掉被裁剪多边形(又称为实体多边形,后文用S表示)位于窗口(又称为裁剪多边形,后文用C表示)之外的部分.裁剪的结果多边形是由实体多边形位于裁剪多边形内的边界和裁剪多边形位于实体多边形内的边界组成的.见下

并行计算大作业之多边形相交(OpenMP、MPI、Java、Windows)

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 吐槽: 话说,相当郁闷,2015年,第一次打开博客,准备总结一下这一年.. 结果博客被封了= =! 今天,终于解封了,换了密码,换了密保.... 但是,写回顾的激情有点退散了.. 明后两天要上课,明天还要验收一个综合设计大作业,再后两天要考试,再后两天继续上课,

在3D空间中绘制四边形

在3D空间中绘制四边形 四边形 GL_QUADS OpenGL的GL_QUADS图元用于绘制四边形,它根据每四个顶点绘制一个四边形. 注意,在使用四边形时,必需记住一个重要规则:一个四边形的四个角必须位于同一个平面中(不存在弯曲的四边形).如图所示 四边形带 GL_QUAD_STRIP 该图元指定一个连接的四边形带.它们都保持相同方向的环绕.如图所示 通用多边形 GL_POLYGON 我们可以用它绘制任意数量的多边形.与四边形一样,多边形的所有顶点也必须位于同一平面中.如果想越过这个规则,可以采

多边形扫描算法

一.多边形的扫描转换 一. 1.定义:把多边形的顶点表示转化为点阵表示(就是已知多边形的边界,如何找到多边形内部的点,即把多边形内部填上颜色) 2.表示方法:顶点表示和点阵表示 3.顶点表示:是用多边形的顶点序列来表示多边形. 优点:这种表示直观.几何意义强.占内存少,易于进行几何变换. 缺点:没有明确指出哪些像素在多边形内,故不能直接用于面着色. 4.点阵表示:用位于多边形内的像素集合来刻画多边形 优点:是光栅显示系统显示时所需的表现形式 缺点:丢失了许多几何信息(如边界,顶点等) 5.多边形

求任意多边形的面积(转)

原文地址:http://blog.csdn.net/sun_shine_/article/details/18799739 给定多边形的顶点坐标(有序),让你来求这个多边形的面积,你会怎么做?我们知道,任意多边形都可以分割为N个三角形,所以,如果以这为突破点,那么我们第一步就是把给定的多边形,分割为数个三角形,分别求面积,最后累加就可以了,把多边形分割为三角形的方式多种多样,在这里,我们按照如下图的方法分割: 图1 S点作为起始点(点1),a->e依次作为点2,3…….一个三角形的面积是怎样的呢

计算任意多边形的面积

对于凸多边形,很容易计算,如下图,以多边形的某一点为顶点,将其划分成几个三角形,计算这些三角形的面积,然后加起来即可.已知三角形顶点坐标,其三角形积可以利用向量的叉乘来计算. 对于凹多边形,如果还是按照上述方法划分成三角形,如下图,多边形的面积 = S_ABC + S_ACD + S_ADE, 这个面积明显超过多边形的面积. 我们根据二维向量叉乘求三角形ABC面积时,利用的是 这样求出来的面积都是正数,但是向量叉乘是有方向的,即 是有正负的,如果把上面第三个公式中的绝对值符号去掉,即 ,那么面积