• 大小: 15KB
    文件类型: .bz2
    金币: 1
    下载: 0 次
    发布日期: 2021-05-19
  • 语言: C/C++
  • 标签: C++  几何运算  源码  

资源简介

几何算法大全,包含大量的几何算法的C++源码。如点、线、面的几何要素计算等。非常实用

资源截图

代码片段和文件信息

我顶 字号:大 中 小
#include
#include
struct Point{
       double xy;
};
int dblcmp(double d)
{
    if(fabs(d)<0.000000001)return 0;
    return (d>0)?1:-1;
}
double det(double x1double y1double x2double y2)
{ return x1*y2-x2*y1;}
double cross(Point aPoint bPoint c)
{//叉积 
       return det(b.x-a.x b.y-a.y c.x-a.x c.y-a.y);
}
int xycmp(double pdouble minidouble maxi)
{ return dblcmp(p-mini)*dblcmp(p-maxi);}
double min(double adouble b)
{ if(adouble max(double adouble b)
{   if(a>b)return a; else return b;}
int betweencmp(Point aPoint bPoint c )
{//点a与b或c重合时为0
 //点a在bc内部 时为-1
 //点a在bc外部 时为 1
   if( fabs(b.x-c.x)>fabs(b.y-c.y))
      return xycmp(a.xmin(b.xc.x)max(b.xc.x));
   else
      return xycmp(a.xmin(b.yc.y)max(b.yc.y));
}
int segscross(Point aPoint bPoint cPoint dPoint &p)
{// 线段 ab cd 规范相交返回 1 并求交点 P ; 不规范相交返回 2 ;没有交点返回 0
   double s1s2s3s4;
   int d1d2d3d4;
   d1=dblcmp(s1=cross(abc));
   d2=dblcmp(s2=cross(abd));
   d3=dblcmp(s3=cross(cda));
   d4=dblcmp(s4=cross(cdb));
   if( ((d1^d2)==-2) && ((d3^d4)==-2))
   {
      p.x=(c.x*s2-d.x*s1)/(s2-s1);
      p.y=(c.y*s2-d.y*s1)/(s2-s1);
      return 1;
   }
   if( ((d1==0)&& (betweencmp(cab)<=0)) ||
        ((d2==0)&& (betweencmp(dab)<=0)) ||
        ((d3==0)&& (betweencmp(acd)<=0)) ||
        ((d4==0)&& (betweencmp(bcd)<=0)) )
        return 2;
    return 0;
}
double area(Point aPoint b)
{ return a.x*b.y-a.y*b.x;}
double areas(Point A[]int n)
{//求 n 个点的面积   A中的点按逆时针方向存放
 //多边形是任意的凸或凹多边形,
   double re=0;
   int i;
   if(n<3)return 0;
   for(i=0;i      re+=area(A[i]A[(i+1)%n]);
   re=fabs(re/2);
}
void MidPoint(Point A[]int nPoint &p)
{//求多边形的重心 A中的点按逆时针方向存放
     int i;
     double areasspx=0py=0tem;
     areass=areas(A n);
     for(i=0;i     { tem=area(A[i]A[(i+1)%n]);
        px+=tem*(A[i].x+A[(i+1)%n].x);
        py+=tem*(A[i].y+A[(i+1)%n].y);
     }
     p.x=fabs(px)/(6*areass);
     p.y=fabs(py)/(6*areass);
}
int main()
{
   Point abcdp;
   Point   A[10000];
   int n;
   a.x=0;a.y=0;
   b.x=1;b.y=1;
   c.x=0;c.y=2;
   d.x=3;d.y=0;
   int i=segscross(abcdp);
   printf(“%d\n%lf %lf\n“ip.xp.y);
   while(1);
}
 
//另一版本
#include 
#define infinity 1e20
#define EP 1e-10
struct TPoint{
       float xy;
       };
 
struct TLineSeg{
       TPoint ab;
};
//求平面上两点之间的距离
float distance(TPoint p1TPoint p2)
{
       return(sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));
}
/********************************************************
 返回(P1-P0)*(P2-P0)的叉积。
 若结果为正,则的顺时针方向;
 若为0则共线;
 若为负则的在逆时针方向;
 可以根据这个函数确定两条线段在交点处的转向
 比如确定p0p1和p1p2在p1处是左转还是右转,只要求
 (p2-p0)*(p1-p0),若<0则左转,>0则右转,=0则共线
*********************************************************/
float multiply(TPoint p1TPoint p2TPoint p0)
{
       return((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y)); 
}
//确定两条线段是否相交
int intersect(TLineSeg uTLineSeg v)
{
       return( (ma

评论

共有 条评论