注意:

不碰任何顶点-----(上下移动)>碰一个顶点-----(绕此顶点旋转)>碰两个顶点-----(绕前后两个顶点旋转)>碰上下各一个顶点

其中:判断i,j是否被某壁阻挡,可通过判断是否与垂直线段相交判断!!!!!!!!!!

View Code

 1 /*
 2 几何+直线相交+求交点
 3 */
 4 #include<stdio.h>
 5 #include<string.h>
 6 #include<stdlib.h>
 7 #include<algorithm>
 8 using namespace std;
 9 const int maxn = 24;
10 const double inf= 99999999.0;
11 const double eps = 1e-8;
12 struct Point{
13     double x,y;
14 }up[ maxn ],down[ maxn ];
15 int sig( double d ){
16     if( d>eps ) return 1;
17     if( d<-eps ) return -1;
18     return 0;
19 }
20 double xmult( Point a,Point b,Point c ){
21     return ( b.x-a.x )*( c.y-a.y )-( b.y-a.y )*( c.x-a.x );
22 }
23 bool check( Point a,Point b,Point c,Point d ){
24     return (( sig(xmult(a,b,c)) )*( sig(xmult(a,b,d)) )<=0);
25 }
26 double Intersection( Point a,Point b,Point c,Point d ){
27     double s1 = xmult( a,b,c );
28     double s2 = xmult( a,b,d );
29     int t1,t2;
30     t1 = sig( s1 ),t2 = sig( s2 );
31     if( t1*t2<0 ){
32         return ( c.x*s2-d.x*s1 )/(s2-s1);//return x 坐标
33         //(c.y*s2-d.y*s1)/(s2-s1)
34     }
35     if( t1*t2==0 ){
36         if( t1==0 ) return c.x;
37         if( t2==0 ) return d.x;
38     }
39     return -inf;
40 }
41 int main(){
42     int n;
43     while( scanf("%d",&n)==1,n ){
44         for( int i=1;i<=n;i++ ){
45             scanf("%lf%lf",&up[ i ].x,&up[ i ].y);
46             down[ i ].x = up[ i ].x;
47             down[ i ].y = up[ i ].y-1.0;
48         }
49         double ans = -inf;
50         bool flag = false;//是否能贯通两端
51         for( int i=1;i<=n;i++ ){
52             for( int j=1;j<=n;j++ ){
53                 if( i!=j ){
54                     int k;
55                     for( k=1;k<=n;k++ ){
56                         if( check( up[i],down[j],up[k],down[k] )==true ){}//与垂直的线段相交true
57                         else break;
58                     }
59                     if( k>n ){
60                         flag = true;
61                         break;
62                     }
63                     else if( k>max(i,j) ){
64                         double pos;
65                         pos = Intersection( up[i],down[j],up[k],up[k-1] );
66                         if( pos>ans ) ans = pos;
67                         pos = Intersection( up[i],down[j],down[k],down[k-1] );
68                         if( pos>ans ) ans = pos;
69                         //因为不知道ij是和上管壁相交还是下管壁相交
70                     }
71                 }
72             }
73             if( flag==true ) break;
74         }
75         if( flag == true ) printf("Through all the pipe.\n");
76         else printf("%.2lf\n",ans);
77     }
78     return 0;
79 }

转载于:https://www.cnblogs.com/xxx0624/archive/2013/03/28/2987373.html

