POJ_1227 Jack Straws 【二维平面判两线段相交】

一 题面

  POJ1127

二 分析

  在平面几何中,判断两线段相交的方法一般是使用跨立实验。但是这题考虑了非严格相交,即如何两个线段刚好端点相交则也是相交的,所以还需要使用快速排斥实验。

  这里参考并引用了TangMoon 博客。

  1.快速排斥实验

  由于两个点作为矩形的两个斜对角线端点可以确定一个矩形,则根据两个点确定一个向量,两个向量显然可以确定两个矩形。

  对于快速排斥实验,也可尝试逆向思维,如果判断让两个向量确定的两个矩形是否相交部分,相当于判断两个矩形没有相交部分的反。

  具体条件就是a.其中一个矩形的最小横坐标大于另一个矩形的最大横坐标;b.其中一个矩形的最小纵坐标大于另一个矩形的最大纵坐标。

  2.跨立实验

  

  如图,根据以$Q1$为起点

${\overrightarrow{Q_{1}P_{2}} }\times {\overrightarrow{Q_{1}Q_{2}}}$

${\overrightarrow{Q_{1}Q_{2}} }\times {\overrightarrow{Q_{1}P_{1}}}$

  判断这两个向量的正负,如果两个值正负相同,表示$\overrightarrow{Q_{1}Q_{2}}$在两向量中间,但这显然还不够,因为可能$Q2$没跨过去,所以还需要在$P1$判断一次。

  

 

  那么这样把上述两条件都判断后,就能保证两线段非严格相交了。

三 AC代码

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdio>
  4 
  5 using namespace std;
  6 const int MAXN = 200;
  7 struct P
  8 {
  9     int a, b;
 10     P(){}
 11     P(int x, int y): a(x),b(y){}
 12     P operator + (P t)
 13     {
 14         return P(a + t.a, b + t.b);
 15     }
 16     P operator - (P t)
 17     {
 18         return P(a - t.a, b - t.b);
 19     }
 20     P operator * (P t)
 21     {
 22         return P(a*t.a, b*t.b);
 23     }
 24     int dot(P t)
 25     {
 26         return a*t.a + b*t.b;
 27     }
 28     int det(P t)
 29     {
 30         return a*t.b - b*t.a;
 31     }
 32 };
 33 int px[MAXN], py[MAXN];
 34 int qx[MAXN], qy[MAXN];
 35 
 36 bool solve(int t1, int t2)
 37 {
 38     if(min(px[t1], qx[t1]) > max(px[t2], qx[t2]) || min(px[t2], qx[t2]) > max(px[t1], qx[t1]) 
 39         || min(py[t1], qy[t2]) > max(py[t2], qy[t2]) || min(py[t2], qy[t2]) > max(py[t1], qy[t1]))
 40         return false;
 41     P p1, p2, p3;
 42     p1 = P(qx[t1]-px[t2], qy[t1]-py[t2]);
 43     p2 = P(qx[t2]-px[t2], qy[t2]-py[t2]);
 44     p3 = P(px[t1]-px[t2], py[t1]-py[t2]);
 45     if(p1.det(p2) * p2.det(p3) < 0)
 46         return false;
 47     p1 = P(px[t2]-px[t1], py[t2]-py[t1]);
 48     p2 = P(qx[t1]-px[t1], qy[t1]-py[t1]);
 49     p3 = P(qx[t2]-px[t1], qy[t2]-py[t1]);
 50     if(p1.det(p2) * p2.det(p3) < 0)
 51         return false;
 52     return true;
 53 }
 54 
 55 int par[MAXN];
 56 
 57 int find(int x)
 58 {
 59     return par[x] == x ? x : par[x] = find(par[x]);
 60 }
 61 void unite(int x, int y)
 62 {
 63     int f1 = find(x), f2 = find(y);
 64     if(f1 == f2)
 65         return;
 66     else
 67         par[f1] = f2;
 68 }
 69 
 70 
 71 int main()
 72 {
 73     //freopen("input.txt", "r", stdin);
 74     int n;
 75     while(scanf("%d", &n) == 1)
 76     {
 77         
 78         if(n == 0)  break;
 79         for(int i = 1; i <= n; i++)
 80         {
 81             par[i] = i;
 82             scanf("%d%d%d%d", &px[i], &py[i], &qx[i], &qy[i]);
 83         }
 84         for(int i = 1; i <= n; i++)
 85             for(int j = i + 1; j <= n; j++)
 86             {
 87                 if(solve(i, j))
 88                     unite(i, j);
 89             }
 90         int x, y;
 91         while(scanf("%d%d", &x, &y) != EOF)
 92         {
 93             if(x == 0)  break;
 94             if(find(x) == find(y))
 95                 printf("CONNECTED\n");
 96             else
 97                 printf("NOT CONNECTED\n");
 98         }
 99     }
100     return 0;
101 }

 

转载于:https://www.cnblogs.com/dybala21/p/10856934.html

内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
内容概要:本文深入探讨了利用历史速度命令(HVC)增强仿射编队机动控制性能的方法。论文提出了HVC在仿射编队控制中的潜在价值,通过全面评估HVC对系统的影响,提出了易于测试的稳定性条件,并给出了延迟参数与跟踪误差关系的显式不等式。研究为两轮差动机器人(TWDRs)群提供了系统的协调编队机动控制方案,并通过9台TWDRs的仿真和实验验证了稳定性和综合性能改进。此外,文中还提供了详细的Python代码实现,涵盖仿射编队控制类、HVC增强、稳定性条件检查以及仿真实验。代码不仅实现了论文的核心思想,还扩展了邻居历史信息利用、动态拓扑优化和自适应控制等性能提升策略,更全面地反映了群体智能协作和性能优化思想。 适用人群:具备一定编程基础,对群体智能、机器人编队控制、时滞系统稳定性分析感兴趣的科研人员和工程师。 使用场景及目标:①理解HVC在仿射编队控制中的应用及其对系统性能的提升;②掌握仿射编队控制的具体实现方法,包括控制器设计、稳定性分析和仿真实验;③学习如何通过引入历史信息(如HVC)来优化群体智能系统的性能;④探索中性型时滞系统的稳定性条件及其在实际系统中的应用。 其他说明:此资源不仅提供了理论分析,还包括完整的Python代码实现,帮助读者从理论到实践全面掌握仿射编队控制技术。代码结构清晰,涵盖了从初始化配置、控制律设计到性能评估的各个环节,并提供了丰富的可视化工具,便于理解和分析系统性能。通过阅读和实践,读者可以深入了解HVC增强仿射编队控制的工作原理及其实际应用效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值