判断点是否在三角形内

判断点是否在三角形内
 1.  一种是用矢量叉乘法:
        由三个顶点向所求的点引出矢量(注意方向),然后任意用其中两个矢量形成平面,再用这个平面和剩下的矢量叉乘,得出一个新矢量,方向向里,则在三角形外,反之在里面。
2.用面积方法

#include < stdio.h >
#include
< math.h >
struct  TPoint  {
    
float x;
    
float y;
}
;

// 求叉积
float  mul( struct  TPoint p1,  struct  TPoint p2,  struct  TPoint p0)  {
    
return ((p1.x - p0.x)*(p2.y - p0.y)-(p2.x - p0.x)*(p1.y - p0.y));
}

/**/ /*由三个顶点向所求的点引出矢量(注意方向),然后任意用其中两个矢量形成平面,
 * 再用这个平面和剩下的矢量叉乘,得出一个新矢量,方向向里,则在三角形外,反之在里面。
 
*/

int  inside( struct  TPoint tr[],  struct  TPoint p)  {
    
int i;
    
for (i = 0; i < 3; i++)
        
if (mul(p, tr[i], tr[(i + 1% 3]) * mul(p, tr[(i + 2% 3], tr[(i + 1% 3]) > 0)
            
return 0;
    
return 1;
}


float  area( struct  TPoint p1,  struct  TPoint p2,  struct  TPoint p3)  {
    
return fabs((p1.x - p3.x)*(p2.y - p3.y)-(p2.x - p3.x)*(p1.y - p3.y));
}

// 用面积判断p是否在三角形内
int  inside2( struct  TPoint tr[],  struct  TPoint p)  {
    
if (fabs(area(tr[0], tr[1], tr[2]) -
            area(p, tr[
1], tr[2]) -
            area(tr[
0], p, tr[2]) -
            area(tr[
0], tr[1], p)) < 1.0e-20)
        
return 1;
    
else
        
return 0;
}


int  main()  {
    
struct TPoint tr[3= {{-11},{10},{30}},  p = {12};

    
//方法一
    printf("algorithm   1:");
    
if (inside(tr, p))
        printf(
"In\n");
    
else
        printf(
"Out\n");

    
//方法一
    printf("algorithm   2:");
    
if (inside2(tr, p))
        printf(
"In\n");
    
else
        printf(
"Out\n");
}

你可能感兴趣的:(判断点是否在三角形内)