计算几何-Line-Left-Intersect

This article is made by Jason-Cow.
Welcome to reprint.
But please post the article's address.

 

好好领悟一下vector吧!加一行Left还可以判断是否在直线上...

struct L{
  D O;V v;db a;
  L(){}
  L(D O,V v):O(O),v(v){a=atan2(O.y,O.x);}//atan2(y,x)=atan(y/x) but the x is OK to be zero
  bl op<(const L&x)const{return a<x.a;}
};

bl Left(D A,L l){return Cross(l.v,A-l.O)>0;}
int main(){
  V A(1,1),B(2,2);
  L l(A,B-A);
  printf("l( O(%lf,%lf) V(%lf,%lf) a(%lf))\n",l.O.x,l.O.y,l.v.x,l.v.y,l.a);
  printf("( 1, 3) is on the %s\n",Left(V( 1, 3),l)?"Left":"right");
  printf("( 3, 1) is on the %s\n",Left(V( 3, 1),l)?"Left":"right");
  printf("(-1, 3) is on the %s\n",Left(V(-1, 3),l)?"Left":"right");
  printf("( 0,-2) is on the %s\n",Left(V( 0,-2),l)?"Left":"right");
  printf("( 0, 0) is on the %s\n",Left(V( 0, 0),l)?"Left":"right");
  return 0;
}
l( O(1.000000,1.000000) V(1.000000,1.000000) a(0.785398)) //a=pi/4
( 1, 3) is on the Left
( 3, 1) is on the right
(-1, 3) is on the Left
( 0,-2) is on the right
( 0, 0) is on the right

Intersect(L a,L b)  

Return The Dot Of Two Line

 

D Intersect(L a,L b){
    V u=a.O-b.O;
    return a.O+a.v*(Cross(b.v,u)/Cross(a.v,b.v));
}

 

int main()

 

int main(){
    L a(D(0,1),D(0,1)-D(-1,0));
    L b(D(1,0),D(1,0)-D(0,1));
    D A=Intersect(a,b);
    cout<<"("<<A.x<<","<<A.y<<")"<<endl;
  return 0;
}

 

(0,1)

 

posted @ 2017-03-21 21:11  墨鳌  阅读(252)  评论(0编辑  收藏  举报