二维坐标系

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define EPS 1e-8
struct Point//二维坐标点
{double x;double y;Point(){}Point(double x,double y):x(x),y(y){}Point operator + (const Point &rh) const{return Point(x+rh.x, y+rh.y);}Point operator - (const Point &rh)const{return Point(x-rh.x, y-rh.y);}bool operator == (const Point &rh)const{if(x==rh.x && y==rh.y)return true;return false;}
};
struct Line//表示直线上已知两点或者表示线段
{Point a;Point b;Line(){}Line(Point a,Point b):a(a),b(b){}
};
double Cross(Point a, Point b)//叉积
{return  a.x*b.y-b.x*a.y;
//    double t=a.x*b.y-b.x*a.y;
//    if(t>0)
//        return 1;//锐角
//    else if(t<0)
//        return -1;//钝角
//    else
//        return 0;//平行
}
int main()
{return 0;
}

一、直线与直线的关系

1.判断两直线的关系

int CheckLineIntersection(Line L1, Line L2)//判断直线是否有交点
{// -1表示直线重合// 0表示都平行于y轴,没有交点// 1表示L2平行于y轴// 2表示L1平行于y轴// 3表示不平行于y轴且两条直线也不平行或重合// 4表示不平行于y轴但两条直线平行int state=0;double KL1,KL2;if( fabs(L1.a.x-L1.b.x)>EPS )//直线L1不平行于y轴没有斜率{KL1=(L1.b.y-L1.a.y)/(L1.b.x-L1.a.x);//斜率L1state+=1;}if( fabs(L2.a.x-L2.b.x)>EPS )//直线L1不平行于y轴没有斜率{KL2=(L2.b.y-L2.a.y)/(L2.b.x-L2.a.x);//斜率L2state+=2;}if(state==0){if( fabs(L1.a.x-L2.a.x)<EPS )return -1;//表示重合return 0;}else if(state==3){if( fabs(KL1-KL2)<EPS ){double Y1=L1.a.y-L1.a.x*KL1;//直线L1的截距double Y2=L2.a.y-L2.a.x*KL2;//直线L2的截距if( fabs(Y1-Y2)<EPS )return -1;return 4;}return 3;}elsereturn state;
}

2.计算两直线的交点

当直线相交时

