线段,射线,直线的关系
二维坐标系
#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);
}
线段,射线,直线的关系相关推荐
- 计算几何(二):线段与直线,点与线,线与线的关系
写在前面 本文基于fxj巨佬的计算几何全家桶,并基于原文进行了自己的一些整理了经验补充,阅读本文前请前往支持巨佬fxj. 直线/线段的表示: 直线与线段的表示采用两点+方向向量的表示方法. 此外,一般 ...
- 15. 计算几何:圆的表示 点、直线、线段与圆的关系
文章目录 圆的表示 点.直线.线段与圆的关系 1. 点和圆的关系 2. 直线和圆的关系 3. 线段和圆的关系 4. 直线和圆的交点 圆的表示 struct Circle{Point c; //圆心do ...
- 点到线段直线的距离, 直线与直线的关系 直线与线段的关系
//代码参考与kuangbin的模板#include<bits/stdc++.h> using namespace std;const double eps = 1e-8; const d ...
- POJ2318 TOYS / POJ2398Toy Storage判断点与直线位置关系 【计算几何】
Calculate the number of toys that land in each bin of a partitioned toy box. 计算每一个玩具箱里面玩具的数量 Mom and ...
- 判断线段和直线相交 POJ 3304
1 // 判断线段和直线相交 POJ 3304 2 // 思路: 3 // 如果存在一条直线和所有线段相交,那么平移该直线一定可以经过线段上任意两个点,并且和所有线段相交. 4 5 #include ...
- 点与直线位置关系,叉乘
叉乘原理 它可以用来判断点在直线的某侧.进而可以解决点是否在三角形内,两个矩形是否重叠等问题.向量的叉积的模表示这两个向量围成的平行四边形的面积. 设矢量P = ( x1, y1 ),Q = ( x2 ...
- 【POJ - 2318】TOYS(计算几何,叉积判断点与直线位置关系,二分)
题干: Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a ...
- 求线段或直线与圆的交点
2019独角兽企业重金招聘Python工程师标准>>> 设圆心为O,圆半径为r,直线(或线段)L上的两个点为P1.P2. 第一步:如果L是线段且P1,P2都包含在O内,则没有交点. ...
- 求直线(线段)与直线(线段)的交点
知识储备: 叉乘:http://blog.csdn.net/nightmare_ak/article/details/77199940 定比分点法:http://blog.csdn.net/night ...
最新文章
- JSP第二次作业_4小题
- 【算法系列】一道面试算法题
- 电子产品设计流程_产品设计“学习、就业、留学”全攻略
- scala方法定义示例
- java akka_Akka系列(九):Akka分布式之Akka Remote
- TCP/IP分析(一) 协议概述
- 【随记】SQL Server连接字符串参数说明
- typecho 邮件mail插件 LoveKKCommentModify 美化版
- 安装glog和gflags
- 【java笔记】类与对象(定义,创建,使用,标准的类,对象数组)
- 1013 数素数 (20 分)—PAT (Basic Level) Practice (中文)
- Entity Framework 延伸系列目录
- apache服务上配置https安全与域名请求
- ColorPix 简单好用的屏幕取色小工具
- visio2010取消连接线交叉出的跨线
- 关于Unity 接入VR镜头的设置
- 《大秦帝国之裂变》感悟与经典语录
- 重命名 VMware ESX 主机
- React---什么是受控组件、非受控组件
- 电路板参数有哪些参数
热门文章
- 单片机c语言彩灯依次点亮,基于单片机的LED彩灯控制器
- 用PS制作简单的文字人像海报
- 深圳计算机网络学校,深圳广外公开学院计算机网络含金量高吗 中专技校学历提升...
- 20180507-A · Global Coffee Chains · ggplot2 usmap geom_map geom_point 地图 热图 美国地图 · R 语言数据可视化 案例 源码
- 【随笔】从友商丢单看滤食生活
- android 6.0蓝牙服务开启,Android应用开发之Android 6.0 蓝牙搜索不到设备原因,MIUI权限申请机制方法...
- json_encode在线工具
- 车站计算机英语,车站的英文怎么读
- Wifi信号强弱判断
- 云原生|kubernetes|多集群管理之kubeconfig文件配置和使用(定义,使用方法,合并管理多集群)