Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

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

【输入格式】

前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样例) 所有坐标值均为整数。

【输出格式】

若点在三角形内(不含边界),输出1; 若点在三角形外(不含边界),输出2; 若点在三角形边界上(不含顶点),输出3; 若点在三角形顶点上,输出4。

【数据规模】

对于100%数据,0<=所有点的横、纵坐标<=100

Sample Input1

  1. (0,0)
  2. (3,0)
  3. (0,3)
  4. (1,1)

Sample Output1

  1. 1

【题解】

判断的优先顺序如下:

1.和顶点重合。

2.和边重合

3.在三角形内部

else

在三角形外部。

前3个种任意一个成立。后续就不再判断。直接结束程序了。

其中顶点只要和所有的点都比较一遍就可以了。

然后和边重合的情况。只要把三条边的直线方程求出来就可以了。代入看看x0,y0是否为这条边的方程的一个解,如果是一个解,则这个点在边上。直接输出在边上。

然后在三角形内部。

则这个点和三角形的三个顶点连线可以把大三角形分成3个小的三角形。

然后用海伦公式(知道3边就能求三角形面积)算出三个小三角形的面积和。

//海伦公式,设三角形的周长的一半为p,三边长为a,b,c;

//s=根号(p*(p-a)*(p-b)*(p-c));

看看这三个小的三角形的面积和与大三角形的面积是否是一样的。如果是一样的则这个点是在三角形的内部的。(如果不一样则在三角形外部!);

因为是实数的运算。所以判断相等要用差的绝对值小于精度来判断。

【代码】

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4.  
  5. int a[4][3],xx0,yy0;
  6.  
  7. void input_data(int &x, int &y)//输入一行坐标
  8. {
  9. x = 0, y = 0;
  10. char s[500];
  11. scanf("%s", s);
  12. int len = strlen(s);//用strlen函数要include <cstring>这个头文件
  13. int x1 = 0, temp;
  14. for (int i = 1; i <= len - 1; i++)
  15. if (s[i] != ',')
  16. x = x * 10 + s[i] - '0';//获取x坐标
  17. else
  18. {
  19. temp = i;
  20. break;
  21. }
  22. for (int i = temp + 1; i <= len - 1; i++)
  23. if (s[i] != ')')
  24. y = y * 10 + s[i] - '0';//获取y坐标
  25. else
  26. break;
  27. }
  28.  
  29. double s_triangle(double a, double b, double c) //用海伦公式来算三角形的面积。
  30. {
  31. double l = (a + b + c) / 2.0;
  32. return sqrt(l*(l - a)*(l - b)*(l - c));
  33. }
  34.  
  35. int main()
  36. {
  37. input_data(a[1][1], a[1][2]);//输入三个顶点的坐标
  38. input_data(a[2][1], a[2][2]);
  39. input_data(a[3][1], a[3][2]);
  40. input_data(xx0, yy0);//输入要判断的点的坐标。
  41. //在顶点上
  42. for (int i = 1;i <= 3;i++)
  43. if (xx0 == a[i][1] && yy0 == a[i][2])
  44. {
  45. printf("4");
  46. return 0;
  47. }
  48. //在边上。求出三条边的直线方程。
  49. for (int i = 2;i <= 3;i++)
  50. for (int j = 1; j <= i - 1; j++)
  51. {
  52. int x1 = a[j][1], y1 = a[j][2], x2 = a[i][1], y2 = a[i][2];
  53. //要判断的等式是这个(x-x1)/(x2-x1)==(y-y1)/(y2-y1) 也即直线方程的两点式。
  54. if (x2 == x1)//如果这个点的横坐标相同
  55. {
  56. if (x2 == xx0 && ((y1 <= yy0 && yy0 <= y2) || (y2 <= yy0 && yy0 <= y1)))
  57. {//则在边上的条件是,横坐标和xx0一样,且它们的纵坐标把yy0夹在中间
  58. printf("3");
  59. return 0;
  60. }
  61. }
  62. else
  63. if (y2 == y1)//如果纵坐标相同
  64. {
  65. if (y2 == yy0 && ((x1 <= xx0 && xx0 <= x2) || (x2 <= xx0 && xx0 <= x1)))
  66. {//纵坐标和yy0一样,横坐标要被夹在中间
  67. printf("3");
  68. return 0;
  69. }
  70. }
  71. else //否则的话就直接按照两点式的左右等式相同来判断是否在点上
  72. {
  73. double left = (xx0 - x1)*1.0 / ((x2 - x1)*1.0), right = (yy0 - y1)*1.0 / ((y2 - y1)*1.0);
  74. double temp = right - left;//因为是实数,所以不能直接用“=”来判断
  75. if (temp < 0)
  76. temp = -temp;
  77. if (temp <= 0.0001)//差的绝对值小于精度即可。
  78. {
  79. printf("3");
  80. return 0;
  81. }
  82. }
  83. }
  84. //在三角形内部。用海伦公式。把三角形分成三个小的三角形。看三个小的三角形和整个大的三角形面积是否一样。
  85. double s[5];
  86. int num = 0;
  87. for (int i = 2;i <= 3;i++)
  88. for (int j = 1; j <= i - 1; j++)
  89. {
  90. //i和j是两个点。(xx0,yy0)充当第3个点。
  91. double a1, b1, c1;
  92. a1 = sqrt((a[i][1]-xx0)*(a[i][1]-xx0)+(a[i][2]-yy0)*(a[i][2]-yy0));
  93. b1 = sqrt((a[j][1] - xx0)*(a[j][1] - xx0) + (a[j][2] - yy0)*(a[j][2] - yy0));
  94. 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]));
  95. num++; //这个嵌套循环会循环3次,对应求出3个小三角形的面积。
  96. s[num] = s_triangle(a1, b1, c1);
  97. }
  98. double aa1, bb1, cc1;//然后是求出大三角形的面积
  99. 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]));
  100. 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]));
  101. 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]));
  102. s[4] = s_triangle(aa1, bb1, cc1);
  103. s[0] = s[1] + s[2] + s[3];//把3个三角形的面积累加起来存在s[0]
  104. double temp1 = s[4] - s[0];//如果s[0]和s[4]相同则输出在三角形内部。
  105. if (temp1 < 0)
  106. temp1 = -temp1;
  107. if (temp1 <= 0.0001)
  108. {
  109. printf("1");
  110. return 0;
  111. }
  112. //剩下一种情况就是在三角形外部啦。
  113. printf("2");
  114. return 0;
  115. }

