• 清华计算几何-ConvexHull(凸包)-极点InTriangle/ToLeft Test


    前言

    清华计算几何-ConvexHull(凸包)-求极点InTriangle/ToLeft Test-CSDN博客

    上篇博客描述了一种从点集合暴力求解极点的算法,复杂度为O(n4), 耗费相当高. 下面介绍一种优于暴力求极点的算法

    极边(extremity edge)

    和极点概念类似, 如果点集合中,存在两个点连成一条线, 其他点都在这条边的同一侧,则这条线为极边(extremity edge), 这两个点为极点。

    算法思路

    遍历所有的边, 判断其他点是否都在这条边的同一侧。

    算法复杂度: O(n3), n2用于遍历所有边,n用于遍历所有点

    伪代码实现

    代码实现

    1. #include
    2. #include
    3. using namespace std;
    4. struct Point
    5. {
    6. float x;
    7. float y;
    8. bool extreme;
    9. };
    10. float Area2(const Point& inPointA, const Point& inPointB, const Point& inPointC)
    11. {
    12. float value =
    13. inPointA.x * inPointB.y - inPointA.y * inPointB.x
    14. + inPointB.x * inPointC.y - inPointB.y * inPointC.x
    15. + inPointC.x * inPointA.y - inPointC.y * inPointA.x;
    16. return value;
    17. }
    18. bool IsLeftTest(const Point& inPointA, const Point& inPointB, const Point& inPointC)
    19. {
    20. return Area2(inPointA, inPointB, inPointC) > 0;
    21. }
    22. void CheckExtrmtiEdge(vector& inPoints, int idxA, int idxB)
    23. {
    24. bool bLeftEmpty = true;
    25. bool bRightEmpty = true;
    26. int pointNum = inPoints.size();
    27. for (int idx = 0; idx < pointNum; idx++)
    28. {
    29. if (idx != idxA && idx != idxB)
    30. {
    31. if (IsLeftTest(inPoints[idx], inPoints[idxA], inPoints[idxB]))
    32. {
    33. bLeftEmpty = false;
    34. }
    35. else
    36. {
    37. bRightEmpty = false;
    38. }
    39. if (!bLeftEmpty && !bRightEmpty)
    40. break;
    41. }
    42. }
    43. if (bLeftEmpty || bRightEmpty)
    44. {
    45. inPoints[idxA].extreme = true;
    46. inPoints[idxB].extreme = true;
    47. }
    48. }
    49. void GetEpFromExtrmtiEdge(vector& inPoints)
    50. {
    51. int pointNum = inPoints.size();
    52. for (auto& point : inPoints)
    53. {
    54. point.extreme = false;
    55. }
    56. for (int idxA = 0; idxA < pointNum; idxA++)
    57. {
    58. for (int idxB = idxA + 1; idxB < pointNum; idxB++)
    59. {
    60. CheckExtrmtiEdge(inPoints, idxA, idxB);
    61. }
    62. }
    63. }
    64. int main()
    65. {
    66. std::cout << "Hello World!\n";
    67. // point set contruct
    68. vector inPoints =
    69. {
    70. {0, 0},
    71. {-1, -1},
    72. {5, 2},
    73. {4, 5},
    74. {3, 3},
    75. {-1, 3},
    76. {2, 2},
    77. {-3, 2},
    78. };
    79. GetEpFromExtrmtiEdge(inPoints);
    80. for (int index = 0; index < inPoints.size(); index++)
    81. {
    82. if (inPoints[index].extreme)
    83. {
    84. printf("(%f, %f)\n", inPoints[index].x, inPoints[index].y);
    85. }
    86. }
    87. }

    运行结果

    对于和上节同样的数据集,得出的结果一致

    参考资料 

    [1]清华计算几何 P13-P15

  • 相关阅读:
    macOS端React的项目WebPack热更新(HMR)失效问题分析及解决,原因竟是Windows文件系统不区分大小写导致
    短视频挺进在线音乐腹地
    BGRL pyg环境安装
    IO流~File
    嵌入式学习板开发:STC单片机扑克游戏设计(C语言)
    Gradle
    VSCODE自定义代码片段简述与基础使用
    Java类中this关键字和static关键字的用法详解
    网页资源加载过程
    Ali MaxCompute SDK
  • 原文地址:https://blog.csdn.net/qq_29523119/article/details/140310455