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 - 神秘大三角 - 简单计算几何的更多相关文章

  1. 洛谷 P1355 神秘大三角(计算几何基础)

    P1355 神秘大三角 题目提供者yeszy 标签 福建省历届夏令营 难度 普及/提高- 题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三 ...

  2. 叉积_判断点与三角形的位置关系 P1355 神秘大三角

    题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样例) 所有 ...

  3. P1355 神秘大三角

    题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样例) 所有 ...

  4. 洛谷 P1230 智力大冲浪

    洛谷 P1230 智力大冲浪 题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?! ...

  5. 洛谷P3348 [ZJOI2016]大森林(LCT,虚点,树上差分)

    洛谷题目传送门 思路分析 最简单粗暴的想法,肯定是大力LCT,每个树都来一遍link之类的操作啦(T飞就不说了) 考虑如何优化算法.如果没有1操作,肯定每个树都长一样.有了1操作,就来仔细分析一下对不 ...

  6. 洛谷 P4219 [BJOI2014]大融合 解题报告

    P4219 [BJOI2014]大融合 题目描述 小强要在\(N\)个孤立的星球上建立起一套通信系统.这套通信系统就是连接\(N\)个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的 ...

  7. 洛谷P1230 智力大冲浪

    题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则: ...

  8. 【洛谷5286】[HNOI2019] 鱼(计算几何)

    点此看题面 大致题意: 给你\(n\)个点,让你求鱼形图的数量. 核心思路 首先,考虑到\(n\)这么小,我们可以枚举线段\(AD\),再去找符合条件的\(BC,EF\). 然后,不难发现\(BC\) ...

  9. 洛谷——P2640 神秘磁石

    P2640 神秘磁石 题目背景 在遥远的阿拉德大陆,有一种神秘的磁石,是由魔皇制作出来的, 题目描述 1.若给他一个一维坐标系,那么他的磁力一定要在素数坐标的位置上才能发挥的最大(不管位置坐标的大小, ...

随机推荐

  1. 区间重合判断[poj2808 校门外的树]

    题目:http://bailian.openjudge.cn/practice/2808/ 参考了文章,重写了代码:http://www.cnblogs.com/youxin/p/3266617.ht ...

  2. mybatis一对多

    mapper.xml <mapper namespace="com.oracle.dao.one2manyDao"> <resultMap type=" ...

  3. tomcat重启报错

    一.tomcat重启报java环境变量错 报错信息详细如下: Neither the JAVA_HOME nor the JRE_HOME environment variable is define ...

  4. TestNG demo

    下载TestNG的归档文件 下载最新版本的TestNG的jar文件,详细请点击访问 http://www.testng.org..在写这篇教程的时候,我下载TestNG中-6.8.jar,并将 tes ...

  5. WPF中如何使用代码操作数据模板生成的控件

    有一个Listbox,里面的Item是通过数据模板生成的,如下所示: <Border Margin="15" BorderBrush="Aqua" Bor ...

  6. String池与iterator对集合的迭代

    一.静态导入 1.       导入类的静态属性 import static java.lang.System.out; out.println("haha"); 2.       ...

  7. Class.forName("java.lang.String")的作用?

    返回字节码: 返回的方式有2种: 第一种是这个类的字节码已经加载到内存里面来了,现在想要取到它的字节码,我直接找到那份字节码把他返回: 第二种是我去得到这个类的字节码,结果在虚拟机里面还没有这个类的字 ...

  8. 微信小程序template使用

    当您的项目需要多次使用同一个布局和样式的时候,您就可以考虑使用template(模板)来减少冗余代码. 使用方式: 1.新建一个template文件夹来存放您的通用模板: 2.在文件夹里面新建一个wx ...

  9. POJ1860 Currency Exchange —— spfa求正环

    题目链接:http://poj.org/problem?id=1860 Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Tota ...

  10. ORACLE 创建表空间及用户

    /*创建存放原始数据的表空间*/ create tablespace Djzh_original datafile 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\Djzh_or ...