Point LineIntersection(Line L1, Line L2, int state)//先判断是否有交点,并交两条线段的类型当参数输入,返回直线交点
{switch(state){case 1://L1存在斜率, L2平行Y轴{double x=L2.a.x;double KL1=(L1.b.y-L1.a.y)/(L1.b.x-L1.a.x);//斜率L1double y=(L2.a.x-L1.a.x)*KL1+L1.a.y;return Point(x,y);}case 2://L2存在斜率, L1平行Y轴{double x=L1.a.x;double KL2=(L2.b.y-L2.a.y)/(L2.b.x-L2.a.x);//斜率L2double y=(L1.a.x-L2.a.x)*KL2+L2.a.y;return Point(x,y);}case 3://都有斜率{double KL1=(L1.b.y-L1.a.y)/(L1.b.x-L1.a.x);//斜率L1double KL2=(L2.b.y-L2.a.y)/(L2.b.x-L2.a.x);//斜率L2double x=(L1.a.x*KL1-L2.a.x*KL2-L1.a.y+L2.a.y)/(KL1-KL2);double y=KL1*x-KL1*L1.a.x+L1.a.y;return Point(x,y);}}
}

二、判断直线与射线的关系

1.判断直线与射线的关系

int CheckLine_Rays(Line L, Point c, Point v)//直线L,与以c为起点,v为方向的射线的关系
{// -1表示射线直线重合// 0表示射线直线平行// 1表示射线直线相交// 2表示射线直线不相交if( fabs(Cross(L.b-L.a, v)) < EPS)//直线与向量v平行{if( fabs(Cross(L.a-c, L.b-c)) < EPS)//射线与直线重合return -1;return 0;}else{if( Cross(c-L.a, L.b-L.a)*Cross(L.b-L.a,v) >=0 )//直线射线相交return 1;return 2;}
}

2.直线与射线的交点

当射线与直线相交时,可以用求两直线交点的方式计算

Point Line_RaysIntersection(Line L,Point c,Point v)
{Line L2(c,c+v);//c+v为射线上一点int state=CheckLineIntersection(L,L2);return LineIntersection(L,L2,state);
}

三、判断直线与线段的关系

1.直线与线段的关系

int CheckLine_SegmentIntersection(Line L, Line S)//直线与线段S的关系
{// -1表示线段直线重合// 0表示线段直线平行// 1表示线段直线相交// 2表示线段直线不相交if( fabs(Cross(L.b-L.a, S.b-S.a)) < EPS)//直线与线段平行{if( fabs(Cross(L.a-S.a, L.b-S.a)) < EPS)//射线与直线重合return -1;return 0;}else{double tmp = Cross(L.b-L.a, S.a-L.a)*Cross(L.b-L.a, S.b-L.a);if( tmp < 0.0 || fabs(tmp) < EPS )return 1;return 2;}
}

2.直线与线段的交点

已知线段与直线有交点,则直接可以求直线相交的方式计算交点

Point Line_SegmentIntersection(Line L, Line S)//直线与线段的交点,states是两条直线的状态
{int state=CheckLineIntersection(L,S);return LineIntersection(L,S,state);
}

四、射线与射线的关系 //暂时空缺

五、射线与线段的关系

1.射线与线段的关系

int CheckRays_SegmentIntersection(Line S, Point c, Point v)//以c为起点方向为v的射线 是否经过线段S
{// -1表示线段重合// 0表示线段平行// 1表示线段相交// 2表示线段不相交if( fabs(Cross(S.b-S.a, v)) <EPS)//线段与向量v平行{if(v.x*(S.a.x-c.x)>=0 || v.x*(S.b.x-c.x)>=0) // 点c在线段S上,有重合部分return -1;elsereturn 0;}else{if( Cross(c-S.a, S.b-S.a)*Cross(S.b-S.a,v)>=0)//c为起点,v为方向的射线经过线段S{if(Cross(S.a-c, v)*Cross(S.b-c, v)<=0)//c为起点,v为方向的射线经过线段S,即向量v在向量a-c与b-c之间return 1;elsereturn 2;}elsereturn 2;}
}

2.射线与线段的交点

已知线段与射线有交点,则直接可以求直线相交的方式计算交点

Point Rays_SegmentIntersection(Line S,Point c,Point v)//直线L,与以c为起点,v为方向的射线的交点
{Line L2(c,c+v);//c+v为射线上一点int state=CheckLineIntersection(S,L2);return LineIntersection(S,L2,state);
}

六、线段与线段的关系

1.线段与线段的关系

bool CheckSegmentIntersection(Line S1,Line S2)
{double t1=Cross(S1.b-S1.a,S2.a-S1.a);double t2=Cross(S1.b-S1.a,S2.b-S1.a);double t3=Cross(S1.a-S2.a,S2.b-S2.a);double t4=Cross(S1.b-S2.a,S2.b-S2.a);if(t1*t2<=0 && t3*t4<=0)return true;return false;
}

2.线段与线段的交点

已知线段有交点,则直接可以求直线相交的方式计算交点

Point SegmentIntersection(Line S1, Line S2)//线段与线段的交点,states是两条直线的状态
{int state=CheckLineIntersection(S1,S2);return LineIntersection(S1,S2,state);
}

线段,射线,直线的关系相关推荐

  1. 计算几何(二):线段与直线,点与线,线与线的关系

    写在前面 本文基于fxj巨佬的计算几何全家桶,并基于原文进行了自己的一些整理了经验补充,阅读本文前请前往支持巨佬fxj. 直线/线段的表示: 直线与线段的表示采用两点+方向向量的表示方法. 此外,一般 ...

  2. 15. 计算几何:圆的表示 点、直线、线段与圆的关系

    文章目录 圆的表示 点.直线.线段与圆的关系 1. 点和圆的关系 2. 直线和圆的关系 3. 线段和圆的关系 4. 直线和圆的交点 圆的表示 struct Circle{Point c; //圆心do ...

  3. 点到线段直线的距离, 直线与直线的关系 直线与线段的关系

    //代码参考与kuangbin的模板#include<bits/stdc++.h> using namespace std;const double eps = 1e-8; const d ...

  4. POJ2318 TOYS / POJ2398Toy Storage判断点与直线位置关系 【计算几何】

    Calculate the number of toys that land in each bin of a partitioned toy box. 计算每一个玩具箱里面玩具的数量 Mom and ...

  5. 判断线段和直线相交 POJ 3304

    1 // 判断线段和直线相交 POJ 3304 2 // 思路: 3 // 如果存在一条直线和所有线段相交,那么平移该直线一定可以经过线段上任意两个点,并且和所有线段相交. 4 5 #include ...

  6. 点与直线位置关系,叉乘

    叉乘原理 它可以用来判断点在直线的某侧.进而可以解决点是否在三角形内,两个矩形是否重叠等问题.向量的叉积的模表示这两个向量围成的平行四边形的面积. 设矢量P = ( x1, y1 ),Q = ( x2 ...

  7. 【POJ - 2318】TOYS(计算几何,叉积判断点与直线位置关系,二分)

    题干: Calculate the number of toys that land in each bin of a partitioned toy box.  Mom and dad have a ...

  8. 求线段或直线与圆的交点

    2019独角兽企业重金招聘Python工程师标准>>> 设圆心为O,圆半径为r,直线(或线段)L上的两个点为P1.P2. 第一步:如果L是线段且P1,P2都包含在O内,则没有交点. ...

  9. 求直线(线段)与直线(线段)的交点

    知识储备: 叉乘:http://blog.csdn.net/nightmare_ak/article/details/77199940 定比分点法:http://blog.csdn.net/night ...

最新文章

  1. JSP第二次作业_4小题
  2. 【算法系列】一道面试算法题
  3. 电子产品设计流程_产品设计“学习、就业、留学”全攻略
  4. scala方法定义示例
  5. java akka_Akka系列(九):Akka分布式之Akka Remote
  6. TCP/IP分析(一) 协议概述
  7. 【随记】SQL Server连接字符串参数说明
  8. typecho 邮件mail插件 LoveKKCommentModify 美化版
  9. 安装glog和gflags
  10. 【java笔记】类与对象(定义,创建,使用,标准的类,对象数组)
  11. 1013 数素数 (20 分)—PAT (Basic Level) Practice (中文)
  12. Entity Framework 延伸系列目录
  13. apache服务上配置https安全与域名请求
  14. ColorPix 简单好用的屏幕取色小工具
  15. visio2010取消连接线交叉出的跨线
  16. 关于Unity 接入VR镜头的设置
  17. 《大秦帝国之裂变》感悟与经典语录
  18. 重命名 VMware ESX 主机
  19. React---什么是受控组件、非受控组件
  20. 电路板参数有哪些参数

热门文章

  1. 单片机c语言彩灯依次点亮,基于单片机的LED彩灯控制器
  2. 用PS制作简单的文字人像海报
  3. 深圳计算机网络学校,深圳广外公开学院计算机网络含金量高吗 中专技校学历提升...
  4. 20180507-A · Global Coffee Chains · ggplot2 usmap geom_map geom_point 地图 热图 美国地图 · R 语言数据可视化 案例 源码
  5. 【随笔】从友商丢单看滤食生活
  6. android 6.0蓝牙服务开启,Android应用开发之Android 6.0 蓝牙搜索不到设备原因,MIUI权限申请机制方法...
  7. json_encode在线工具
  8. 车站计算机英语,车站的英文怎么读
  9. Wifi信号强弱判断
  10. 云原生|kubernetes|多集群管理之kubeconfig文件配置和使用(定义,使用方法,合并管理多集群)