题意如题目

有几个点1.怪我没读好题目:给出的矩形两个端点不一定都是左上右下,但是肯定能勾勒出一个矩形。

2.现在才发现很多线段相交的判断我都没有仔细考虑这一个问题

bool ssinsert(Point p1,Point p2,Point p3,Point p4)
{ if(p1.x == p2.x && p3.x == p4.x && p2.x == p3.x)
{
if(max(p1.y,p2.y) < min(p3.y,p4.y) || min(p1.y,p2.y) > max(p3.y,p4.y))return false;
else return true;
}
if(p1.y == p2.y && p3.y == p4.y && p2.y == p3.y)
{
if(max(p1.x,p2.x) < min(p3.x,p4.x) || min(p1.x,p2.x) > max(p3.x,p4.x))return false;
else return true;
}
if(cross(p1,p2,p3) * cross(p1,p2,p4) < eps &&
cross(p3,p4,p1) * cross(p3,p4,p2) < eps)return true;
return false;
}

对于很多不需要严格线段相交的题目,也就是有一条线段的端点在另一条线段上,这样结果就是零,但是这样判断的共线是共直线如果两个线段的判定都平行于x轴但没有焦点,就会误判,所以前面我做了预处理

#include <iostream>
#include <vector>
#define eps 1e-10
using namespace std;
struct Point
{
double x,y;
Point (double x = 0.0,double y = 0.0):x(x),y(y){}
Point operator - (Point p){return Point(x - p.x,y - p.y);}
};
struct segment
{
Point p1,p2;
segment(Point p1 = Point(0.0,0.0),Point p2 = Point(0.0,0.0)):p1(p1),p2(p2){}
};
vector<segment> ls;
void init()
{
ls.clear();
}
double cross(Point p0,Point p1,Point p2)
{
Point a = p1 - p0;
Point b = p2 - p0;
return a.x * b.y - a.y * b.x;
}
bool ssinsert(Point p1,Point p2,Point p3,Point p4)
{ if(p1.x == p2.x && p3.x == p4.x && p2.x == p3.x)
{
if(max(p1.y,p2.y) < min(p3.y,p4.y) || min(p1.y,p2.y) > max(p3.y,p4.y))return false;
else return true;
}
if(p1.y == p2.y && p3.y == p4.y && p2.y == p3.y)
{
if(max(p1.x,p2.x) < min(p3.x,p4.x) || min(p1.x,p2.x) > max(p3.x,p4.x))return false;
else return true;
}
if(cross(p1,p2,p3) * cross(p1,p2,p4) < eps &&
cross(p3,p4,p1) * cross(p3,p4,p2) < eps)return true;
return false;
}
bool inner(Point p1,Point p2,Point p3,Point p4)
{
if(min(p1.y,p2.y) >= min(p3.y,p4.y) && max(p1.y,p2.y) <= max(p3.y,p4.y) &&
min(p1.x,p2.x) >= min(p3.x,p4.x) && max(p1.x,p2.x) <= max(p3.x,p4.x))return true;
return false;
}
int main()
{
int t;
double x1,y1,x2,y2;
scanf("%d",&t);
while(t--)
{
ls.clear();
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
ls.push_back(segment(Point(x1,y1),Point(x2,y2)));
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
double minx = min(x1,x2);
double maxx = max(x1,x2);
double miny = min(y1,y2);
double maxy = max(y1,y2);
Point a(minx,miny); Point b(minx,maxy);
Point c(maxx,maxy); Point d(maxx,miny);
//printf("a %lf %lf\n b %lf %lf\nc %lf %lf\nd %lf %lf\n",a.x,a.y,b.x,b.y,c.x,c.y,d.x,d.y);
ls.push_back(segment(a,b)); ls.push_back(segment(b,c));
ls.push_back(segment(c,d)); ls.push_back(segment(d,a));
int flag = 0;
for(int i = 1;i < ls.size();i++)
{
if(ssinsert(ls[0].p1,ls[0].p2,ls[i].p1,ls[i].p2) || inner(ls[0].p1,ls[0].p2,b,d))
{
flag = 1;
break;
}
}
if(flag)
{
printf("T\n");
}
else
{
printf("F\n");
} }
return 0;
}