【u027】神秘大三角的更多相关文章

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

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

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

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

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

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

  4. luogu1355 神秘大三角

    题解: 计算几何入门题 按逆时针方向访问三角形的边 然后作叉积判断点是否在边的顺时针方向 叉积和点积都有分配率 但不满足结合律 代码: #include <bits/stdc++.h> u ...

  5. luogu 1355 神秘大三角 判断点和三角形的位置关系 面积法 叉积法

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

  6. P1355 神秘大三角

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

  7. TYVJ计算几何

    今天讲了计算几何,发几道水水的tyvj上的题解... 计算几何好难啊!@Mrs.General....怎么办.... 这几道题都是在省选之前做的,所以前面的Point运算啊,dcmp啊,什么什么的,基 ...

  8. Codeforces Round #313 (Div. 2) C. Gerald&#39;s Hexagon(补大三角形)

    C. Gerald's Hexagon time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. MathType如何编辑大三角形符号

    MathType中包含的符号超过1000多个,可以满足我们很多学科的使用,尤其是数学中,涉及到很多的符号,常见的就是代数.几何这两大类,当然还有集合之类的符号使用也比较多.我们在用MathType编辑 ...

随机推荐

  1. 反序列化xml到treeview

    private void Form1_Load(object sender, EventArgs e) { string xmlPath = System.Environment.CurrentDir ...

  2. 7.3 GROUP BY的“新”功能

    7.3 GROUP BY的"新"功能正在更新内容,请稍后

  3. 【例题 7-1 UVA - 725】Division

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举分母从0到99999. 得到分子,判断合法 [代码] /* 1.Shoud it use long long ? 2.Have ...

  4. Valgrind的用法

    Valgrind是执行在Linux上一套基于仿真技术的程序调试和分析工具,它包括一个内核──一个软件合成的CPU,和一系列的小工具,每一个工具都能够完毕一项任务──调试.分析,或測试等. Valgri ...

  5. Library Component Properties的表格如何填写

  6. JS错误记录 - 事件 - 拖拽

    错误总结: 1. var disX = 0;   现在window.onload里声明变量,而不是在事件oDiv.onmousedown里面声明并赋值. 对于这个还不是很明白. 2. onmoused ...

  7. [D3] Create DOM Elements with D3 v4

    Change is good, but creating from scratch is even better. This lesson shows you how to create DOM el ...

  8. GMTC2019会后:做一场冷门的技术专场是什么体验

    上周四(6.20)GMTC2019大会的第一天,很荣幸作为「UI与图形渲染」专场出品人获得了与图形领域几位技术专家同场交流的机会. 图形技术在前端范畴内是一个相对小众的话题,虽然前端工程师几乎每天都在 ...

  9. 9.8 Binder系统_c++实现_内部机制1

    1. 内部机制_回顾binder框架关键点 binder进程通讯过程情景举例: test_server通过addservice向service_manager注册服务 test_client通过get ...

  10. vue学习笔记一:用Key管理可复用元素

    vue为了高效的渲染元素,会尽可能的复用组件,而不是从头渲染,如下案例 <template> <div id="app"> <template v-i ...