题目链接

题目描述

判断一个点与已知三角形的位置关系。

输入输出格式

输入格式:

前三行:每行一个坐标,表示该三角形的三个顶点

第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系

(详见样例)

所有坐标值均为整数。

输出格式:

若点在三角形内(不含边界),输出1;

若点在三角形外(不含边界),输出2;

若点在三角形边界上(不含顶点),输出3;

若点在三角形顶点上,输出4。

输入输出样例

输入样例#1:

(0,0)
(3,0)
(0,3)
(1,1)

输出样例#1:

1

法一:面积法

连结第四个点和三角形的三个顶点,得到三个三角形,若这三个三角形的面积之和等于原三角形面积,则该点在三角形内。

其他情况相应特判即可。

Code

#include <bits/stdc++.h>
#define eps 1e-6
using namespace std;
double dist(int x1, int y1, int x2, int y2) {
return sqrt(pow(x2-x1,2) + pow(y2-y1,2));
}
double area(int x1, int y1, int x2, int y2, int x3, int y3) {
double a = dist(x1,y1,x2,y2), b = dist(x1,y1,x3,y3), c = dist(x2,y2,x3,y3);
double p = (a+b+c)/2;
return sqrt(p*(p-a)*(p-b)*(p-c));
}
int main() {
int x1,y1,x2,y2,x3,y3,x,y;
scanf("(%d,%d)\n(%d,%d)\n(%d,%d)\n(%d,%d)", &x1, &y1, &x2, &y2, &x3, &y3, &x, &y);
if ((x==x1&&y==y1) || (x==x2&&y==y2) || (x==x3&&y==y3)) { putchar('4'); return 0; }
double s1 = area(x1,y1,x2,y2,x,y),
s2 = area(x1,y1,x3,y3,x,y),
s3 = area(x3,y3,x2,y2,x,y),
s = area(x1,y1,x2,y2,x3,y3);
if (s1+s2+s3-s>eps) { putchar('2'); return 0; }
if (fabs(s1)<eps || fabs(s2)<eps || fabs(s3)<eps) { putchar('3'); return 0; }
putchar('1');
return 0;
}

法二:叉积法

理论依据

\(\overrightarrow{P0P1}\times \overrightarrow{P0P2}\gt 0\leftrightarrow P1在P2的顺时针方向(相对P0)\)

\(\overrightarrow{P0P1}\times \overrightarrow{P0P2}\lt 0\leftrightarrow P1在P2的逆时针方向(相对P0)\)

\(\overrightarrow{P0P1}\times \overrightarrow{P0P2}= 0\leftrightarrow P1,P2,P0三点共线\)

仍然连结第四个点和三角形的三个顶点,算出三个叉积,如果同正或同负,则在三角形内;

如果有一个为\(0\),另两个同号,则在三角形边上。

Code

#include <bits/stdc++.h>
#define eps 1e-6
using namespace std;
int vec(int x1, int y1, int x2, int y2, int x0, int y0) {
return (x1-x0) * (y2-y0) - (x2-x0) * (y1-y0);
}
int main() {
int x1,y1,x2,y2,x3,y3,x,y;
scanf("(%d,%d)\n(%d,%d)\n(%d,%d)\n(%d,%d)", &x1, &y1, &x2, &y2, &x3, &y3, &x, &y);
if ((x==x1&&y==y1) || (x==x2&&y==y2) || (x==x3&&y==y3)) { putchar('4'); return 0; }
int c1 = vec(x1, y1, x2, y2, x, y),
c2 = vec(x2, y2, x3, y3, x, y),
c3 = vec(x3, y3, x1, y1, x, y);
if ((c1>0&&c2>0&&c3>0) || (c1<0&&c2<0&&c3<0)) { putchar('1'); return 0; }
if ((c1==0&&c2*c3>0) || (c2==0&&c1*c3>0) || (c3==0&&(c1*c2>0))) putchar('3');
else putchar('2');
return 0;
}

