cf13B Letter A(分类+简单计算几何,,)
题意:
给三个线段(每个线段的两个端点的坐标),问这三个线段能否组成字母A。
组成字母A的条件:
1.两个线段有公共端点。
2.这两个线段夹角小于等于90度。
3.第三个线段的两个端点分别在这两个线段上,且各自分割的大小比率不超过4:1
思路:
直接。。。。。
应该开始积累计算几何的代码了,,,,
代码:
struct Point{
double x,y;
};
struct segment{
Point a,b;
}
S[5];
bool samePoint(Point a,Point b){
if(fabs(a.x-b.x)<eps && fabs(a.y-b.y)<eps){
return true;
}
return false;
}
bool PointOnSegment(Point a,segment L){
if((a.x-L.a.x)*(L.b.y-L.a.y)==(a.y-L.a.y)*(L.b.x-L.a.x)
&& min(L.a.x,L.b.x)<=a.x && a.x<=max(L.a.x,L.b.x)
&& min(L.a.y,L.b.y)<=a.y && a.y<=max(L.a.y,L.b.y)){
return true;
}
return false;
}
double rates(Point a,segment L){
double l1=(a.x-L.a.x)*(a.x-L.a.x)+(a.y-L.a.y)*(a.y-L.a.y);
double l2=(a.x-L.b.x)*(a.x-L.b.x)+(a.y-L.b.y)*(a.y-L.b.y);
if(l1<eps || l2<eps){
return 999999.0;
}
if(l1<l2){
return l2/l1;
}
else{
return l1/l2;
}
}
ll Cos(double x1,double y1,double x2,double y2){
if(x1*x2+y1*y2>=0){
return true;
}
return false;
}
bool solve(){
//1 and 2
bool t1=samePoint(S[1].a,S[2].a);
bool t2=samePoint(S[1].a,S[2].b);
bool t3=samePoint(S[1].b,S[2].a);
bool t4=samePoint(S[1].b,S[2].b);
if(t1||t2||t3||t4){
bool flag=false;
if(t1){
double x1,y1,x2,y2;
x1=S[1].b.x-S[1].a.x;
y1=S[1].b.y-S[1].a.y;
x2=S[2].b.x-S[2].a.x;
y2=S[2].b.y-S[2].a.y;
if(Cos(x1,y1,x2,y2)){
flag=true;
}
}
if(t2){
double x1,y1,x2,y2;
x1=S[1].b.x-S[1].a.x;
y1=S[1].b.y-S[1].a.y;
x2=S[2].a.x-S[2].b.x;
y2=S[2].a.y-S[2].b.y;
if(Cos(x1,y1,x2,y2)){
flag=true;
}
}
if(t3){
double x1,y1,x2,y2;
x1=S[1].a.x-S[1].b.x;
y1=S[1].a.y-S[1].b.y;
x2=S[2].b.x-S[2].a.x;
y2=S[2].b.y-S[2].a.y;
if(Cos(x1,y1,x2,y2)){
flag=true;
}
}
if(t4){
double x1,y1,x2,y2;
x1=S[1].a.x-S[1].b.x;
y1=S[1].a.y-S[1].b.y;
x2=S[2].a.x-S[2].b.x;
y2=S[2].a.y-S[2].b.y;
if(Cos(x1,y1,x2,y2)){
flag=true;
}
}
if(flag){
if(PointOnSegment(S[3].a,S[1]) && PointOnSegment(S[3].b,S[2])){
if(rates(S[3].a,S[1])<=16.0 && rates(S[3].b,S[2])<=16.0){
return true;
}
}
if(PointOnSegment(S[3].b,S[1]) && PointOnSegment(S[3].a,S[2])){
if(rates(S[3].b,S[1])<=16.0 && rates(S[3].a,S[2])<=16.0){
return true;
}
}
}
}
//1 and 3
t1=samePoint(S[1].a,S[3].a);
t2=samePoint(S[1].a,S[3].b);
t3=samePoint(S[1].b,S[3].a);
t4=samePoint(S[1].b,S[3].b);
if(t1||t2||t3||t4){
bool flag=false;
if(t1){
double x1,y1,x2,y2;
x1=S[1].b.x-S[1].a.x;
y1=S[1].b.y-S[1].a.y;
x2=S[3].b.x-S[3].a.x;
y2=S[3].b.y-S[3].a.y;
if(Cos(x1,y1,x2,y2)){
flag=true;
}
}
if(t2){
double x1,y1,x2,y2;
x1=S[1].b.x-S[1].a.x;
y1=S[1].b.y-S[1].a.y;
x2=S[3].a.x-S[3].b.x;
y2=S[3].a.y-S[3].b.y;
if(Cos(x1,y1,x2,y2)){
flag=true;
}
}
if(t3){
double x1,y1,x2,y2;
x1=S[1].a.x-S[1].b.x;
y1=S[1].a.y-S[1].b.y;
x2=S[3].b.x-S[3].a.x;
y2=S[3].b.y-S[3].a.y;
if(Cos(x1,y1,x2,y2)){
flag=true;
}
}
if(t4){
double x1,y1,x2,y2;
x1=S[1].a.x-S[1].b.x;
y1=S[1].a.y-S[1].b.y;
x2=S[3].a.x-S[3].b.x;
y2=S[3].a.y-S[3].b.y;
if(Cos(x1,y1,x2,y2)){
flag=true;
}
}
if(flag){
if(PointOnSegment(S[2].a,S[1]) && PointOnSegment(S[2].b,S[3])){
if(rates(S[2].a,S[1])<=16.0 && rates(S[2].b,S[3])<=16.0){
return true;
}
}
if(PointOnSegment(S[2].b,S[1]) && PointOnSegment(S[2].a,S[3])){
if(rates(S[2].b,S[1])<=16.0 && rates(S[2].a,S[3])<=16.0){
return true;
}
}
}
}
//2 and 3
t1=samePoint(S[2].a,S[3].a);
t2=samePoint(S[2].a,S[3].b);
t3=samePoint(S[2].b,S[3].a);
t4=samePoint(S[2].b,S[3].b);
if(t1||t2||t3||t4){
bool flag=false;
if(t1){
double x1,y1,x2,y2;
x1=S[2].b.x-S[2].a.x;
y1=S[2].b.y-S[2].a.y;
x2=S[3].b.x-S[3].a.x;
y2=S[3].b.y-S[3].a.y;
if(Cos(x1,y1,x2,y2)){
flag=true;
}
}
if(t2){
double x1,y1,x2,y2;
x1=S[2].b.x-S[2].a.x;
y1=S[2].b.y-S[2].a.y;
x2=S[3].a.x-S[3].b.x;
y2=S[3].a.y-S[3].b.y;
if(Cos(x1,y1,x2,y2)){
flag=true;
}
}
if(t3){
double x1,y1,x2,y2;
x1=S[2].a.x-S[2].b.x;
y1=S[2].a.y-S[2].b.y;
x2=S[3].b.x-S[3].a.x;
y2=S[3].b.y-S[3].a.y;
if(Cos(x1,y1,x2,y2)){
flag=true;
}
}
if(t4){
double x1,y1,x2,y2;
x1=S[2].a.x-S[2].b.x;
y1=S[2].a.y-S[2].b.y;
x2=S[3].a.x-S[3].b.x;
y2=S[3].a.y-S[3].b.y;
if(Cos(x1,y1,x2,y2)){
flag=true;
}
}
if(flag){
if(PointOnSegment(S[1].a,S[2]) && PointOnSegment(S[1].b,S[3])){
if(rates(S[1].a,S[2])<=16.0 && rates(S[1].b,S[3])<=16.0){
return true;
}
}
if(PointOnSegment(S[1].b,S[2]) && PointOnSegment(S[1].a,S[3])){
if(rates(S[1].b,S[2])<=16.0 && rates(S[1].a,S[3])<=16.0){
return true;
}
}
}
}
return false;
}
int T;
int main(){
cin>>T;
while(T--){
scanf("%lf%lf%lf%lf",&S[1].a.x,&S[1].a.y,&S[1].b.x,&S[1].b.y);
scanf("%lf%lf%lf%lf",&S[2].a.x,&S[2].a.y,&S[2].b.x,&S[2].b.y);
scanf("%lf%lf%lf%lf",&S[3].a.x,&S[3].a.y,&S[3].b.x,&S[3].b.y);
if(solve()){
puts("YES");
}else{
puts("NO");
}
}
return 0;
}
cf13B Letter A(分类+简单计算几何,,)的更多相关文章
- CF13B Letter A
CF13B Letter A 洛谷传送门 题目描述 Little Petya learns how to write. The teacher gave pupils the task to writ ...
- ●POJ 1556 The Doors(简单计算几何+最短路)
●赘述题目 10*10的房间内,有竖着的一些墙(不超过18个).问从点(0,5)到(10,5)的最短路. 按照输入样例,输入的连续5个数,x,y1,y2,y3,y4,表示(x,0--y1),(x,y2 ...
- 2018.07.04 POJ 2398 Toy Storage(二分+简单计算几何)
Toy Storage Time Limit: 1000MS Memory Limit: 65536K Description Mom and dad have a problem: their ch ...
- 2018.07.03 BZOJ 1007: [HNOI2008]水平可见直线(简单计算几何)
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MB Description 在xoy直角坐标平面上有n条直线L1,L2,-Ln, ...
- python - 实现文本分类[简单使用第三方库完成]
第三方库 pandas sklearn 数据集 来自于达观杯 训练:train.txt 测试:test.txt 概述 TF-IDF 模型提取特征值建立逻辑回归模型 代码 # _*_ coding:ut ...
- HDU2948Geometry Darts(简单计算几何)
题目大意就是说两个人掷飞镖,飞镖在所给定的图形内就记一分,现在给定N个图形(圆.三角形和矩形),问每一次比赛(没人分别掷三次)谁赢. #include <map> #include < ...
- Bzoj4558:分类讨论 计算几何 组合数学
国际惯例的题面: 这题让我爆肝啦......这种计数显然容斥,正好不含任何坏点的我们不会算,但是我们能算至少含零个坏点的,至少含一个坏点的,至少含两个坏点的......所以最终的答案就是(至少含零个坏 ...
- 2018.07.04 POJ 1654 Area(简单计算几何)
Area Time Limit: 1000MS Memory Limit: 10000K Description You are going to compute the area of a spec ...
- 2018.07.04 POJ 3304 Segments(简单计算几何)
Segments Time Limit: 1000MS Memory Limit: 65536K Description Given n segments in the two dimensional ...
随机推荐
- Set代码
现有一整数集(允许有重复元素),初始为空.我们定义如下操作:add x 把 x 加入集合del x 把集合中所有与 x 相等的元素删除ask x 对集合中元素x的情况询问 对每种操作,我们要求进行如下 ...
- echsop设置伪静态
1.后台商店设置-基本设置-URL重写开启 2.修改httpd.conf文件 AllowOverride None 改为 AllowOverride AllLoadModule rewrite_mod ...
- Sentry 监控 - Search 搜索查询实战
系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...
- Shell系列(10)- bash环境变量(3)
环境变量与用户自定义变量的区别 环境变量是全局变量,用户自定义变量是局部变量. 用户自定义变量只在当前的 shell 中生效,环境变量在当前 shell 和这个 shell 的所有子 shell 中生 ...
- openldap集成ssh 登录
一 安装nslcd服务 yum install nss-pam-ldapd 二.修改vi /etc/nslcd.conf这个配置文件 修改uri 和base的值 改为你的ldap的地址和用户名 三. ...
- 大型项目源码集合「GitHub 热点速览 v.21.39」
作者:HelloGitHub-小鱼干 代码,尤其是优雅规范的代码,一直都是学习编程技巧的捷径.虽然有实用的代码小片段,能拯救当前业务的燃眉之急,但是真要去提升自己的技能还是得从大型的项目,尤其是有一定 ...
- P4548-[CTSC2006]歌唱王国【概率生成函数,KMP】
正题 题目链接:https://www.luogu.com.cn/problem/P4548 题目大意 \(t\)次询问,给出一个长度为\(m\)的串\(S\)和一个空串\(T\),每次在\(T\)后 ...
- Python3入门系列之-----函数
什么是函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己 ...
- JavaFx全局快捷键实现(Kotlin)
原文地址: JavaFx全局快捷键实现(Kotlin) | Stars-One的杂货小窝 最近整款工具需要用到全局快捷键,搜集了下网上的资料,发现有个JIntellitype库可以用来实现全局快捷键, ...
- mysql从零开始之MySQL 删除数据库
MySQL 删除数据库 使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库,所以我们这边使用 root 用户登录,root 用户拥有最高权限. 在删除数据库过 ...