1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 计算几何 点线面。

计算几何 点线面。

时间:2021-07-12 21:49:05

相关推荐

计算几何 点线面。

大家可以去看看我的一篇博客讲解的知识点,比较零散,加上大家的中学知识,理解下面的代码不难点击这个

#include<bits/stdc++.h>using namespace std;const double pi=acos(-1.0);const double inf=0x3f3f3f3f;const double eps=1e-9;struct Point{double x,y;Point(double x=0,double y=0):x(x),y(y){}};int pl(int x,int y){if(abs(x-y)<eps)return 0;if(x>y)return 1;elsereturn -1;}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);}bool operator <(const Vector &A,const Vector &B)///判小{if(A.x==B.x)return A.y<B.y;return A.x<B.x;}///在进行大小排序,先按x大小再按y的大小。bool operator ==(const Vector &A,const Vector &B)///判等{if(pl(A.x,B.x)==0&&pl(A.y,B.y)==0)return true;elsereturn false;}double Nei(Vector A,Vector B){return A.x*B.x+A.y*B.y;}///点乘A*B,最后是一个数值|A|*|B|*cos///A在B上的投影相乘double Wai(Vector A,Vector B){return A.x*B.y-A.y*B.x;}///茶城A*B,最后是一个数值|A|*|B|sin///A与B组成的平行四边形面积int cmp(Point p1,Point p2)///极角排序;{int x=Wai(p1,p2,a[0]);if(x>0||(x==0&&dis(p1,a[0])<dis(p2,a[0]))) return 1;return 0;}double len(Vector A){return sqrt(Nei(A,A));}///向量的长度double Angle(Vector A,Vector B){return acos(Nei(A,B)/len(A)/len(B));}///两个向量的夹角double Area(Vector A,Vector B,Vector C){return Wai(B-A,C-A);}///两个向量组成的平行四边形面积Vector Rot(Vector A,double rad){return Vector(A.x*cos(rad)+A.y*sin(rad),A.y*sin(rad)+A.x*cos(rad));}///向量A逆时针旋转rad(弧度)时得到的新向量Vector Fl(Vector A){double l=len(A);return Vector(-A.y/l,A.x/l);}///向量A左边的法向量bool pdleft(Vector A,Vector B,Vector C){if(Wai(B-A,C-B)>0)return true;elsereturn false;}///判断向量BC是不是向量AB的逆时针方向(左边)转向struct Line{///直线定义Point v,p;Line(Point v,Point p):v(v),p(p) {}Point point(double t){///返回点P = v + (p - v)*treturn v+(p-v)*t;}};///计算两直线交点///调用前需保证 Wai(v, w) != 0Point Tlpoint(Point P, Vector v, Point Q, Vector w){Vector u=P-Q;double t=Wai(w,u)/Wai(v,w);return P+v*t;}///点P到直线AB距离公式double PointtoLine(Point P, Point A, Point B){Vector v1= B-A,v2=P-A;return fabs(Wai(v1,v2)/len(v1));}///不去绝对值,得到的是有向距离///点P到线段AB距离公式double PointtoAB(Point P,Point A,Point B){if(A==B)return len(P-A);Vector v1=B-A,v2=P-A,v3 =P-B;if(pl(Nei(v1, v2),0)<0)return len(v2);if(pl(Nei(v1,v3),0)>0)return len(v3);return PointtoLine(P, A, B);}///点P在直线AB上的投影点Point PointtoABP(Point P, Point A, Point B){Vector v = B-A;return A+v*(Nei(v, P-A)/Nei(v, v));}///判断p点是否在线段a1a2上bool OnAB(Point p, Point A, Point B){return pl(Wai(A-p, B-p),0)==0&&pl(Nei(A-p, B-p),0) < 0;}///多边形有向面积double PolygonArea(Point* p, int n){///p为端点集合,n为端点个数double s = 0;for(int i = 1; i < n-1; ++i)s += Wai(p[i]-p[0], p[i+1]-p[0]);return s;}///判断点是否在多边形内,若点在多边形内返回1,在多边形外部返回0,在多边形上返回-1int Pointisin(Point p, vector<Point> poly){int wn = 0;int n = poly.size();for(int i = 0; i < n; ++i){if(OnAB(p, poly[i], poly[(i+1)%n])) return -1;int k = pl(Wai(poly[(i+1)%n] - poly[i], p - poly[i]),0);int d1 = pl(poly[i].y - p.y,0);int d2 = pl(poly[(i+1)%n].y - p.y,0);if(k > 0 && d1 <= 0 && d2 > 0) wn++;if(k < 0 && d2 <= 0 && d1 > 0) wn--;}if(wn != 0)return 1;return 0;}///圆struct Circle{Point c;double r;Circle(Point c, double r):c(c), r(r) {}Point point(double a){///通过圆心角求坐标return Point(c.x+cos(a)*r,c.y+sin(a)*r);}};///求圆与直线交点返回值代表有几个交点。一个交点存放在SOL[t1],两个sol[1][2]中int getLineCircleIntersection(Line L, Circle C, double& t1, double& t2, vector<Point>& sol){double a = L.v.x, b = L.p.x - C.c.x, c = L.v.y, d = L.p.y - C.c.y;double e = a*a + c*c, f = 2*(a*b + c*d), g = b*b + d*d - C.r*C.r;double delta = f*f - 4*e*g;///判别式if(pl(delta,0) < 0)///相离return 0;if(pl(delta,0) == 0){///相切t1 = -f /(2*e);t2 = -f /(2*e);sol.push_back(L.point(t1));///sol存放交点本身return 1;}///相交t1 = (-f - sqrt(delta))/(2*e);sol.push_back(L.point(t1));t2 = (-f + sqrt(delta))/(2*e);sol.push_back(L.point(t2));return 2;ddddddddddd}///两个圆相交的面积double AreaOfOverlap(Point c1, double r1, Point c2, double r2){double d = len(c1 - c2);if(r1 + r2 < d + eps)return 0.0;if(d < fabs(r1 - r2) + eps){double r = min(r1, r2);return pi*r*r;}double x = (d*d + r1*r1 - r2*r2)/(2.0*d);double p = (r1 + r2 + d)/2.0;double t1 = acos(x/r1);double t2 = acos((d - x)/r2);double s1 = r1*r1*t1;double s2 = r2*r2*t2;double s3 = 2*sqrt(p*(p - r1)*(p - r2)*(p - d));return s1 + s2 - s3;}int main(){}

仅仅参考思路

那这套题去练练手点击这里

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。