好长时间没有写博客了,来一道水题练练手。
/************************************
* Author : binwin20 *
* Blog : blog.csdn.net/binwin20 *
************************************/
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <queue>
#include <map>
#include <stack>
#include <string>
#include <algorithm>
#include <vector>
#include <list>
#include <deque>
#define LL long long
#define DB double
#define SI(a) scanf("%d",&a)
#define SD(a) scanf("%lf",&a)
#define SS(a) scanf("%s",a)
#define PF printf
#define MM(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=a;i<b;i++)
#define REPD(i,a,b) for(int i=a;i>b;i--)
#define INF 0x3f3f3f3f
#define EPS 1e-8
#define bug puts("bug")
using namespace std;
#define N 109
struct cpoint{
DB x,y;
void get(){
SD(x);SD(y);
}
};
DB x_mult(cpoint a,cpoint b,cpoint p){
return (a.x-p.x)*(b.y-p.y)-(a.y-p.y)*(b.x-p.x);
}
struct csegment{
cpoint st,en;
csegment(){}
csegment(cpoint a,cpoint b){
st = a;en = b;
}
};
bool online(cpoint p1,cpoint p2,cpoint p3,cpoint p4){
if(max(p1.x,p2.x)<min(p3.x,p4.x)||max(p1.y,p2.y)<min(p3.y,p4.y)||
max(p3.x,p4.x)<min(p1.x,p2.x)||max(p3.y,p4.y)<min(p1.y,p2.y))
return false;
return true;
}
bool across_seg(csegment a,csegment b){
if(online(a.st,a.en,b.st,b.en)&&
x_mult(b.st,a.en,a.st)*x_mult(a.en,b.en,a.st)>-EPS&&
x_mult(a.st,b.en,b.st)*x_mult(b.en,a.en,b.st)>-EPS)
return true;
return false;
}
csegment re[N];
int n;
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
while(~SI(n)&&n){
REP(i,0,n){
re[i].st.get();
re[i].en.get();
}
int ans = 0;
REP(i,0,n)
REP(j,i+1,n){
if(across_seg(re[i],re[j])) ans++;
}
PF("%d\n",ans);
}
return 0;
}
本文介绍了一种用于判断二维平面上线段是否相交的算法,并提供了完整的C++实现代码。通过输入线段的起点和终点坐标,该算法能够有效地判断任意两条线段是否存在交点。
518

被折叠的 条评论
为什么被折叠?



