/*
语法:result = polygonarea( Point * polygon, int N );
参数:
*polygon:多变形顶点数组
N:多边形顶点数目
返回值:
多边形面积
注意:
支持任意多边形,凹、凸皆可
多边形顶点输入时按顺时针顺序排列
源程序:
*/typedefstruct{double x, y;} Point;doublepolygonarea( Point *polygon,int N ){int i, j;double area =0;for( i =0; i < N; i++){
j =(i +1)% N;
area += polygon[i].x * polygon[j].y;
area -= polygon[i].y * polygon[j].x;}
area /=2;return(area <0?-area : area);}
/*
语法:result = lineintersect( Point p1, Point p2, Point p3, Point p4 );
参数:
p1、p2:线段的两个端点
p3、p4:直线上的两个点
返回值:
0:线段直线不相交
1:线段和直线相交
注意:
如线段在直线上,返回 1
源程序:
*/typedefstruct{double x, y;} Point;intlineintersect( Point p1, Point p2, Point p3, Point p4 ){
Point tp1, tp2, tp3;
tp1.x = p1.x - p3.x;
tp1.y = p1.y - p3.y;
tp2.x = p4.x - p3.x;
tp2.y = p4.y - p3.y;
tp3.x = p2.x - p3.x;
tp3.y = p2.y - p3.y;if((tp1.x * tp2.y - tp1.y * tp2.x)*(tp2.x * tp3.y - tp2.y * tp3.x)>=0)return(1);elsereturn(0);}
点到线段最短距离
/*
语法:result = mindistance( Point p1, Point p2, Point q );
参数:
p1、p2:线段的两个端点
q:判断点
返回值:
点q到线段p1p2的距离
注意:
需要 math.h
源程序:
*/#defineMIN( x, y )(x < y ? x : y)#defineMAX( x, y )(x > y ? x : y)typedefstruct{double x, y;} Point;doublemindistance( Point p1, Point p2, Point q ){int flag =1;double k;
Point s;if( p1.x == p2.x ){
s.x = p1.x; s.y = q.y; flag =0;}if( p1.y == p2.y ){
s.x = q.x; s.y = p1.y; flag =0;}if( flag ){
k =(p2.y - p1.y)/(p2.x - p1.x);
s.x =(k * k * p1.x + k *(q.y - p1.y)+ q.x)/(k * k +1);
s.y = k *(s.x - p1.x)+ p1.y;}if(MIN( p1.x, p2.x )<= s.x && s.x <=MAX( p1.x, p2.x ))return(sqrt((q.x - s.x)*(q.x - s.x)+(q.y - s.y)*(q.y - s.y)));elsereturn(MIN(sqrt((q.x - p1.x)*(q.x - p1.x)+(q.y - p1.y)*(q.y - p1.y)),sqrt((q.x - p2.x)*(q.x - p2.x)+(q.y - p2.y)*(q.y - p2.y))));}
求两直线的交点
/*
语法:result = mindistance( Point p1, Point p2, Point q );
参数:
p1~p4:直线上不相同的两点
*p:通过指针返回结果
返回值:
1:两直线相交
2:两直线平行
注意:
如需要判断两线段交点,检验k和对应k1(注释中)的值是否在0~1之间,用在0~1之间的那个求交点
源程序:
*/typedefstruct{double x, y;} Point;intlinecorss( Point p1, Point p2, Point p3, Point p4, Point *p ){double k;// 同一直线if((p4.x - p3.x)*(p1.y - p3.y)-(p4.y - p3.y)*(p1.x - p3.x)==0&&(p2.x - p1.x)*(p1.y - p3.y)-(p2.y - p1.y)*(p1.x - p3.x)==0)return(2);// 平行,不同一直线if((p4.y - p3.y)*(p2.x - p1.x)-(p4.x - p3.x)*(p2.y - p1.y)==0)return(0);
k =((p4.x - p3.x)*(p1.y - p3.y)-(p4.y - p3.y)*(p1.x - p3.x))/((p4.y - p3.y)*(p2.x - p1.x)-(p4.x - p3.x)*(p2.y - p1.y));// k1=((p2.x-p1.x)*(p1.y-p3.y)-(p2.y-p1.y)*(p1.x-p3.x))/((p4.y-p3.y)*(p2.x-p1.x)-(p4.x-p3.x)*(p2.y-p1.y)); (*p).x = p1.x + k *(p2.x - p1.x);(*p).y = p1.y + k *(p2.y - p1.y);return(1);/*有交点 */}
判断一个封闭图形是凹集还是凸集
/*
语法:result = convex( Point * p, int n );
参数:
*p:封闭曲线顶点数组
n:封闭曲线顶点个数
返回值:
1:凸集
-1:凹集
0:曲线不符合要求无法计算
注意:
默认曲线为简单曲线:无交叉、无圈
源程序:
*/typedefstruct{double x, y;} Point;intconvex( Point *p,int n ){int i, j, k;int flag =0;double z;if( n <3)return(0);for( i =0; i < n; i++){
j =(i +1)% n;
k =(i +2)% n;
z =(p[j].x - p[i].x)*(p[k].y - p[j].y);
z -=(p[j].y - p[i].y)*(p[k].x - p[j].x);if( z <0)
flag |=1;elseif( z >0)
flag |=2;if( flag ==3)return(1);/* CONCAVE */}if( flag !=0)return(1);/* CONVEX */elsereturn(0);}