两条线段
难度:白银
0时间限制:1秒
巴占用内存:64M
输入2个线段的端点的坐标值和y(X,y不重合),判断两条线段是否交叉,输出
YES或者NO.
格式
输入格式:输入整型,空格分隔。按照先起点(Xy),空格,再终点
(Xy)的次序。每行一个线段的信息。
输出格式:输出YES或者NO
//
// Created by abner on 2022/11/5.
//
#include<bits/stdc++.h>>
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 <max(y1,y2)));
//}
}
//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)));
//}
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)等。
长度的单位换算时,小单位变大单位用乘法,大单位换小单位用除法。
方法一:使用度量工具量出这两条线段的长度,度量单位相同,所得量数大的线段较长。
方法二:叠合法比较,两条线段的一个端点重合,另一个端点落在此端点的同一侧,看另一端点的位置.
方法三:使用圆规。