hrbustoj 1142:围困(计算几何基础题,判断点是否在三角形内)
围困
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submit: 360(138 users) Total Accepted: 157(129 users) Rating: Special Judge: No
Description
Leyni是一名猎人,一天他在草原中散步,遇到了三只老狼,三只老狼围成了一个三角形,如果Leyni在这个三角形中,那么他必死无疑,否则他还有一线生机。
现在已知三只老狼的坐标和Leyni的坐标,请问,Leyni还有活下去的机会吗?
Input
本题有多组测试数据,对于每组测试数据:
第一行,含有4对坐标,x1, y1, x2, y2, x3, y3, xLeyni, yLeyni。前3对坐标表示三只老狼的位置,最后一对表示Leyni的坐标。坐标的范围在[-10000, 10000],且都是整数。
注:输入数据保证Leyni不会在三角形的边上。
Output
对于每组测试数据:
第一行,如果Leyni还有一线生机,那么请输出Live,否则请输出Die
Sample Input
-1 -1 1 -1 0 1 0 0
-1 -1 1 -1 0 1 10 10
Sample Output
Die
Live
Author
齐达拉图
计算几何,基础题,判断点是否在三角形内。
这道题可以用来练习叉积的应用,思路是如果Leyni位置的点与三个顶点构成的向量与三个边代表的向量(必须是一个顺序,都是逆时针,或都是顺时针)的叉积都大于0或者都小于0,则Leyni在三角形内。需要注意的是不能只考虑一种情况,例如只考虑>0的情况,而不考虑<0的情况,这样会WA。
复杂代码:
#include <stdio.h>
#define eps 1e-10
typedef struct{ //定义点
double x,y;
}Point;
typedef Point Vector; //定义向量
double Cross(Vector a,Vector b) //叉积
{
return a.x*b.y - a.y*b.x;
}
bool isn(Point a,Point b,Point c,Point p) //判断点p是否在三角形abc内
{
Vector ab,bc,ca; //创建向量
Vector ap,bp,cp;
ab.x = b.x - a.x;ab.y = b.y - a.y; //向量赋值
bc.x = c.x - b.x;bc.y = c.y - b.y;
ca.x = a.x - c.x;ca.y = a.y - c.y;
ap.x = p.x - a.x;ap.y = p.y - a.y;
bp.x = p.x - b.x;bp.y = p.y - b.y;
cp.x = p.x - c.x;cp.y = p.y - c.y; if( Cross(ab,ap)>eps && Cross(bc,bp)>eps && Cross(ca,cp)>eps ||
Cross(ab,ap)<eps && Cross(bc,bp)<eps && Cross(ca,cp)<eps) //核心代码。注意不能单考虑一种情况(>0 或 <0)
return true;
else
return false;
}
int main()
{
int x1,y1,x2,y2,x3,y3,xLeyni,yLeyni;
while(scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&xLeyni,&yLeyni)!=EOF){ //输入四对坐标
if( (xLeyni==x1 && yLeyni==y1) ||
(xLeyni==x2 && yLeyni==y2) ||
(xLeyni==x3 && yLeyni==y3) ){
printf("Die\n"); //如果Leyni正好在三角形顶点上,则直接死掉
continue;
}
Point a,b,c,p; //将输入的坐标赋给点
a.x = double(x1),a.y = double(y1);
b.x = double(x2),b.y = double(y2);
c.x = double(x3),c.y = double(y3);
p.x = double(xLeyni),p.y = double(yLeyni); if(isn(a,b,c,p)) //判断是否在三角形内
printf("Die\n");
else
printf("Live\n");
}
return ;
}
优化代码:
#include <stdio.h>
typedef struct { //定义点
double x,y;
}Point;
double Cross(Point a,Point b,Point c) //三点求叉积
{
return (b.x-a.x)*(c.y-a.y) - (b.y-a.y)*(c.x-a.x);
}
int main()
{
Point a,b,c,p; //定义四点
while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&p.x,&p.y)!=EOF){ //输入四对坐标
if( (Cross(a,b,p)> && Cross(b,c,p)> && Cross(c,a,p)>) ||
(Cross(a,b,p)< && Cross(b,c,p)< && Cross(c,a,p)<) ) //判断点p是否在三角形abc内。注意不能只考虑一种情况(<0 或 >0)
printf("Die\n");
else
printf("Live\n");
}
return ;
}
Freecode : www.cnblogs.com/yym2013
hrbustoj 1142:围困(计算几何基础题,判断点是否在三角形内)的更多相关文章
- hrbustoj 1429:凸多边形(计算几何,判断点是否在多边形内,二分法)
凸多边形 Time Limit: 2000 MS Memory Limit: 65536 K Total Submit: 130(24 users) Total Accepted: 40(1 ...
- 2D空间中判断一点是否在三角形内
要注意如果是XY坐标轴的2D空间,要取差乘分量z而不是y. 实现原理是,将三角形ABC三个边(AB,BC,CA)分别与比较点判断差乘,如果这3个差乘结果表示的方向一致,说明就在三角形内. 效果: 代码 ...
- 【TOJ 3005】Triangle(判断点是否在三角形内+卡精度)
描述 Given the coordinates of the vertices of a triangle,And a point. You just need to judge whether t ...
- B - Toy Storage(POJ - 2398) 计算几何基础题,比TOYS多了个线段排序
Mom and dad have a problem: their child, Reza, never puts his toys away when he is finished playing ...
- POJ 2398 - Toy Storage - [计算几何基础题][同POJ2318]
题目链接:http://poj.org/problem?id=2398 Time Limit: 1000MS Memory Limit: 65536K Description Mom and dad ...
- POJ 2318 - TOYS - [计算几何基础题]
题目链接:http://poj.org/problem?id=2318 Time Limit: 2000MS Memory Limit: 65536K Description Calculate th ...
- 算法复习——计算几何基础(zoj1081)
题目: Statement of the Problem Several drawing applications allow us to draw polygons and almost all o ...
- hrbustoj 1306:再遇攻击(计算几何,判断点是否在多边形内,水题)
再遇攻击 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 253(37 users) Total Accepted: 56(2 ...
- nyis oj 68 三点顺序 (计算几何基础)
三点顺序 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 如今给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,如今让你推断A,B,C是顺时针给出的还是逆 ...
随机推荐
- mybatis实战教程(mybatis in action)之三:实现数据的增删改查
前面已经讲到用接口的方式编程.如果不一致就会出错,这一章主要在上一讲基于接口编程的基础上完成如下事情:1. 用 mybatis 查询数据,包括列表2. 用 mybatis 增加数据3. 用 mybat ...
- Intellij Idea下搭建基于Spring+SpringMvc+MyBatis的WebApi接口架构
2018-08-16 09:27 更新 强烈推荐使用Springboot来搭建MVC框架! 强烈推荐使用Springboot来搭建MVC框架! 强烈推荐使用Springboot来搭建MVC框架! 后文 ...
- C#获取显示器屏幕数量 控制winform显示到哪一个屏幕
获取当前系统连接的屏幕数量: Screen.AllScreens.Count();获取当前屏幕的名称:string CurrentScreenName = Screen.FromControl(thi ...
- android 实现全屏代码
设置全屏包括两个部分: 窗口全屏和Activity全屏. 窗口全屏 是指隐藏系统顶部用来显示时间.电量.信号等信息的标题栏 . Activity全屏 是指隐藏程序的标题栏.我们可以通过修改Androi ...
- Oracle GoldenGate (ogg) 11.2.1.0.20 是最后一个支持oracle db 10g的 ogg版本号
參考原文: Oracle GoldenGate 11.2.1.0.22 Patch Set Availability (Doc ID 1669160.1) 该文章不做翻译,只摘录当中有价值的信息,例如 ...
- Faster RCNN原理分析 :Region Proposal Networks详解
博主的论文笔记: https://blog.csdn.net/YZXnuaa/article/details/79221189 很详细! 另外,关于博主的博客很多拓展知识面: 120篇 深度学习23篇 ...
- 区别getElementByID,getElementsByName,getElementsByTagName
以人来举例说明,人有能标识身份的身份证,有姓名,有类别(大人.小孩.老人)等. 1. ID 是一个人的身份证号码,是唯一的.所以通过getElementById获取的是指定的一个人. 2. Name ...
- redhat yum替换成CentOS yum 并修改源
wget http://mirrors.163.com/centos/6/os/x86_64/Packages/python-iniparse-0.3.1-2.1.el6.noarch.rpm wge ...
- C#趣味程序---爱因斯坦的台阶问题
问题:设有一阶梯,每步跨2阶.最后余1阶.每步跨3阶.最后余2阶:每步跨5阶.最后余4阶:每步跨6阶.最后余5阶:每步跨7阶.刚好到阶顶.问共同拥有多少阶梯? using System; namesp ...
- Python 数据驱动ddt 使用
准备工作: pip install ddt 知识点: 一,数据驱动和代码驱动: 数据驱动的意思是 根据你提供的数据来测试的 比如 ATP框架 需要excel里面的测试用例 代码驱动是必须得写代码 ...