资源简介
几何算法大全,包含大量的几何算法的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
相关资源
- 音像店(用c++做的课程设计)
- 基于MPI-GA的TSP问题C++代码
- C++ 开发大全基础篇PDF扫描版
- RANSAC算法 C++实现
- DNS中继服务器C++版
- Huffman 编码器与解码器-----数据结构课
- Yuneec ST24解码器C语言源码
- 酒店管理系统 VC++ MFC实现)
- 不精确一维搜索wolfe算法
- 用c++ 定义一个车(Vehicle)基类,有
- c++写的学生成绩管理系统
- 操作系统实习:动态分区分配C++实现
- 遥感图像彩色合成C++
- vc++ 浏览器 完整版
- 电话簿管理程序C++语言编写
- C++选课系统
- 基于OpenCV的图像检索系统(源码)
- 原创c++二叉树抽象数据类型实现
- C++基础入门编写游戏代码及角色扮演
- 杂志订阅系统C++
- C++实验报告
- 多项式类的C++实现乘法、加法、代入
- aes算法实现C++)
- C++ 数字图像处理源代码
- c++面向对象课程设计报告_(学生成绩
- c++primer_第五版_中文版(完整).rar
- c++实现的哈夫曼编码和解码源代码
- 基于VC++的带通滤波器的设计与实现
- C++高斯投影正反算
- VC++查看鼠标在图像选点坐标程序
评论
共有 条评论