POJ1039+几何+直线于线段相交相关推荐

  1. 【POJ - 3304 】Segments(计算几何,思想转化,直线和线段相交)

    题干: Given n segments in the two dimensional space, write a program, which determines if there exists ...

  2. 两直线平行交叉相乘_计算几何算法5. 直线、线段和平面相交(2D和3D)

    直线和线段相交 平面相交 直线-平面相交 两平面相交 三个平面相交 实现 intersect2D_2Segments() inSegment() intersect3D_SegmentPlane() ...

  3. 【POJ - 1556】The Doors (计算几何,线段相交)

    题干: You are to find the length of the shortest path through a chamber containing obstructing walls. ...

  4. 判断直线与线段 是否相交 + 加入误差 故需要判断重点 poj 3304 Segments

    题目来源:http://poj.org/problem?id=3304 分析: 题目大意:给出n条线段两个端点的坐标,问所有线段投影到一条直线上,如果这些所有投影至少相交于一点就输出Yes!,否则输出 ...

  5. 简单几何(线段相交+最短路) POJ 1556 The Doors

    题目传送门 题意:从(0, 5)走到(10, 5),中间有一些门,走的路是直线,问最短的距离 分析:关键是建图,可以保存所有的点,两点连通的条件是线段和中间的线段都不相交,建立有向图,然后用Dijks ...

  6. Segments POJ 3304 直线与线段是否相交

    题目大意:给出n条线段,问是否存在一条直线,使得n条线段在直线上的投影有至少一个公共点. 题目思路:如果假设成立,那么作该直线的垂线l,该垂线l与所有线段相交,且交点可为线段中的某两个交点 证明:若有 ...

  7. 几何常用算法与判断线段相交【转】

    下面这个函数在我写的计算几何库函数里面有,那个库可以在http://algorithm.126.com/的资源中心   -   代码角   找到. 算法简单说明: 首先判断以两条线段为对角线的矩形是否 ...

  8. 直线或线段与mesh网格相交的计算

    引言 在采样二指夹爪与mesh网格的抓取点时使用的点接触模型,抽象二指夹爪为一个线段,那么寻找夹爪与物体的接触点就抽象为直线与mesh网格的交点问题,而在mesh中物体表面是以空间三角形保存的,在进一 ...

  9. poj3304(线段相交问题)

    题意:是否存在这样一条直线,使这条直线和所有的线段相交. #include<iostream> #include<algorithm> #include<cstring& ...

  10. 判断线段相交(hdu1558 Segment set 线段相交+并查集)

    先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...

最新文章

  1. 了解生成对抗网络(GAN)
  2. Struts ActionForm简单理解
  3. oracle存储过程无效字符_Oracle存储过程基础+ 错误代码
  4. kingbase自带的驱动在哪_为什么别人家的广告语都能自带BUG?
  5. golang 用range 创建指针数组
  6. 为什么都瞧不起QQ邮箱?
  7. 【clickhouse】mac 10.15.7使用docker安装clickhouse
  8. Toon Boom Harmony 12 for Mac(二维动画设计工具)
  9. 16qam matlab 误码率,16QAM理论误码率与实际误码率MATLAB仿真程序
  10. 航测和倾斜摄影处理软件汇总
  11. 开关三极管的导通和截止条件
  12. 【刷题】LOJ 6008 「网络流 24 题」餐巾计划
  13. C++ Reflection
  14. 传奇地图时间限制脚本_地图时间限制脚本
  15. Oracle错误08s01,Java7 sqljdbc4 – getConnection()上的SQL错误08S01
  16. 近期业务大量突增微服务性能优化总结-2.开发日志输出异常堆栈的过滤插件
  17. synaptics安装
  18. 【VPP】 VPP CLI 命令
  19. 在 MaCA 根目录运行所有 py 文件
  20. Android 友盟推送收不到

热门文章

  1. Structured Streaming 入门案例之WordCount
  2. Zephyr移植到NXP MIMXRT1060_EVK-RT1061 CVL5A过程
  3. >>’ should be ‘> >’ within a nested template argument list
  4. 【吴恩达机器学习】学习笔记——4多元线性回归
  5. Clouder专项技能认证课程:网站建设——部署与发布
  6. mysql优化概述2
  7. python爬虫问题:error: command 'gcc' failed with exit status 1
  8. 如何使用 Java8 实现观察者模式?(上)
  9. 【HDU 4925】BUPT 2015 newbie practice #2 div2-C-HDU 4925 Apple Tree
  10. C# App.config 详解