判断线段相交并求交点
来源:互联网 发布:网络销售每天做什么 编辑:程序博客网 时间:2024/05/17 23:19
const double precision = 1e-6;const double inf = (1<<30);const int maxn = 1e6+10;int n;struct Tpoint{ double x; double y; Tpoint(double x = 0, double y = 0) : x(x) , y(y) { } void print(){ printf(" (%.3f,%.3f) \n",x,y); }}l11,l12,l21,l22,l31,l32,l41,l42,bl11,bl12,bl21,bl22,bl31,bl32,bl41,bl42;Tpoint operator + (Tpoint A, Tpoint B) { return Tpoint(A.x+B.x, A.y+B.y); }Tpoint operator - (Tpoint A, Tpoint B) { return Tpoint(A.x-B.x, A.y-B.y); }Tpoint operator * (Tpoint A, double p) { return Tpoint(A.x*p, A.y*p); }Tpoint operator / (Tpoint A, double p) { return Tpoint(A.x/p, A.y/p); }struct Tline{ Tpoint a,b; Tline(Tpoint x,Tpoint y):a(x),b(y){};};Tpoint bzx,bys,szx,sys,a[maxn],b[maxn];int line[maxn];pii check[5],inter[5];pdi ans[maxn*4];int anscnt = 0;double crossprod(Tpoint a,Tpoint b,Tpoint c){ return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);}bool intersection(Tpoint a,Tpoint b,Tpoint c,Tpoint d){ if(max(a.x,b.x)>=min(c.x,d.x) && max(c.x,d.x)>=min(a.x,b.x) && max(a.y,b.y)>=min(c.y,d.y) && max(c.y,d.y)>=min(a.y,b.y) && crossprod(a,b,c)*crossprod(a,b,d)<=0 && crossprod(c,d,a)*crossprod(c,d,b)<=0)return 1; return 0;}double det(Tpoint a,Tpoint b){ return a.x*b.y-a.y*b.x;}pii GetLineIntersection(Tpoint A, Tpoint B, Tpoint C, Tpoint D) { Tline a = Tline(A,B); Tline b = Tline(C,D); double s1 = det(a.a-b.a,b.b-b.a); double s2 = det(a.b-b.a,b.b-b.a); Tpoint res ; res = (a.b*s1-a.a*s2)/(s1-s2); return make_pair(res.x,res.y);}void sov(){ for(int i = 0 ; i < n ; i++){ int cnt = 0; if(intersection(a[i],b[i],l11,l12) ) {inter[cnt++] = GetLineIntersection(a[i],b[i],l11,l12);pii ans1=inter[cnt-1];flag1 = true;cout << "1: ( "<<ans1.first<<" , "<<ans1.second<<" )"<<endl;} if(intersection(a[i],b[i],l21,l22) ) {inter[cnt++] = GetLineIntersection(a[i],b[i],l21,l22);pii ans1=inter[cnt-1];flag2 = true;cout << "2: ( "<<ans1.first<<" , "<<ans1.second<<" )"<<endl;} if(intersection(a[i],b[i],l31,l12) ) {inter[cnt++] = GetLineIntersection(a[i],b[i],l31,l32);pii ans1=inter[cnt-1];flag3 = true;cout << "3: ( "<<ans1.first<<" , "<<ans1.second<<" )"<<endl;} if(intersection(a[i],b[i],l41,l42) ) {inter[cnt++] = GetLineIntersection(a[i],b[i],l41,l42);pii ans1=inter[cnt-1];flag4 = true;cout << "4: ( "<<ans1.first<<" , "<<ans1.second<<" )"<<endl;} if(intersection(a[i],b[i],bl11,bl12) ) {inter[cnt++] = GetLineIntersection(a[i],b[i],bl11,bl12);pii ans1=inter[cnt-1];flag5 = true;cout << "5: ( "<<ans1.first<<" , "<<ans1.second<<" )"<<endl;} if(intersection(a[i],b[i],bl21,bl22) ) {inter[cnt++] = GetLineIntersection(a[i],b[i],bl21,bl22);pii ans1=inter[cnt-1];flag6 = true;cout << "6: ( "<<ans1.first<<" , "<<ans1.second<<" )"<<endl;} if(intersection(a[i],b[i],bl31,bl32) ) {inter[cnt++] = GetLineIntersection(a[i],b[i],bl31,bl32);pii ans1=inter[cnt-1];flag7 = true;cout << "7: ( "<<ans1.first<<" , "<<ans1.second<<" )"<<endl;} if(intersection(a[i],b[i],bl41,bl42) ) {inter[cnt++] = GetLineIntersection(a[i],b[i],bl41,bl42);pii ans1=inter[cnt-1];flag8 = true;cout << "8: ( "<<ans1.first<<" , "<<ans1.second<<" )"<<endl;} }}
阅读全文
0 0
- 判断线段相交并求交点
- 判断两线段相交,并求交点
- poj 1269 Intersecting Lines(判断线段相交,并求交点)
- poj 1296 Noise Effect(判断线段相交,并求交点)
- 判断两条线段/直线相交,并求交点
- 判断两条线段/直线相交,并求交点
- 判断两线段是否相交,并求交点
- POJ1039Pipe【线段相交判断+求交点】
- 判断两线段是否相交求交点
- 判断线段是否相交...并求出交点。
- uva 303 pipe (求线段交点,判断线段相交)
- 求线段相交交点坐标
- 判断两线段是否相交并计算交点坐标
- poj 1269 判断直线相交,并求交点
- 判断两个链表是否相交并求交点
- 两直线四坐标点判断相交并求交点
- [poj 1039]Pipes[线段相交求交点]
- 判断线段是否相交的函数和求直线交点的函数
- Eclipse中tomcat访问本地文件
- Leetcode 题目记录:231,342,191, 190,172,258,292
- 软件建设与城市建设的相似性
- Shell脚本编写及常见面试题(一)
- c++设计模式
- 判断线段相交并求交点
- vue自定义过滤器
- 极大似然估计
- MFC_CListCtrl 列表控件(常用)
- 加入键盘鼠标控制的代码
- BZOJ 4385 Wilcze doły
- Shell脚本编写及常见面试题(二)
- 链接队列(Link Queue)——队列的链接实现
- 2017北京网络赛hihocoder 1580 matrix(dp)