FZU 2273 Triangles 第八届福建省赛 (三角形面积交 有重边算相交)
Problem Description
This is a simple problem. Given two triangles A and B, you should determine they are intersect, contain or disjoint. (Public edge or point are treated as intersect.)
Input
First line contains an integer T (1 ≤ T ≤ 10), represents there are T test cases.
For each test case: X1 Y1 X2 Y2 X3 Y3 X4 Y4 X5 Y5 X6 Y6. All the coordinate are integer. (X1,Y1) , (X2,Y2), (X3,Y3) forms triangles A ; (X4,Y4) , (X5,Y5), (X6,Y6) forms triangles B.
-10000<=All the coordinate <=10000
Output
For each test case, output “intersect”, “contain” or “disjoint”.
Sample Input
Sample Output
- #include<cstdio>
- #include<cmath>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #include<cstdlib>
- #include<queue>
- #include<map>
- #include<stack>
- #include<set>
- using namespace std;
- const int maxn=;
- const int maxisn=;
- const double eps=1e-;
- const double pi=acos(-1.0);
- int dcmp(double x){
- if(x>eps) return ;
- return x<-eps ? - : ;
- }
- inline double Sqr(double x){
- return x*x;
- }
- #define zero(x)(((x)>0?(x):-(x))<eps)
- struct Point{
- double x,y;
- Point(){x=y=;}
- Point(double x,double y):x(x),y(y){};
- friend Point operator + (const Point &a,const Point &b) {
- return Point(a.x+b.x,a.y+b.y);
- }
- friend Point operator - (const Point &a,const Point &b) {
- return Point(a.x-b.x,a.y-b.y);
- }
- friend bool operator == (const Point &a,const Point &b) {
- return dcmp(a.x-b.x)==&&dcmp(a.y-b.y)==;
- }
- friend Point operator * (const Point &a,const double &b) {
- return Point(a.x*b,a.y*b);
- }
- friend Point operator * (const double &a,const Point &b) {
- return Point(a*b.x,a*b.y);
- }
- friend Point operator / (const Point &a,const double &b) {
- return Point(a.x/b,a.y/b);
- }
- friend bool operator < (const Point &a, const Point &b) {
- return a.x < b.x || (a.x == b.x && a.y < b.y);
- }
- inline double dot(const Point &b)const{
- return x*b.x+y*b.y;
- }
- inline double cross(const Point &b,const Point &c)const{
- return (b.x-x)*(c.y-y)-(c.x-x)*(b.y-y);
- }
- };
- Point LineCross(const Point &a,const Point &b,const Point &c,const Point &d){
- double u=a.cross(b,c),v=b.cross(a,d);
- return Point((c.x*v+d.x*u)/(u+v),(c.y*v+d.y*u)/(u+v));
- }
- double PolygonArea(Point p[],int n){
- if(n<) return 0.0;
- double s=p[].y*(p[n-].x-p[].x);
- p[n]=p[];
- for(int i=;i<n;i++){
- s+=p[i].y*(p[i-].x-p[i+].x);
- }
- return fabs(s*0.5);
- }
- double CPIA(Point a[],Point b[],int na,int nb){
- Point p[maxisn],temp[maxisn];
- int i,j,tn,sflag,eflag;
- a[na]=a[],b[nb]=b[];
- memcpy(p,b,sizeof(Point)*(nb+));
- for(i=;i<na&&nb>;++i){
- sflag=dcmp(a[i].cross(a[i+],p[]));
- for(j=tn=;j<nb;++j,sflag=eflag){
- if(sflag>=) temp[tn++]=p[j];
- eflag=dcmp(a[i].cross(a[i+],p[j+]));
- if((sflag^eflag)==-)
- temp[tn++]=LineCross(a[i],a[i+],p[j],p[j+]);
- }
- memcpy(p,temp,sizeof(Point)*tn);
- nb=tn,p[nb]=p[];
- }
- if(nb<) return 0.0;
- return PolygonArea(p,nb);
- }
- double SPIA(Point a[],Point b[],int na,int nb){
- int i,j;
- Point t1[],t2[];
- double res=0.0,if_clock_t1,if_clock_t2;
- a[na]=t1[]=a[];
- b[nb]=t2[]=b[];
- for(i=;i<na;i++){
- t1[]=a[i-],t1[]=a[i];
- if_clock_t1=dcmp(t1[].cross(t1[],t1[]));
- if(if_clock_t1<) swap(t1[],t1[]);
- for(j=;j<nb;j++){
- t2[]=b[j-],t2[]=b[j];
- if_clock_t2=dcmp(t2[].cross(t2[],t2[]));
- if(if_clock_t2<) swap(t2[],t2[]);
- res+=CPIA(t1,t2,,)*if_clock_t1*if_clock_t2;
- }
- }
- return res;
- //return PolygonArea(a,na)+PolygonArea(b,nb)-res;
- }
- Point a[],b[];
- Point aa[],bb[];
- double length(Point p1,Point p2)//求边长
- {
- double res=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
- return res;
- }
- double area_triangle(double l1,double l2,double l3)//求三角形面积
- {
- double s=(l1+l2+l3)/2.0;
- double res=sqrt(s*(s-l1)*(s-l2)*(s-l3));
- return res;
- }
- double xmult(Point p1,Point p2,Point p0)
- {
- return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
- }
- int parallel(Point u1,Point u2,Point v1,Point v2)//判断平行
- {
- return zero((u1.x-u2.x)*(v1.y-v2.y)-(v1.x-v2.x)*(u1.y-u2.y));
- }
- int dot_online_in(Point p,Point l1,Point l2)
- {
- return zero(xmult(p,l1,l2))&&(l1.x-p.x)*(l2.x-p.x)<eps&&(l1.y-p.y)*(l2.y-p.y)<eps;
- }
- int main()
- {
- int T;
- scanf("%d",&T);
- while(T--)
- {
- for(int i=;i<;i++) scanf("%lf %lf",&a[i].x,&a[i].y);
- for(int i=;i<;i++) scanf("%lf %lf",&b[i].x,&b[i].y);
- double area_double =fabs(SPIA(a,b,,));//重合面积
- double l1=length(a[],a[]),l2=length(a[],a[]),l3=length(a[],a[]);
- double l4=length(b[],b[]),l5=length(b[],b[]),l6=length(b[],b[]);
- if(area_double>eps) //包含或相交
- {
- if(abs(area_double-area_triangle(l1,l2,l3))<eps)
- printf("contain\n");
- else if(abs(area_double-area_triangle(l4,l5,l6))<eps)
- printf("contain\n");
- else
- printf("intersect\n");
- }
- else //相交或相离
- {
- bool flag=false;
- //判断是否有边重合
- for(int i=;i<;i++)
- {
- for(int ii=i+;ii<;ii++)
- {
- for(int j=;j<;j++)
- {
- for(int jj=j+;jj<;jj++)
- {
- if(parallel(a[i],a[ii],b[j],b[jj]))
- if(dot_online_in(a[i],b[j],b[jj]))
- {
- flag=true;
- break;
- }
- }
- if(flag)
- break;
- }
- if(flag)
- break;
- }
- if(flag)
- break;
- }
- if(flag)
- printf("intersect\n");
- else
- printf("disjoint\n");
- }
- }
- return ;
- }
FZU 2273 Triangles 第八届福建省赛 (三角形面积交 有重边算相交)的更多相关文章
- FZU 2272 Frog 第八届福建省赛 (鸡兔同笼水题)
Problem Description Therearex frogs and y chicken in a garden. Kim found there are n heads and m leg ...
- FOJ Problem 2273 Triangles
Problem 2273 Triangles Accept: 201 Submit: 661Time Limit: 1000 mSec Memory Limit : 262144 KB P ...
- 第八届河南省赛B.最大岛屿(dfs)
B.最大岛屿 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 30 Solved: 18 [Submit][Status][Web Board] De ...
- TZOJ 2519 Regetni(N个点求三角形面积为整数总数)
描述 Background Hello Earthling. We're from the planet Regetni and need your help to make lots of mone ...
- ytu 1058: 三角形面积(带参的宏 练习)
1058: 三角形面积 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 190 Solved: 128[Submit][Status][Web Boar ...
- UVa 11437:Triangle Fun(计算几何综合应用,求直线交点,向量运算,求三角形面积)
Problem ATriangle Fun Input: Standard Input Output: Standard Output In the picture below you can see ...
- OpenJudge计算概论-计算三角形面积【海伦公式】
/*============================================== 计算三角形面积 总时间限制: 1000ms 内存限制: 65536kB 描述 平面上有一个三角形,它的 ...
- bzoj 1845: [Cqoi2005] 三角形面积并 扫描线
1845: [Cqoi2005] 三角形面积并 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 848 Solved: 206[Submit][Statu ...
- nyoj 67 三角形面积【三角形面积公式】
三角形面积 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 给你三个点,表示一个三角形的三个顶点,现你的任务是求出该三角形的面积 输入 每行是一组测试数据,有6个 ...
随机推荐
- 【其他】【Restful】【1】简单了解Restful概念
内容: REST是一种设计风格,不是一种标准,是一种思想.符合REST原则的架构方式即可称为RESTful. 在Restful之前的操作:http://127.0.0.1/user/query/1 G ...
- python-Tornado 框架
概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...
- http.cof
## This is the main Apache HTTP server configuration file. It contains the# configuration directives ...
- jQuery-全屏滚动插件【fullPage.js】API 使用方法总结
jQuery-全屏滚动插件[fullPage.js]API 使用方法总结 jQuery-全屏滚动插件fullPage.js使用方法总结 作者github及下载地址:https://github.c ...
- Android 之常用布局
LinearLayout 线性布局. android:orientation="horizontal" 制定线性布局的排列方式 水平 horizontal 垂直 vertical ...
- Tomcat压缩传输设置
1.配置位于server.xml文件中的Connector节点下,具体参数如下: 参数 默认值 参数说明 compression off 是否开启压缩传输 compressableMimeType t ...
- ES6中的Promise.resolve()的作用
var foo = { then: (resolve, reject) => resolve('foo') }; var resolved = Promise.resolve(foo); 相当于 ...
- 【MVC】快速构建一个图片浏览网站
当抄完MusicStore时,你应该对MVC有一个比较清晰的认识了.接下来就需要做个网站来继续增加自己的知识了.那么,该做个什么网站呢.做个图片浏览网站吧,简单而实用. 简单设计 1.首先,页面中间是 ...
- HTML5 ②
html代码中的各种标签和特殊符号: 1.<p>段落标签 默认会在段落前后都有空行</p>: 2.<hr/> 水平线标签 <br/>换行标签 ...
- docker 部署 flask(三)高级编写及生成镜像,安装requirements.txt
简介: 上一篇,我写了如何使用别人的docker基础镜像,生成我们的docker镜像. 也就最基本的flask,没有别的库(包)支持.连数据库支持都没有. 也就让大家了解一下怎么生成镜像而已. 本篇介 ...