luogu 1355 神秘大三角 判断点和三角形的位置关系 面积法 叉积法的更多相关文章

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

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

  2. [fzu 2273]判断两个三角形的位置关系

    首先判断是否相交,就是枚举3*3对边的相交关系. 如果不相交,判断包含还是相离,就是判断点在三角形内还是三角形外.两边各判断一次. //http://acm.fzu.edu.cn/problem.ph ...

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

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

  4. 洛谷 - P1355 - 神秘大三角 - 简单计算几何

    https://www.luogu.org/problemnew/show/P1355 判断一个点和三角形的位置关系,最简单的思路就是用向量. 首先排除掉和三角形顶点重合的情况. 把三角形设计成一个首 ...

  5. 【u027】神秘大三角

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 判断一个点与已知三角形的位置关系. [输入格式] 前三行:每行一个坐标,表示该三角形的三个顶点 第四行 ...

  6. P1355 神秘大三角

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

  7. Cupid's Arrow---hdu1756(判断点与多边形的位置关系 模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1756 题意:中文题,套模板即可: /* 射线法:判断一个点是在多边形内部,边上还是在外部,时间复杂度为 ...

  8. LightOj1190 - Sleepwalking(判断点与多边形的位置关系--射线法模板)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1190 题意:给你一个多边形含有n个点:然后又m个查询,每次判断点(x, y)是否在多边 ...

  9. 判断两条直线的位置关系 POJ 1269 Intersecting Lines

    两条直线可能有三种关系:1.共线     2.平行(不包括共线)    3.相交. 那给定两条直线怎么判断他们的位置关系呢.还是用到向量的叉积 例题:POJ 1269 题意:这道题是给定四个点p1, ...

随机推荐

  1. Eclipse+Tomcat搭建jsp服务器

    首先,安装java sdk 环境,这里就不多说了,附上java sdk的下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk ...

  2. 解决cocos2dx 3.x 导入cocostudio的ui界面出现错位问题

    笔者今天发现导入cocostudio的ui界面时,会有部分控件出现错位的现象,后来我看了一下源码,发现是部分控件是没有继承 Layout类,导致不能设置控件位置造成,原因可以看看cocos2dx 源码 ...

  3. 如何使用公网ip访问部署在云服务器的web项目

    我使用的是华为云服务器,已经在服务器上部署好项目,现在想要通过外网访问服务器的话,需要配置一下安全组:1.依据下图找到安全组,点击教我设置: 2. 进入安全组配置示例,根据自己的需要选择不同的配置方案 ...

  4. Docker DockerFile文件指令 & 构建

    1.dockerfile指令格式 # Comment注释 INSTRUCTION argument指令名 + 参数 2.普通指令 1. FROM 已存在的镜像,基础镜像,第一条非注释指令 FROM & ...

  5. linux时区

    1. UTC时区切换到CST 时区# echo "export TZ='Asia/Shanghai'" >> /etc/profile # cat /etc/profi ...

  6. 地理位置编码geohash学习笔记

    1.geohash及其性质 一种空间索引技术. (1)将二维的经纬度位置数据转换为一维的字符串(基本上hash族的算法都是这样): 其优点在于hash编码后的字符串,可以方便查找和索引,从而减少相似计 ...

  7. PHP获取文件夹内所有文件包括子目录文件的名称或路径

    /* * new getFile($_dir[,$_emptyDir,$_fileType]); * @parma $_dir 是目录名称 * @parma $_emptyDir 是否获取空文件夹,选 ...

  8. Python中的可迭代对象,迭代器与生成器

    先来看一张概览图,关于容器(container).可迭代对象(Iterable).迭代器(iterator).生成器(generator). 一.容器(container) 容器就是一个用来存储多个元 ...

  9. redis列表,字典,管道,vue安装,创建项目

    redis mysql,redis,mogondb 1.mysql,oracle:关系型数据库,有表概念 2.redis,mongodb/nosql:非关系型数据库 没有表概念 mongodb存储在硬 ...

  10. (转)git常见错误

      error: src refspec master does not match any. 引起该错误的原因是,目录中没有文件,空目录是不能提交上去的 error: insufficient pe ...