加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

判断 点与三角形的关系 的几种方法

(2012-07-24 10:18:02)
标签:

杂谈

分类: 计算机图形学

1、 点与三角形的三点连线 形成三个新的三角形,如果这三个新三角形的面积大于原三角形的面积,则点在三角形外http://s7/middle/a401a1eatc58a1f7c8b56&690点与三角形的关系 的几种方法" TITLE="判断 点与三角形的关系 的几种方法" />

2、

    利用向量叉乘  p1p2叉乘p1p   p2p3叉乘p2p  p3p2叉乘p3p    如果结果向量的Z分量都为正(或负)

 则点在三角形中http://s3/middle/a401a1eatc58a3922d2a2&690点与三角形的关系 的几种方法" TITLE="判断 点与三角形的关系 的几种方法" />

3、

    与第二种方法差不多  也是利用叉乘, 但原理不一样

   http://s1/middle/a401a1eatc58a63422db0&690点与三角形的关系 的几种方法" TITLE="判断 点与三角形的关系 的几种方法" />

  得到三个向量   以向量1为中间向量,  判断向量2 向量3是否在其同一侧,如果在同一侧则点在三角形外,如果不在,继续以向量2为中间向量,判断向量1 向量3 是否同一侧...........

 最后 如果以任何向量为中间向量  其前后两个向量在其两侧,则点在三角形内

代码:

int   inside4(Point3D *  p1,Point3D * p2,Point3D * p3,   double px,double py)  
 

 Point2D   arr[3],tr[3]; 


 arr[0].x = p1->x;
 arr[0].y = p1->y;

 arr[1].x = p2->x;
 arr[1].y = p2->y;

 arr[2].x = p3->x;
 arr[2].y = p3->y;

 memcpy(tr,arr,sizeof(arr));  

 int i = 0;
 for(i=0;i<3;i++)   //   求三个向量  
  
  arr[i].x    tr[i].x    px;  
  arr[i].y    tr[i].y    py;  
  
 for(i=0;i<3;i++)     //   判断是否在边界上  
  
  int   j=(i+1)%3;  
  if(   arr[i].x*arr[j].y-arr[i].y*arr[j].x==0      //点在边界上,向量对称  
   
   if(   arr[i].x*arr[j].x>0   ||   arr[i].y*arr[j].y>0    return   0;//   同方向  
   return   1;                                                           //   方向相反  
   
  
 for(i=0;i<2;i++)   //   判断在内还是外,在此只需判断两个向量,下有说明【注1】  
  
  int   front    (i+2)%3,   next    3-i-front;  
  int   cnt    0;  
  double   t1    arr[i].y*arr[front].x    arr[front].y*arr[i].x;  
  double   t2    arr[i].y*arr[next].x      arr[next].y   *arr[i].x;   

  if(   (t1>0)+(t2>0)!=1   

     return   0;   //向量分布在同一侧,则在外;否则不能确定 
 

  
 return   1;   //   三个向量都在不同两侧,则在内  
 //   【注1】:如果三个向量分布在同一侧,则必定有两个向量使得另外的两个向量在该向量的同一侧  
 //                           
 //              如  |/   三条线,b,c在a的一边,   a,b在c的一边,所以a,b,c中有两条线都可以判断  
 //               a,b,c三个向量对应的三个顶点在三个向量原点的一个方向,所以该点不在此三角形中  
 


4、

  求点在该三角形中的重心坐标   如果   0<=u<=1 0<=v<=1    0<=u+v<=1  则在三角形上

 

5、 过点做水平射线,通过看射线与多边形的交点个数,来判断点与多边形的关系,现在把情况特殊化,用于判断点与三角形的关系

int CCW(CPointData p0, CPointData p1, CPointData p2)
        {
            double dx1, dx2, dy1, dy2;
            dx1 = p1.x - p0.x;
            dx2 = p2.x - p0.x;
            dy1 = p1.y - p0.y;
            dy2 = p2.y - p0.y;

            if (dx1 * dy2 > dy1 * dx2)
                return 1;
            else
                return -1;
        }

bool Intersect(CPointData p1,CPointData p2,CPointData p3,CPointData p4)
        {
            return (((CCW(p1, p2, p3) * CCW(p1, p2, p4)) <= 0)
         & ((CCW(p3, p4, p1) * CCW(p3, p4, p2) <= 0)));
        }

bool IsPointInPolyPolyGon(CPointData pointData,CAreaData  * tagPointArray)
        {
            
           CPointData ptTest=pointData;
   
            CPointData pt1, pt2, tempPP1, tempPP2;
            int wnumintsct;
            int iFromNo, iToNo;
            pt1 = ptTest;
            pt2 = pt1;
            // Now go through each of the lines in the polygon and see if it
            // intersects
            wnumintsct=0;
            iFromNo=0;
        
            iToNo =tagPointArray->nPoint-1;

                for (int j = iFromNo; j < iToNo - 1; j++)
                {
                    tempPP1 = tagPointArray->points[j];
                    tempPP2 = tagPointArray->points[j + 1];
                    pt2.x = max(tempPP1.x, tempPP2.x) + 100;//射线
                    if (Intersect(pt1, pt2, tempPP1, tempPP2))
                        wnumintsct++;
                }

                // And the last line
                tempPP1 = tagPointArray->points[iToNo - 1];
                tempPP2 = tagPointArray->points[iFromNo];
                pt2.x = max(tempPP1.x, tempPP2.x) + 100;//射线
                if (Intersect(pt1, pt2, tempPP1, tempPP2))
                    wnumintsct++;              

            return ((wnumintsct & 1) > 0);

        }

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有