二维几何基础
来源:互联网 发布:iphone 软件开关效果 编辑:程序博客网 时间:2024/06/08 07:06
#include<stdio.h>#include<math.h>//常用定义const double eps = 1e-10;struct Point{double x,y;Point( double x = 0,double y = 0 ): x(x),y(y) {}};typedef Point Vector;Vector operator + ( Vector A,Vector B ) { return Vector( A.x + B.x,A.y + B.y ); }Vector operator - ( Vector A,Vector B ) { return Vector( A.x - B.x,A.y - B.y ); }Vector operator * ( Vector A,double p ) { return Vector( A.x * p,A.y * p ); }Vector operator + ( Vector A,double p ) { return Vector( A.x / p,A.y / p ); }Vector operator < ( const Point &a,const Point &b ) { return a.x < b.x || ( a.x == b.x && a.y < b.y ); }int dcmp( double x ){if( fabs(x) < eps )return 0; else return x < 0?-1:1;}bool operator == ( const Point &a,const Point &b ){return dcmp( a.x - b.x ) == 0 && dcmp( a.y - a.y ) == 0;}//基本运算double Dot( Vector A,Vector B ) { return A.x * B.x + A.y * B.y; } //点乘double Length( Vector A ) { return sqrt( Dot(A,A) ); } //取模double Angle( Vector A,Vector B ) { return acos( Dot(A,B)/Length(A) );}//求角度double Cross( Vector A,Vector B ) { return A.x * B.y - B.x * A.x; } //叉乘double Area2( Point A,Point B,Point C ) { return Cross( B - A,C - A ); }//求三角形面积Vector Rotate( Vector A,double rad )//向量旋转{return Vector( A.x * cos(rad) - A.y * sin(rad),A.x * sin(rad) + A.y * cos(rad) );}//点与直线Point GetLineIntersection( Point P,Vector v,Point Q, Vector w) //直线交点{Vector u = P - Q;double t = Cross( w,u ) / Cross( v,w );return P + v*t;}double DistanceToLine( Point P,Point A,Point B )//点到直线距离{Vector v1 = B - A, v2 = P - A;return fabs( Cross(v1,v2) )/Length(v1); //如果不取绝对值,得到的是有向距离}double DistanceToSegment( Point P,Point A,Point B ) //点到线段距离{if( A == B )return Length(P-A);Vector v1 = B - A, v2 = P - A, v3 = P - B;if( dcmp( Dot( v1,v2 ) ) < 0 ) return Length( v2 ); //P点在点a左边else if( dcmp( Dot( v1,v2 ) ) > 0 ) return Length( v3 ); //P点在点b右边else return fabs( Cross(v1,v2) )/Length(v1); }Point GetLineProjection( Point P,Point A,Point B ) //点在直线上的投影{Vector v = B - A;return A + v*( Dot(v,P-A) / Dot(v,v) );}bool SegmentProperIntersection( Point a1,Point a2,Point b1,Point b2 ) //线段相交判定( 端点相交不算 ) { double c1 = Cross( a2-a1,b1-a1 ), c2 = Cross( a2-a1,b2-a1 ), c3 = Cross( b2-b1,a1-b1 ),c4 = Cross( b2-b1,a2-b1 ); return dcmp(c1)*dcmp(c2) < 0 && dcmp(c3)*dcmp(c4) < 0 ; } bool OnSegment( Point p,Point a1,Point a2 ) //判断点是否在线段上{return dcmp(Cross(a1-p,a2-p)) == 0 && dcmp(Dot(a1-p,a2-p)) < 0;}double PolygonArea( Point *p, int n )//求多边形的有向面积{double area = 0;for(int i = 1; i < n - 1; i ++ )area += Cross( p[i]-p[0],p[i+1]-p[0] );return area/2;}
0 0
- 二维几何模板 - 二维几何基础
- 二维几何基础
- 二维计算几何基础
- 二维计算几何基础
- 二维几何基础
- 计算几何 - 二维几何基础 (模板)
- 二维几何基础(模板)
- 二维几何基础模板(二)
- 二维几何基础模板(三)
- 计算几何 || 二维基础模板
- 二维几何基础模板(一)
- UVALive 3263 二维几何基础
- 几何模板总结(一):二维基础
- Toy Storage(二维计算几何基础)
- 二维几何
- UVA 11178 Morley’s Theorem(二维计算几何基础)
- UVA 1342 That Nice Euler Circuit(二维几何基础)
- UVA 11178 Morley's Theorem(二维几何基础)
- 如何利用Python和win32编程避免重复性体力劳动(三)——文本框操作:WM_GETTEXT 和WM_SETTEXT
- Java中的枚举类详讲
- 程序员学英语三部曲
- UITableView模拟聊天界面
- ASP:TextBox 只允许输入数字
- 二维几何基础
- Hive文件的导入与导出
- Langford Pairing
- 没有非空索引情况下段头块损坏的恢复
- 43 java
- html+css+jquery实现选项卡(模仿搜索风云榜选项卡)
- 【转】FFmpeg笔记
- 01背包
- Java RMI技术以及Spring封装了的RMI技术