【u027】神秘大三角
Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
判断一个点与已知三角形的位置关系。
【输入格式】
前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样例) 所有坐标值均为整数。
【输出格式】
若点在三角形内(不含边界),输出1; 若点在三角形外(不含边界),输出2; 若点在三角形边界上(不含顶点),输出3; 若点在三角形顶点上,输出4。
【数据规模】
对于100%数据,0<=所有点的横、纵坐标<=100
Sample Input1
(0,0)
(3,0)
(0,3)
(1,1)
Sample Output1
1
【题解】
判断的优先顺序如下:
1.和顶点重合。
2.和边重合
3.在三角形内部
else
在三角形外部。
前3个种任意一个成立。后续就不再判断。直接结束程序了。
其中顶点只要和所有的点都比较一遍就可以了。
然后和边重合的情况。只要把三条边的直线方程求出来就可以了。代入看看x0,y0是否为这条边的方程的一个解,如果是一个解,则这个点在边上。直接输出在边上。
然后在三角形内部。
则这个点和三角形的三个顶点连线可以把大三角形分成3个小的三角形。
然后用海伦公式(知道3边就能求三角形面积)算出三个小三角形的面积和。
//海伦公式,设三角形的周长的一半为p,三边长为a,b,c;
//s=根号(p*(p-a)*(p-b)*(p-c));
看看这三个小的三角形的面积和与大三角形的面积是否是一样的。如果是一样的则这个点是在三角形的内部的。(如果不一样则在三角形外部!);
因为是实数的运算。所以判断相等要用差的绝对值小于精度来判断。
【代码】
#include <cstdio>
#include <cmath>
#include <cstring> int a[4][3],xx0,yy0; void input_data(int &x, int &y)//输入一行坐标
{
x = 0, y = 0;
char s[500];
scanf("%s", s);
int len = strlen(s);//用strlen函数要include <cstring>这个头文件
int x1 = 0, temp;
for (int i = 1; i <= len - 1; i++)
if (s[i] != ',')
x = x * 10 + s[i] - '0';//获取x坐标
else
{
temp = i;
break;
}
for (int i = temp + 1; i <= len - 1; i++)
if (s[i] != ')')
y = y * 10 + s[i] - '0';//获取y坐标
else
break;
} double s_triangle(double a, double b, double c) //用海伦公式来算三角形的面积。
{
double l = (a + b + c) / 2.0;
return sqrt(l*(l - a)*(l - b)*(l - c));
} int main()
{
input_data(a[1][1], a[1][2]);//输入三个顶点的坐标
input_data(a[2][1], a[2][2]);
input_data(a[3][1], a[3][2]);
input_data(xx0, yy0);//输入要判断的点的坐标。
//在顶点上
for (int i = 1;i <= 3;i++)
if (xx0 == a[i][1] && yy0 == a[i][2])
{
printf("4");
return 0;
}
//在边上。求出三条边的直线方程。
for (int i = 2;i <= 3;i++)
for (int j = 1; j <= i - 1; j++)
{
int x1 = a[j][1], y1 = a[j][2], x2 = a[i][1], y2 = a[i][2];
//要判断的等式是这个(x-x1)/(x2-x1)==(y-y1)/(y2-y1) 也即直线方程的两点式。
if (x2 == x1)//如果这个点的横坐标相同
{
if (x2 == xx0 && ((y1 <= yy0 && yy0 <= y2) || (y2 <= yy0 && yy0 <= y1)))
{//则在边上的条件是,横坐标和xx0一样,且它们的纵坐标把yy0夹在中间
printf("3");
return 0;
}
}
else
if (y2 == y1)//如果纵坐标相同
{
if (y2 == yy0 && ((x1 <= xx0 && xx0 <= x2) || (x2 <= xx0 && xx0 <= x1)))
{//纵坐标和yy0一样,横坐标要被夹在中间
printf("3");
return 0;
}
}
else //否则的话就直接按照两点式的左右等式相同来判断是否在点上
{
double left = (xx0 - x1)*1.0 / ((x2 - x1)*1.0), right = (yy0 - y1)*1.0 / ((y2 - y1)*1.0);
double temp = right - left;//因为是实数,所以不能直接用“=”来判断
if (temp < 0)
temp = -temp;
if (temp <= 0.0001)//差的绝对值小于精度即可。
{
printf("3");
return 0;
}
}
}
//在三角形内部。用海伦公式。把三角形分成三个小的三角形。看三个小的三角形和整个大的三角形面积是否一样。
double s[5];
int num = 0;
for (int i = 2;i <= 3;i++)
for (int j = 1; j <= i - 1; j++)
{
//i和j是两个点。(xx0,yy0)充当第3个点。
double a1, b1, c1;
a1 = sqrt((a[i][1]-xx0)*(a[i][1]-xx0)+(a[i][2]-yy0)*(a[i][2]-yy0));
b1 = sqrt((a[j][1] - xx0)*(a[j][1] - xx0) + (a[j][2] - yy0)*(a[j][2] - yy0));
c1 = sqrt((a[i][1] - a[j][1])*(a[i][1] - a[j][1]) + (a[i][2] - a[j][2])*(a[i][2] - a[j][2]));
num++; //这个嵌套循环会循环3次,对应求出3个小三角形的面积。
s[num] = s_triangle(a1, b1, c1);
}
double aa1, bb1, cc1;//然后是求出大三角形的面积
aa1 = sqrt((a[1][1] - a[2][1])*(a[1][1] - a[2][1]) + (a[1][2] - a[2][2])*(a[1][2] - a[2][2]));
bb1 = sqrt((a[1][1] - a[3][1])*(a[1][1] - a[3][1]) + (a[1][2] - a[3][2])*(a[1][2] - a[3][2]));
cc1 = sqrt((a[2][1] - a[3][1])*(a[2][1] - a[3][1]) + (a[2][2] - a[3][2])*(a[2][2] - a[3][2]));
s[4] = s_triangle(aa1, bb1, cc1);
s[0] = s[1] + s[2] + s[3];//把3个三角形的面积累加起来存在s[0]
double temp1 = s[4] - s[0];//如果s[0]和s[4]相同则输出在三角形内部。
if (temp1 < 0)
temp1 = -temp1;
if (temp1 <= 0.0001)
{
printf("1");
return 0;
}
//剩下一种情况就是在三角形外部啦。
printf("2");
return 0;
}
【u027】神秘大三角的更多相关文章
- 叉积_判断点与三角形的位置关系 P1355 神秘大三角
题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样例) 所有 ...
- 洛谷 P1355 神秘大三角(计算几何基础)
P1355 神秘大三角 题目提供者yeszy 标签 福建省历届夏令营 难度 普及/提高- 题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三 ...
- 洛谷 - P1355 - 神秘大三角 - 简单计算几何
https://www.luogu.org/problemnew/show/P1355 判断一个点和三角形的位置关系,最简单的思路就是用向量. 首先排除掉和三角形顶点重合的情况. 把三角形设计成一个首 ...
- luogu1355 神秘大三角
题解: 计算几何入门题 按逆时针方向访问三角形的边 然后作叉积判断点是否在边的顺时针方向 叉积和点积都有分配率 但不满足结合律 代码: #include <bits/stdc++.h> u ...
- luogu 1355 神秘大三角 判断点和三角形的位置关系 面积法 叉积法
题目链接 题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样 ...
- P1355 神秘大三角
题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样例) 所有 ...
- TYVJ计算几何
今天讲了计算几何,发几道水水的tyvj上的题解... 计算几何好难啊!@Mrs.General....怎么办.... 这几道题都是在省选之前做的,所以前面的Point运算啊,dcmp啊,什么什么的,基 ...
- Codeforces Round #313 (Div. 2) C. Gerald's Hexagon(补大三角形)
C. Gerald's Hexagon time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- MathType如何编辑大三角形符号
MathType中包含的符号超过1000多个,可以满足我们很多学科的使用,尤其是数学中,涉及到很多的符号,常见的就是代数.几何这两大类,当然还有集合之类的符号使用也比较多.我们在用MathType编辑 ...
随机推荐
- Jedis源码分析
http://blog.csdn.net/luyee2010/article/details/17580381
- Wicket实战(二)hello world
上次的博文Wicket实战(一)概述中给大家简介了一下关于Wicket的概念性内容,今天我们完毕第一个Wicket实例-Hello World! 1.Hello World原版 在Wic ...
- js进阶 13-8 jquery如何实现侧边栏
js进阶 13-8 jquery如何实现侧边栏 一.总结 一句话总结:先是把侧边栏设置为left为-100px,隐藏起来,jquery自定义动画animate里面的改变元素的距左边的宽度left,sl ...
- 国内技术管理人员批阅google的“春运交通图”项目
在整理一份报告的时候,偶然看到2008年春节期间google推出的“春运交通图”项目建设历程报道,很受启发,随以国内的技术管理人员眼光批阅了这篇文章,同时也是自嘲吧. 以下黑色字体是原报道,红色字体是 ...
- 芯片SA58672(功放芯片)
1::下面的中文图可能不准: 针对上面的图,数据手册中有一些参数的推导: 这个式子是电压增益的 这个式子是关于截止频率的 典型原理图: 需要电源去耦,能够提高效率. PVDD引脚处的电 ...
- 适用android的MVP:怎样组织展示层
原文 MVP for Android:How to organize presentation layer http://antonioleiva.com/mvp-android/ 译文 MVP(Mo ...
- (嵌入式开发)自己写bootloader之编写第二阶段
内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M. ...
- 宝塔 ftp 不能连接 列出时出错
摘抄自 https://www.bt.cn/bbs/forum.php?mod=viewthread&tid=1903&page=1&extra=#pid6515 1.注意内网 ...
- HDU 2587 - 很O_O的汉诺塔
看题传送门 吐槽题目 叫什么很O_O的汉诺塔我还@.@呢. 本来是想过一段时间在来写题解的,不过有人找我要. 本来排名是第8的.然后搞了半天,弄到了第五.不过代码最短~ 截止目前就9个ID过,小小的成 ...
- 6.4 Android硬件访问服务编写HAL代码
JNI向上提供本地函数,向下加载HAL文件,并调用HAL的函数: HAL负责访问驱动程序执行硬件操作 JNI和HAL都是用c语言或者C++语言编写的,JNI加载HAL的实质就是使用dlopen加载动态 ...