求直线交点还是要推一个公式的..
见博客 https://blog.csdn.net/u013050857/article/details/40923789
还要学一下向量的定点比分法
另外 poj 精度好像卡的厉害, zoj1280 就没啥问题
- #include
- #include
- #include
- #include
- #include
- using namespace std;
- const double esp = 1e-8;
- const double inf = 1e20;
- const double pi = acos(-1.0);
- const int maxp = 1010;
- int sgn(double x){
- if(fabs(x) <esp)return 0;
- if(x <0)return -1;
- else return 1;
- }
- inline double sqr(double x){return x*x;}
- struct Point{
- double x,y;
- Point(){}
- Point(double _x,double _y):x(_x),y(_y){}
- void input(){scanf("%lf%lf",&x,&y);}
- void output(){printf("%.2lf %.2lf\n",x,y);}
- bool operator==(Point b)const {
- return sgn(x-b.x)==0 && sgn(y-b.y)==0;
- }
- bool operator < (Point b)const {// 判左下
- if( sgn(x-b.x)==0 ) // 横坐标相等
- return sgn(y-b.y)<0;
- return x<b.x;
- }
- Point operator - (const Point &b)const {
- return Point(x-b.x,y-b.y);
- }
- double operator ^(const Point &b)const {
- return x*b.y-y*b.x;
- }
- double operator *(const Point &b)const {
- return x*b.x+y*b.y;
- }
- double len(){
- return hypot(x,y);
- }
- double len2(){
- return x*x+y*y;
- }
- double distance(Point p){
- return hypot(x-p.x,y-p.y);
- }
- Point operator +(const Point &b)const {
- return Point(x+b.x,y+b.y);
- }
- Point operator *(const double &k)const {
- return Point(x*k,y*k);
- }
- Point operator /(const double &k)const {
- return Point(x/k,y/k);
- }
- double rad(Point a,Point b){
- Point p=*this;
- return fabs(atan2( fabs((a-p)^(b-p)),(a-p)*(b-p) ));
- }
- Point trunc(double r){
- double l=len();
- if(!sgn(l))return *this;
- r/=l;
- return Point(x*r,y*r);
- }
- Point rotleft(){
- return Point(-y,x);
- }
- Point rotright(){
- return Point(y,-x);
- }
- Point rotate(Point p,double angle){
- Point v=(*this)-p;
- double c=cos(angle),s=sin(angle);
- return Point(p.x+v.x*c-v.y*s, p.y+v.x*s+v.y*c);
- }
- };
- struct Line{
- Point s,e;
- Line(){}
- Line(Point s,Point e):s(s),e(e){}
- bool operator ==(Line v){
- return (s==v.s) && (e==v.e);
- }
- Line(Point p,double angle){
- s=p;
- if(sgn(angle-pi/2)==0)
- e=s+Point(0,1);
- else e=s+Point(1,tan(angle));
- }
- Line(double a,double b,double c){
- if(sgn(a)==0){
- s=Point(0,-c/b);
- e=Point(1,-c/b);
- }
- else if(sgn(b)==0){
- s=Point(-c/a,0);
- e=Point(-c/a,1);
- }
- else {
- s=Point(0,-c/b);
- e=Point(1,(-c-a)/b);
- }
- }
- void input(){
- s.input();
- e.input();
- }
- void adjust(){
- if(e<s)swap(e,s);
- }
- double length(){
- return s.distance(e);
- }
- double angle(){
- double k=atan2(e.y-s.y,e.x-s.x);
- if(sgn(k)<0)k+=pi;
- if(sgn(k-pi)==0) k-=pi;
- return k;
- }
- int relation(Point p){
- int c=sgn((p-s)^(e-s));
- if(c<0)return 1;
- else if(c>0)return 2;
- else return 3;
- }
- bool pointonseg(Point p){
- return sgn((p-s)^(e-s))==0 && sgn((p-s)*(p-e))<=0;
- }
- bool parallel(Line v){
- return sgn((e-s)^(v.e-v.s))==0;
- }
- int segcrossseg(Line v){
- int d1=sgn((e-s)^(v.s-s));
- int d2=sgn((e-s)^(v.e-s));
- int d3=sgn((v.e-v.s)^(s-v.s));
- int d4=sgn((v.e-v.s)^(e-v.s));
- if( (d1^d2)==-2 && (d3^d4)==-2) return 2;
- return (d1==0 && sgn((v.s-s)*(v.s-e))<=0) ||
- (d2==0 && sgn((v.e-s)*(v.e-e))<=0) ||
- (d3==0 && sgn((s-v.s)^(s-v.e))<=0) ||
- (d4==0 && sgn((e-v.s)^(e-v.e))<=0);
- }
- int linecrossseg(Line v){
- int d1=sgn((e-s)^(v.s-s));
- int d2=sgn((e-s)^(v.e-s));
- //cout<<(d1^d2)<<'\n';
- if((d1^d2)==-2)return 2;
- return d1==0 || d2==0;
- }
- int linecrossline(Line v){
- if((*this).parallel(v))
- return v.relation(s)==3;
- return 2;
- }
- Point crosspoint(Line v){
- double a1=(v.e-v.s)^(s-v.s);// 面积
- double a2=(v.e-v.s)^(e-v.s);
- return Point((s.x*a2-e.x*a1)/(a2-a1),
- (s.y*a2-e.y*a1)/(a2-a1));
- }
- double dispointtoline(Point p){
- return fabs((p-s)^(e-s))/length();
- }
- double dispointtoseg(Point p){
- if(sgn((p-s)*(e-s))<0 || sgn((p-e)*(s-e))<0)
- return min(p.distance(s),p.distance(e));
- return dispointtoline(p);
- }
- double dissegtoseg(Line v){
- return min(min(dispointtoseg(v.s),dispointtoseg(v.e)),
- min(v.dispointtoline(s),v.dispointtoline(e)));
- }
- Point lineprog(Point p){//s+vt
- return s+( ((e-s)*((e-s)*(p-s)))/(e-s).len2() );
- }
- Point symmetrypoint(Point p){
- Point q=lineprog(p);
- return Point(2*q.x-p.x,2*q.y-p.y);
- }
- };
- // 判两直线是否相交
- int main(){
- int t;cin>>t;
- puts("INTERSECTING LINES OUTPUT");
- for(int tt=1;tt<=t;tt++){
- double x1,y1,x2,y2;
- cin>>x1>>y1>>x2>>y2;
- Line line1=Line(Point(x1,y1),Point(x2,y2));
- cin>>x1>>y1>>x2>>y2;
- Line line2=Line(Point(x1,y1),Point(x2,y2));
- if(line1.linecrossline(line2)==0)
- puts("NONE");
- else if(line1.linecrossline(line2)==1)
- puts("LINE");
- else if(line1.linecrossline(line2)==2){
- Point p=line1.crosspoint(line2);
- printf("POINT %.2lf %.2lf\n",p.x,p.y);
- }
- }
- puts("END OF OUTPUT");
- }
来源: http://www.bubuko.com/infodetail-3070754.html