HDU 1086 计算几何 求线段交点(吉大模板)

来源:互联网 发布:3d游戏编程入门经典 编辑:程序博客网 时间:2024/06/05 20:29

模板直接解决。。

#include<iostream>#include <string>#include <algorithm>using namespace std;const double eps=1e-10;struct point { double x, y; };double min(double a, double b) { return a < b ? a : b; }double max(double a, double b) { return a > b ? a : b; }bool inter(point a, point b, point c, point d){if ( min(a.x, b.x) > max(c.x, d.x) ||min(a.y, b.y) > max(c.y, d.y) ||min(c.x, d.x) > max(a.x, b.x) ||min(c.y, d.y) > max(a.y, b.y) ) return 0;double h, i, j, k;h = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);i = (b.x - a.x) * (d.y - a.y) - (b.y - a.y) * (d.x - a.x);j = (d.x - c.x) * (a.y - c.y) - (d.y - c.y) * (a.x - c.x);k = (d.x - c.x) * (b.y - c.y) - (d.y - c.y) * (b.x - c.x);return h * i <= eps && j * k <= eps;}int main(){int n;point p[105][2];while(cin >> n, n){for(int i = 0; i < n; i++)scanf("%lf%lf%lf%lf", &p[i][0].x, &p[i][0].y, &p[i][1].x, &p[i][1].y);int sum = 0;for(int i = 0; i < n; i++){for(int j = i+1; j < n; j++){if(inter(p[i][0], p[i][1], p[j][0], p[j][1]))sum += 1;}}cout << sum << endl;}}