FZUOJ-2273 Triangles
Problem 2273 TrianglesAccept: 109 Submit: 360
Time Limit: 1000 mSec Memory Limit : 262144 KB
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
Source
第八届福建省大学生程序设计竞赛-重现赛(感谢承办方厦门理工学院)
链接:http://acm.fzu.edu.cn/contest/problem.php?cid=156&sortid=2
题意:给出两个三角形A,B的三个点的坐标,判断这两个三角形的位置关系,分为包含(contain),相交(intersect),不相交(disjoint)三种关系,特别的,边或者点重合也属于相交;
思路:可以先判断A的某一条边是否和B的某一条边相交(包括点重合和边重合)来判断相交关系,然后可以根据三角形A(B)的一个定点是否在三角形B(A)内来判断包含关系;如不满足前两种关系,则三角形A,B便满足第三种关系;判断某一点是否在三角形内可以用面积法来判断,若点P在三角形内部(包括边上),则有S(ABC)=S(ABP)+S(APC)+S(BPC);否则有S(ABC)小于三个小三角形面积之和;三角形的面积可以利用向量积(叉积)来做,S=|ABxAC|/2;
ps:(如果下面的分析有误,欢迎指出,代码有参考模板)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define eps 1e-8
#define zero(x) (((x)>0?(x):(-x))<eps) using namespace std; struct point{double x,y;};
struct triangle{point a,b,c;}; ///计算叉积
/**
设向量A=p1-p0,B=p2-p0;
| i j k |
AxB=| p1.x-p0.x p1.y-p0.y 0 |
| p2.x-p0.x p2.y-p0.y 0 |
*/ 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);
} ///判断三点共线
/**
若三点共线 设向量A=p1-p0,B=p2-p0;
|AxB|=|A||B|sin<A,B>,又三点共线,所以<A,B>=0,所以|AxB|=0;
*/
int dots_inline(point p1,point p2,point p3){
return zero(xmult(p1,p2,p3));
}
///判断两点在线段同侧
/**
设向量 A=l2-l1,B=p2-l1,C=p1-l1;
由右手定则可以得出,若p1,p2两点同侧,则|AxB|与|AxC|同正负;
若p1或p2在线段上,则|AxC|或|AxB|等于0
*/
int same_side(point p1,point p2,point l1,point l2){
return xmult(l1,p1,l2) * xmult(l1,p2,l2) > eps;
}
///判断点是否在线上,包括端点
/**
1.先判三点共线;
2.再判点是否在线段上,如果在,则两个端点的横坐标与该点的横坐标(纵坐标)之差的积小于或者等于零;
*/
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;
} ///判断两线相交,包括部分重合和点重合
/**
1.先判是否共线,如果不共线,看其中一条边的两个端点是否在另一条线段的两侧;
2.判断点是否在线段上;
*/
int intersect_in(point u1,point u2,point v1,point v2){
if(!dots_inline(u1,u2,v1)||!dots_inline(u1,u2,v2))
return !same_side(u1,u2,v1,v2) && !same_side(v1,v2,u1,u2);
return dot_online_in(u1,v1,v2)||dot_online_in(u2,v1,v2)||dot_online_in(v1,u1,u2)||dot_online_in(v2,u1,u2);
} ///计算面积
/**
S=|AxB|/2;
*/
double area_triangle(point p1,point p2,point p3){
return fabs(xmult(p1,p2,p3))/;
}
///判断点是否包含在三角形内部,包括三条边上
/**
大三角形与三个小三角形的面积之差是否为零
*/
int dot_triangle_in(triangle p1,point p0){
return fabs(area_triangle(p1.a,p1.b,p1.c)-area_triangle(p1.a,p1.b,p0)-area_triangle(p1.a,p0,p1.c)-area_triangle(p0,p1.b,p1.c))<eps;
} void solve_question(){
point a[],b[];
triangle A,B;
for(int i=;i<;i++)
cin >> a[i].x >> a[i].y;
for(int i=;i<;i++)
cin >> b[i].x >> b[i].y;
A = (triangle){a[],a[],a[]};
B = (triangle){b[],b[],b[]};
for(int i=;i<;i++)
for(int j=;j<;j++)
if(intersect_in(a[i],a[(i+)%],b[j],b[(j+)%])) { printf("intersect\n");return;}
if(dot_triangle_in(A,b[]) || dot_triangle_in(B,a[]))
printf("contain\n");
else
printf("disjoint\n"); } int main(){
int T;
scanf("%d",&T);
while(T--){
solve_question();
}
}
FZUOJ-2273 Triangles的更多相关文章
- FOJ Problem 2273 Triangles
Problem 2273 Triangles Accept: 201 Submit: 661Time Limit: 1000 mSec Memory Limit : 262144 KB P ...
- FZU 2273 Triangles 第八届福建省赛 (三角形面积交 有重边算相交)
Problem Description This is a simple problem. Given two triangles A and B, you should determine they ...
- Count the number of possible triangles
From: http://www.geeksforgeeks.org/find-number-of-triangles-possible/ Given an unsorted array of pos ...
- [ACM_搜索] Triangles(POJ1471,简单搜索,注意细节)
Description It is always very nice to have little brothers or sisters. You can tease them, lock them ...
- acdream.Triangles(数学推导)
Triangles Time Limit:1000MS Memory Limit:64000KB 64bit IO Format:%lld & %llu Submit Stat ...
- UVA 12651 Triangles
You will be given N points on a circle. You must write a program to determine how many distinctequil ...
- Codeforces Gym 100015F Fighting for Triangles 状压DP
Fighting for Triangles 题目连接: http://codeforces.com/gym/100015/attachments Description Andy and Ralph ...
- Codeforces Round #309 (Div. 1) C. Love Triangles dfs
C. Love Triangles Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/553/pro ...
- Codeforces Round #308 (Div. 2) D. Vanya and Triangles 水题
D. Vanya and Triangles Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55 ...
随机推荐
- CCF201412-2 Z字形扫描 java(100分)
试题编号: 201412-2 试题名称: Z字形扫描 时间限制: 2.0s 内存限制: 256.0MB 问题描述: 问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag ...
- 两个jquery编写插件实例
(1) 封装基于jq弹窗插件 相信码友们对于$.fn.extexd();$.extend()以及$.fn.custom和$.custom都有一定的了解:我阐述一下我自己对于$.fn.custom和 ...
- OmniGraffle 7使用的探索
进去后可以将界面简化为4个主要区域:工具栏.工具栏.检查器和画布. 1.画布是在项目中创建.编辑和移动对象的地方 2.删除画布 选择编辑 画布删除画布 3.OmniGraffle项目至少需要一个画布 ...
- vue项目图片路径问题
一般情况下我们为了能在本地显示效果,写图片路径会直接这样写,但是在实际中图片一般都是动态上传的, 所以,在vue中一般是这样的: 但是这样你会发现,图片根本显示不出来,只是显示了个图片的图标. 后来发 ...
- java 8 接口默认方法
解决问题:在java8 之前的版本,在修改已有的接口的时候,需要修改实现该接口的实现类. 作用:解决接口的修改与现有的实现不兼容的问题.在不影响原有实现类的结构下修改新的功能方法 案例: 首先定义一个 ...
- Java——面向对象编程
在面向对象的编程中,不能再有第一步.第二步怎么做的概念. [对象和类]
- HDU 6592 (LIS+输出字典序最大最小)
题意:给你一个序列,让你找长度最长的字典序最小和最大的单峰序列,单峰序列就是满足先增后降的序列. 思路:先正着求一遍LIS,再反着求一遍LIS,然后用单调栈来模拟. 求字典序最小的话,首先找到第一个顶 ...
- 我的"开发工具箱"
我使用的IDEA插件 Free Mybatis plugin Alibaba Java Coding Guidelines 我的IDEA开发配置 配置Maven Runner -DarchetypeC ...
- 在裸机centos7系统中部署django项目的过程
概要 本文用一台安装了centos7.5系统的裸奔Linux机器(当然是虚拟机)详细讲解从无到有部署django项目的过程. 安装必要的工具 配置yum源 至于什么是yum源大家请自行百度,本人用的是 ...
- vmware 虚拟 CPU 性能计数器事件与主机 CPU 不兼容。
错误提示:虚拟 CPU 性能计数器事件与主机 CPU 不兼容. 点放弃 如果是暂时状态选关机, 丢失掉运行状态,即可保留硬盘内容重新开机