资源简介
几何算法大全,包含大量的几何算法的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
相关资源
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- 安科瑞智能电能表MODBUS通讯程序 VC6
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 九齐单片机源码
- 商品库存管理系统 C++ MFC
- Qt画图工具源码(qgraphics draw)
- c++ 多功能计算器
- qt 串口助手源码
- C++17 In Detail
- modbus 主机源码
- 《LINUX C编程从初学到精通》光盘源码
- 嵌入式QtC++编程课件
- OLED驱动源码
评论
共有 条评论