(计算几何step8.1.2.2)POJ 1269 Intersecting Lines(使用叉积来计算两条直线的交点)

来源:互联网 发布:青年人休闲鞋推荐 知乎 编辑:程序博客网 时间:2024/05/22 17:00
/* * POJ_1269.cpp * *  Created on: 2013年11月16日 *      Author: Administrator */#include <iostream>#include <cstdio>#include <cmath>using namespace std;const double epsi = 1e-10;const double pi = acos(-1.0);const int maxn = 100005;//这个不要开得太小...struct Point{double x,y;Point(double _x = 0,double _y = 0):x(_x),y(_y){}Point operator-(const Point& op2)const{//**要注意这种写法return Point(x - op2.x,y - op2.y);}double operator^(const Point& op2)const{return x*op2.y - y*op2.x;}};int sign(const double& x){//判断x是正数还是负数if(x > epsi){return 1;//传入的数是一个整数...}else if(x < -epsi){return -1;//传入的数是一个负数...}return 0;}double sqr(double x){//计算一个数的平方数return x*x;}double mul(const Point& p0,const Point& p1,const Point& p2){//计算p0p1与p1p2的叉积叉积return (p1-p0)^(p2-p0);}double dis2(const Point& p0,const Point& p1){//返回两个点的距离的平方return sqr(p0.x - p1.x) + sqr(p0.y - p1.y);}double dis(const Point& p0,const Point& p1){//返回两个点的距离return sqrt(dis2(p0,p1));}int cross(const Point& p1,const Point& p2,const Point& p3,const Point& p4,Point& p){//判断p1p2是否跨立p3p4double a1 = mul(p1,p2,p3);double a2 = mul(p1,p2,p4);if(sign(a1) == 0 && sign(a2) == 0){//如果这两根木棒重合return 2;}if(sign(a1 - a2) == 0){//平行..这是要注意的...return 0;}/** * 求交点的核心代码 */p.x = (a2*p3.x - a1*p4.x)/(a2-a1);p.y = (a2*p3.y - a1*p4.y)/(a2-a1);return 1;//p1p2和p3p4通过跨立实验}Point p1,p2,p3,p4,p;int main(){int t;scanf("%d",&t);printf("INTERSECTING LINES OUTPUT\n");while(t--){scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&p1.x,&p1.y,&p2.x,&p2.y,&p3.x,&p3.y,&p4.x,&p4.y);int m = cross(p1,p2,p3,p4,p);if(m == 0){printf("NONE\n");}else if(m == 2){printf("LINE\n");}else{printf("POINT %.2lf %.2lf\n",p.x,p.y);}}printf("END OF OUTPUT\n");return 0;}

原创粉丝点击