二维几何基础模板(二)
2014-09-28 16:16
295 查看
一、直线交点
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,PointB) { 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); else if(dcmp(Dot(v1,v3))>0) return Length(v3); else return fabs(Cross(v1,v2))/Length(v1); }
四、点在直线上的投影
PointGetLineProjection(Point P,Point A,Poiny 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=Corss(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; }
六、多边形面积
//如果是凸边形,可以从第一个顶点出发吧凸边形分成n-2个三角形 //非凸多边形也是一样的原理 double ConvexPolygonArea(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; }
相关文章推荐
- ACM计算几何模板——二维几何基础(基本运算,点和线,多边形)
- 二维几何模板 - 二维几何基础
- 二维几何基础模板(三)
- 二维几何基础(模板)
- 计算几何 || 二维基础模板
- 计算几何 - 二维几何基础 (模板)
- 《训练指南》大白 二维几何基础 基本公式(模板)
- 二维几何基础模板(一)
- 几何模板总结(一):二维基础
- UVA 1342 That Nice Euler Circuit(二维几何基础)
- 二维下计算几何程序头 (模板)
- 二维计算几何基础
- 模板 - 几何基础
- 【几何】-几何基础大模板(更新中)
- Toy Storage(二维计算几何基础)
- 二维几何基础
- 计算几何_二维几何模板_double版
- UVA 11178 Morley’s Theorem(二维计算几何基础)
- 计算几何_二维几何模板
- 基础几何基本概念and公式and模板