zoukankan      html  css  js  c++  java
  • HDU 1086 线段相交(不规范相交模板)

    题意:

    很多线段,求总交点个数(不规范相交),没有三线共点

    题解:

    模板,拿几道计算几何水题开头,准备计算几何专题了~

    这个题的细节其实很多,只是数据太水了!

    不规范相交模板:

    View Code
     1 #include <iostream>
     2 #include <cstdlib>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <algorithm>
     6 #include <cmath>
     7 
     8 #define N 110
     9 #define EPS 1e-7 
    10 #define dc doublecmp
    11 //不规范相交
    12 using namespace std;
    13 
    14 struct PO
    15 {
    16     double x,y;
    17 };
    18 
    19 struct LI
    20 {
    21     PO a,b;
    22 }li[N];
    23 
    24 int n;
    25 
    26 inline int doublecmp(double x)
    27 {
    28     if(x>EPS) return 1;
    29     else if(x<-EPS) return -1;
    30     return 0;
    31 }
    32 
    33 inline double cross(PO &a,PO &b,PO &c)
    34 {
    35     return (c.x-a.x)*(b.y-a.y)-(c.y-a.y)*(b.x-a.x);
    36 }
    37 
    38 inline double dot(PO &a,PO &b,PO &c)
    39 {
    40     return (b.x-a.x)*(c.x-a.x)+(b.y-a.y)*(c.y-a.y);
    41 }
    42 
    43 inline bool onseg(PO &a,PO &b,PO &c)//c在ab线段上 
    44 {
    45     double maxx=max(a.x,b.x);
    46     double maxy=max(a.y,b.y);
    47     double minx=min(a.x,b.x);
    48     double miny=min(a.y,b.y);
    49     if(dc(cross(a,b,c))==0&&dc(c.x-minx)>=0&&dc(c.x-maxx)<=0&&dc(c.y-miny)>=0&&dc(c.y-maxy)<=0)
    50         return true;
    51     return false;
    52 }
    53 
    54 inline bool segcross(LI &a,LI &b)//判断线段相交(不规范) 
    55 {
    56     int d1,d2,d3,d4;
    57     d1=dc(cross(b.a,b.b,a.a));
    58     d2=dc(cross(b.a,b.b,a.b));
    59     d3=dc(cross(a.a,a.b,b.a));
    60     d4=dc(cross(a.a,a.b,b.b));
    61     if(d1*d2<0&&d3*d4<0) return true;
    62     if(d1==0&&onseg(b.a,b.b,a.a)) return true;
    63     if(d2==0&&onseg(b.a,b.b,a.b)) return true;
    64     if(d3==0&&onseg(a.a,a.b,b.a)) return true;
    65     if(d4==0&&onseg(a.a,a.b,b.b)) return true;
    66     return false;
    67 }
    68 
    69 inline void read()
    70 {
    71     for(int i=1;i<=n;i++)
    72         scanf("%lf%lf%lf%lf",&li[i].a.x,&li[i].a.y,&li[i].b.x,&li[i].b.y);
    73 }
    74 
    75 inline void go()
    76 {
    77     int ans=0;
    78     for(int i=1;i<=n;i++)
    79         for(int j=i+1;j<=n;j++)
    80             if(segcross(li[i],li[j])) ans++;
    81     printf("%d\n",ans);
    82 }
    83 
    84 int main()
    85 {
    86     while(scanf("%d",&n),n) read(),go();
    87     return 0;
    88 }
  • 相关阅读:
    duilib中各控件响应的消息类型
    CoInitialize()、CoInitializeEx()和AfxOleInit()区别联系
    Linux下反斜杠号""引发的思考
    人生规划和GTD——“知”、“得”与“合”
    一次失败的面试——IBM电话面试
    Duilib介绍以及各个类的简介
    Linux与Windows中动态链接库的分析与对比
    VC++创建、调用dll的方法步骤
    网络对抗 Exp0 Kali安装 Week1
    2018-2019-1 20165226_20165310_20165315 实验五 通讯协议设计
  • 原文地址:https://www.cnblogs.com/proverbs/p/2923776.html
Copyright © 2011-2022 走看看