COJ 1645计算几何:判断线段是否相交

2024-06-08 23:48

本文主要是介绍COJ 1645计算几何:判断线段是否相交,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

线段相交

Time Limit: 1000 ms     Memory Limit: 10000 KB
Total Submit: 191     Accepted: 46 

Description
给你两个线段,已知它们的端点,判断它们是否有交点。

Input
第一行:x1,y1,x2,y2,代表第一条线段的两个端点;
第二行:x3,y3,x4,y4,代表第二条线段的两个端点;  ps:所有数据为整数,绝对值不超过1000.

Output
如果有交点,输出“Y”,否则输出“N”。

Sample Input
0 0 1 1
0 1 1 0

Sample Output
Y

Hint
计算几何小练习

Source
antry
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <list>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define PI acos(-1.0)
#define eps 1e-8
#define mem(a,b) memset(a,b,sizeof(a))
#define sca(a) scanf("%d",&a)
#define pri(a) printf("%d\n",a)
#define f(i,a,n) for(i=a;i<n;i++)
#define F(i,a,n) for(i=a;i<=n;i++)
#define MM 200005
#define MN 505
#define INF 10000007
using namespace std;
typedef long long ll;
inline double sqr(const double &x){ return x * x;}
inline double sgn(const double &x){ return x < -eps ? -1 : x > eps;}
struct Point{double x, y;Point(const double &x = 0, const double &y = 0):x(x), y(y){}Point operator - (const Point &a)const{ return Point(x - a.x, y - a.y);}Point operator + (const Point &a)const{ return Point(x + a.x, y + a.y);}Point operator * (const double &a)const{ return Point(x * a, y * a);}Point operator / (const double &a)const{ return Point(x / a, y / a);}bool operator < (const Point &a)const{ return sgn(x - a.x) < 0 || (sgn(x - a.x) == 0 && sgn(y - a.y) < 0);}friend double det(const Point &a, const Point &b){ return a.x * b.y - a.y * b.x;}friend double dot(const Point &a, const Point &b){ return a.x * b.x + a.y * b.y;}friend double dist(const Point &a, const Point &b){ return sqrt(sqr(a.x - b.x) + sqr(a.y - b.y));}double len(){ return sqrt(dot(*this, *this));}Point rotateA(const double &angle)const{ return rotateS(cos(angle), sin(angle));}Point rotateS(const double &cosa, const double &sina)const{ return Point(x * cosa - y * sina, x * sina + y * cosa);}void in(){  scanf("%lf %lf", &x, &y); }void out()const{ printf("%.2f %.2f\n",x, y);}
};
struct Line{Point s, t;Line(const Point &s = Point(), const Point &t = Point()):s(s), t(t){}Point dire()const{ return t - s;}double len()const{ return dire().len();}bool isPointInLine(const Point &p)const{ return sgn(det(p - s, t - s)) == 0 && sgn(dot(p - s, p - t)) <= 0;}bool isPointInLineEx(const Point &p)const{ return sgn(det(p - s, t - s)) == 0 && sgn(dot(p - s, p - t)) < 0;}//不含端点Point pointProjLine(const Point &p){ return s + dire() * ((dot(p - s, dire()) / dire().len()) /(dire().len()));}double pointDistLine(const Point &p){ return fabs(det(p - s, dire()) / dire().len());}friend bool sameSide(const Line &line , const Point &a, const Point &b){return sgn(det(b - line.s, line.dire())) * sgn(det(a - line.s, line.dire())) > 0;}friend bool isLineInsectLine(const Line &l1, const Line &l2){if(sgn(det(l2.s - l1.s, l1.dire())) == 0 && sgn(det(l2.t - l1.s, l1.dire())) == 0&& sgn(det(l1.s - l2.s, l2.dire())) == 0 && sgn(det(l1.t - l2.s, l2.dire())) == 0){return l1.isPointInLine(l2.s) || l1.isPointInLine(l2.t) || l2.isPointInLine(l1.s) ||l2.isPointInLine(l1.t);}return !sameSide(l1, l2.s, l2.t) && !sameSide(l2, l1.s, l1.t);}friend Point lineInsectLine(const Line &l1, const Line &l2){double s1 = det(l1.s - l2.s, l2.dire()), s2 = det(l1.t - l2.s, l2.dire());return (l1.t * s1 - l1.s * s2) / (s1 - s2);}void in(){ s.in(); t.in();}void out()const{ s.out(); t.out(); }
};
int main()
{    Point a,b,c,d;cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y>>d.x>>d.y;Line a1,b1;a1.s=a,a1.t=b,b1.s=c,b1.t=d;if(isLineInsectLine(a1,b1)) puts("Y");else puts("N");return 0;
}


这篇关于COJ 1645计算几何:判断线段是否相交的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1043655

相关文章

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

hdu1689(线段树成段更新)

两种操作:1、set区间[a,b]上数字为v;2、查询[ 1 , n ]上的sum 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdl

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu