洛谷 - 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.若给他一个一维坐标系,那么他的磁力一定要在素数坐标的位置上才能发挥的最大(不管位置坐标的大小, ...
随机推荐
- php 中函数获取可变参数的方法, 这个语法有点像 golang 语言中的
原文呢:http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration.strict Onl ...
- LeetCode 3_Longest Substring Without Repeating Characters
LeetCode 3_Longest Substring Without Repeating Characters 题目描写叙述: Given a string, find the length of ...
- Git多账号登陆
最近工作上遇到了使用git+repo的情况,需要用公司的邮箱和账号名重新申请ssh公私密钥,而我本身在github上也有一些开源项目,这里就是记录一下我是如何实现git多账号登陆的. 取消 ...
- HDU 5371 Hotaru's problem(Manacher算法+贪心)
manacher算法详见 http://blog.csdn.net/u014664226/article/details/47428293 题意:给一个序列,让求其最大子序列,这个子序列由三段组成, ...
- Animated progress view with CAGradientLayer(带翻译)
Animated progress view with CAGradientLayer(带翻译) Modern software design is getting flatter and thin ...
- 转载:用python爬虫抓站的一些技巧总结
原文链接:http://www.pythonclub.org/python-network-application/observer-spider 原文的名称虽然用了<用python爬虫抓站的一 ...
- ExtJs学习笔记(1)---ExtJs安装及其使用
从官网下载了ExtJs的3.2版本号的SDK,包括了代码依赖的具体说明.文档.范例和其它文件.当中,adapter和resources文件是Ext正常执行所必须的,其它的仅在开发过程中使用到. Ada ...
- mongo-java-driver
http://mvnrepository.com/artifact/org.mongodb/mongo-java-driver/3.5.0 <!-- https://mvnrepository. ...
- Delphi通过Get获取来自PHP的返回值
Delphi代码 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Contro ...
- Linux 内核源码中likely()和unlikely()【转】
本文转载自:http://blog.csdn.net/tigerjibo/article/details/8279183 ikely()与unlikely()在2.6内核中,随处可见,那为什么要用它们 ...