洛谷 - P1355 - 神秘大三角 - 简单计算几何
https://www.luogu.org/problemnew/show/P1355
判断一个点和三角形的位置关系,最简单的思路就是用向量。
首先排除掉和三角形顶点重合的情况。
把三角形设计成一个首尾相接的三个向量,从三个向量的起点连线到P点构成新向量,叉乘判断方向。二维向量叉乘(x1,y1)×(x2,y2)=(x1y2-x2y1),方向是右手螺旋。那么判断正负号就知道他们在向量的哪一侧了。
在三角形中的应该在三个向量的同侧。而不在三角形中的会有一个方向与另外两个不同。在三角形上的显然就是存在一个0。
上面的解法有一个bug,其实叉乘为0只是代表在直线上,判断在线段上还要加一次点乘。
顺便练习一波scanf,注意scanf读入double必须是%lf,要求scanf略去字符可以参考下方写法,注意换行符用空格略去。
#include<bits/stdc++.h>
using namespace std;
#define ll long long struct Vector{
double x,y; Vector(double xx=0.0,double yy=0.0){x=xx,y=yy;} Vector operator-(Vector v2){
return Vector(x-v2.x,y-v2.y);
} bool operator==(Vector v2){
if(fabs(x-v2.x)<1e-&&fabs(y-v2.y)<1e-)
return true;
return false;
} double dot(Vector v2){
return x*v2.x+y*v2.y;
} double cross(Vector v2){
return x*v2.y-y*v2.x;
}
}; typedef Vector Point; int main(){
Point A,B,C,P;
scanf("(%lf,%lf)",&A.x,&A.y);
scanf(" (%lf,%lf)",&B.x,&B.y);
scanf(" (%lf,%lf)",&C.x,&C.y);
scanf(" (%lf,%lf)",&P.x,&P.y); if(A==P||B==P||C==P){
printf("4\n");
return ;
} Vector a=C-B,b=A-C,c=B-A;
Vector pa=P-B,pb=P-C,pc=P-A; double cross1=a.cross(pa);
double cross2=b.cross(pb);
double cross3=c.cross(pc); if(fabs(cross1)<1e-){
//bug在这里,叉乘为0是在直线上而非线段上
//前面判断了在端点上的情况,所以现在只需要判断方向
Vector t1=pa,t2=pb;
if(t1.dot(t2)<)
printf("3\n");
else
printf("2\n");
return ;
} if(fabs(cross2)<1e-){
//bug在这里,叉乘为0是在直线上而非线段上
//前面判断了在端点上的情况,所以现在只需要判断方向
Vector t1=pb,t2=pc;
if(t1.dot(t2)<)
printf("3\n");
else
printf("2\n");
return ;
} if(fabs(cross3)<1e-){
//bug在这里,叉乘为0是在直线上而非线段上
//前面判断了在端点上的情况,所以现在只需要判断方向
Vector t1=pc,t2=pa;
if(t1.dot(t2)<)
printf("3\n");
else
printf("2\n");
return ;
} int flag1=cross1*cross2>;
int flag2=cross2*cross3>;
int flag3=cross3*cross1>; if(flag1&&flag2&&flag3){
printf("1\n");
return ;
} printf("2\n"); }
洛谷 - P1355 - 神秘大三角 - 简单计算几何的更多相关文章
- 洛谷 P1355 神秘大三角(计算几何基础)
P1355 神秘大三角 题目提供者yeszy 标签 福建省历届夏令营 难度 普及/提高- 题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三 ...
- 叉积_判断点与三角形的位置关系 P1355 神秘大三角
题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样例) 所有 ...
- P1355 神秘大三角
题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样例) 所有 ...
- 洛谷 P1230 智力大冲浪
洛谷 P1230 智力大冲浪 题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?! ...
- 洛谷P3348 [ZJOI2016]大森林(LCT,虚点,树上差分)
洛谷题目传送门 思路分析 最简单粗暴的想法,肯定是大力LCT,每个树都来一遍link之类的操作啦(T飞就不说了) 考虑如何优化算法.如果没有1操作,肯定每个树都长一样.有了1操作,就来仔细分析一下对不 ...
- 洛谷 P4219 [BJOI2014]大融合 解题报告
P4219 [BJOI2014]大融合 题目描述 小强要在\(N\)个孤立的星球上建立起一套通信系统.这套通信系统就是连接\(N\)个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的 ...
- 洛谷P1230 智力大冲浪
题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则: ...
- 【洛谷5286】[HNOI2019] 鱼(计算几何)
点此看题面 大致题意: 给你\(n\)个点,让你求鱼形图的数量. 核心思路 首先,考虑到\(n\)这么小,我们可以枚举线段\(AD\),再去找符合条件的\(BC,EF\). 然后,不难发现\(BC\) ...
- 洛谷——P2640 神秘磁石
P2640 神秘磁石 题目背景 在遥远的阿拉德大陆,有一种神秘的磁石,是由魔皇制作出来的, 题目描述 1.若给他一个一维坐标系,那么他的磁力一定要在素数坐标的位置上才能发挥的最大(不管位置坐标的大小, ...
随机推荐
- BUPT 2012复试机考 3T
97. 二叉排序树 时间限制 1000 ms 内存限制 65536 KB 题目描述 二叉排序树,也称为二叉查找树.可以是一颗空树,也可以是一颗具有如下特性的非空二叉树: 若左子树非空,则左子树上所有节 ...
- vim中末行去掉^M
在Ubuntu系统中打开文件,发现文件中每一个末行都有^M,我们要做的是知道这一个无关的字符是什么作用,然后删除掉这一个无关的字符. 工具/原料 ubuntu操作系统 Vim编辑器 方法/步骤 ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)解说(二)鹰眼模块
解说GIS功能模块实现之前,先大概说一下flexviewer的核心配置文件config.xml,系统额GIS功能widget菜单布局.系统的样式.地图资源等等都是在这里配置的,这里对flexviewe ...
- Vue 开发线路 资料 汇总
线路 作者推荐学习线路 https://zhuanlan.zhihu.com/p/23134551 他人建议 https://www.cnblogs.com/smartXiang/p/6051086. ...
- LeanCloud SDK 中秒杀70%问题的调试方法
非常多同学在LeanCloud上遇到的不少问题,事实上能够自我解决的,如今介绍一下LeanCloud上的调试方法. LeanCloud 是通过 REST API来进行前后端分离的.这意味着当出现故障的 ...
- 【leetcode】 26. Remove Duplicates from Sorted Array
@requires_authorization @author johnsondu @create_time 2015.7.22 18:58 @url [remove dublicates from ...
- DW格式与布局
- C3P0连接池配置和实现详解(转)
一.配置 <c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数.Default: 3 --> ...
- 解决编译twrp3.0.3遇到的问题
1. 问题: ninja: error: '/home/jessie/OMNI/out/target/product/m1/obj/SHARED_LIBRARIES/libcryptfs_hw_int ...
- JSP与HTML的差别
HTML(Hypertext Markup Language)文本标记语言,它是静态页面,和JavaScript一样解释性语言,为什么说是解释性 语言呢?由于.仅仅要你有一个浏览器那么它就能够正常显示 ...