
两条线段
难度:白银
0时间限制:1秒
巴占用内存:64M
输入2个线段的端点的坐标值和y(X,y不重合),判断两条线段是否交叉,输出
YES或者NO.
格式
输入格式:输入整型,空格分隔。按照先起点(Xy),空格,再终点
(Xy)的次序。每行一个线段的信息。
输出格式:输出YES或者NO
- //
- // Created by abner on 2022/11/5.
- //
-
- #include
> - using namespace std;
- bool inside(int x1,int y1,int x2,int y2,int xk,int yk)
- {
- return (x1 == x2 || (min(x1,x2) <= xk && xk <= max(x1,x2)))&& (y1 == y2 || (min(y1,y2) <= yk && yk <= max(y1,y2)));
- //(y1 ==y2(min(y1,y2)<=yk &yk
- //}
- }
- //bool inside(int x1,int y1,int x2,int y2,int xk,int yk)
- //return (x1 =x2 (min(x1,x2)<=xk &xk
- //(y1 ==y2(min(y1,y2)<=yk &yk
- //}
- int main()
- {
- char c;
- int x1,y1,x2,y2,x3,y3,x4,y4;
- bool check=false;
- cin>>c>>x1>>c>>y1>>c>>c>>x2>>c>>y2>>c;
- cin>>c>>x3>>c>>y3>>c>>c>>x4>>c>>y4>>c;
- if((y4-y3)*(x2-x1) == (y2-y1)*(x4-x3))//判断线段12与线段34是否平行
- {//若平行,则判断线段12与线段13是否共线
- if((y2-y1)*(x3-x1) == (y3-y1)*(x2-x1))
- {
- if (inside(x1,y1,x2,y2,x3,y3))check=true;
- //判断(x4,y4)是否在「线段」(x1,y1)~(x2,y2)上
- if (inside(x1,y1,x2,y2,x4,y4))check=true;
- //判断(x1,y1)是否在「线段(x3,y3)~(x4,y4)上
- if (inside(x3,y3,x4,y4,x1,y1))check=true;
- //判断(x2,y2)是否在「线段」(x3,y3)~(x4,y4)上
- if (inside(x3,y3,x4,y4,x2,y2))check=true;
- //在平行时,
- }}
- else//不平行
- {
- //联立方程得到t1和t2的值
- double t1 = (double)(x3 * (y4 - y3)+y1 * (x4-x3)-y3 * (x4 -x3)-x1 * (y4 -y3)) / ((x2 - x1) * (y4 - y3) - (x4-x3) * (y2 - y1));
- double t2 = (double)(x1 * (y2- y1) + y3 * (x2 - x1) - y1 * (x2 - x1)-x3 * (y2 - y1)) / ((x4 - x3) * (y2 -y1) -(x2- x1) * (y4 - y3));
- //判断t1和t2是否均在[0,1]之间
- if(t1>=0.0 && t1<=1.0 && t2>=0.0 && t2<=1.0) check=true;
- }
- if(check) cout<<"YES";
- else cout<<"NO";
- return 0;}
一、常用的方法有两种,如下:
1、度量比较法。
量得两条线段的长度,比较大小。
2、叠合比较法。
将两条线段重叠在一起,两条线段的一个端点重合,另一个端点落在另一条线段内的线段较短。
二、长度的测量
长度的测量是最基本的测量,最常用的工具是刻度尺。
长度的国际单位是米(m),常用的单位有千米(km),分米(dm),厘米(cm),毫米(mm)微米(μm)纳米(nm)等。
长度的单位换算时,小单位变大单位用乘法,大单位换小单位用除法。
方法一:使用度量工具量出这两条线段的长度,度量单位相同,所得量数大的线段较长。
方法二:叠合法比较,两条线段的一个端点重合,另一个端点落在此端点的同一侧,看另一端点的位置.
方法三:使用圆规。