POJ1410_还是没考虑全面——线段是否与矩形有共同的垂直投影的更多相关文章

  1. UVA 11983 Weird Advertisement --线段树求矩形问题

    题意:给出n个矩形,求矩形中被覆盖K次以上的面积的和. 解法:整体与求矩形面积并差不多,不过在更新pushup改变len的时候,要有一层循环,来更新tree[rt].len[i],其中tree[rt] ...

  2. POJ 1151 Atlantis 线段树求矩形面积并 方法详解

    第一次做线段树扫描法的题,网搜各种讲解,发现大多数都讲得太过简洁,不是太容易理解.所以自己打算写一个详细的.看完必会o(∩_∩)o 顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中, ...

  3. ZOJ 3597 Hit the Target! (线段树扫描线 -- 矩形所能覆盖的最多的点数)

    ZOJ 3597 题意是说有n把枪,有m个靶子,每把枪只有一发子弹(也就是说一把枪最多只能打一个靶子), 告诉你第 i 把枪可以打到第j个靶, 现在等概率的出现一个连续的P把枪,在知道这P把枪之后,你 ...

  4. hdu 1828 Picture(线段树扫描线矩形周长并)

    线段树扫描线矩形周长并 #include <iostream> #include <cstdio> #include <algorithm> #include &l ...

  5. 【hdu1542】线段树求矩形面积并

    分割线内容转载自http://hzwer.com/879.html ------------------------------------------------------------------ ...

  6. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

  7. 【hdu1255】线段树求矩形面积交

    题意大概就是上图这个样子.<=100组测试数据,每组<=1000个矩形. 题解: 这个问题怎么解决..做了上一题矩形面积并应该就会了.. 对于每个节点维护3个值: cnt:该节点所代表的这 ...

  8. HDU 1828 / POJ 1177 Picture --线段树求矩形周长并

    题意:给n个矩形,求矩形周长并 解法:跟求矩形面积并差不多,不过线段树节点记录的为: len: 此区间线段长度 cover: 此区间是否被整个覆盖 lmark,rmark: 此区间左右端点是否被覆盖 ...

  9. POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并

    题意:给出矩形两对角点坐标,求矩形面积并. 解法:线段树+离散化. 每加入一个矩形,将两个y值加入yy数组以待离散化,将左边界cover值置为1,右边界置为2,离散后建立的线段树其实是以y值建的树,线 ...

随机推荐

  1. C#整合VS2010和NUnit

    软件下载 .Net单元测试工具 NUnit下载:http://www.nunit.org/index.php?p=download,最新的为NUnit-2.6.0.12051.msi,下载安装. VS ...

  2. spring中作用域的问题

    在一般情况下:我们登录系统时,第一次登录当用户名或密码输入错误,在登录页面给出错误原因,当我们再刷新登录页面,应该是首次登录系统的页面(这时就不应该再给出出错提示),这时我们就应该想到错误提示信息到底 ...

  3. 协同过滤 spark scala

    1 http://www.cnblogs.com/charlesblc/p/6165201.html [转载]协同过滤 & Spark机器学习实战 2 基于Spark构建推荐引擎之一:基于物品 ...

  4. SVM总结(转)

    支持向量机 看了JULY君的博客和文档后,个人对SVM的理解和总结,欢迎交流和指正.其理论部分可以查看下面文档链接,通俗易懂. 支持向量机通俗导论(理解SVM的三层境界)     第一篇:从四个关键词 ...

  5. [leetcode]163. Missing Ranges缺失范围

    Given a sorted integer array nums, where the range of elements are in the inclusive range [lower, up ...

  6. Fragment 生命周期 全局变量的声明位置

    public class Fragment_shouye extends Fragment { private List<Zixun_shouye> datas; private TopV ...

  7. ServiceStack支持跨域提交

    //ServiceStack对浏览器有一定的限制 //修改AppHost.cs文件 using Funq;using ServiceStack;using ServiceStackTest.Servi ...

  8. mvcpager 表单提交时无法获取pageindex的值

    1.将分布页包含到form中 2.在分布页中新增一个表单hidden元素,name为pageIndex(与控制器中的pageindex保持一尺),将后台获取到的pageindex值通过viewbag初 ...

  9. php 框架选择

    背景 很多初级php甚至中级php都会陷入框架选择困难症,要么必须使用什么框架,要么一定不使用什么框架,而对框架的选择带来的效益和负担的成本并不是很清晰 框架大概分为以下这些 1. 简单轻量:tp,c ...

  10. Strand Specific mRNA sequencing 之重要性与分析

    Strand Specific mRNA sequencing 之重要性与分析 发表评论 2,761 A+ 所属分类:Bioinformatics   收  藏 研究生物基因转录体的方法有许多种,而使 ...