码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 清华计算几何-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

  • 相关阅读:
    mac: nvm is already installed in /Users/**/.nvm, trying to update using git
    ✿✿✿JavaScript基本语法一
    基于布谷鸟搜索混合灰狼优化算法求解单目标优化问题(AGWOCS)
    网络及通信
    从 HPC 到 AI:探索文件系统的发展及性能评估
    普冉PY32系列(十四) 从XL2400迁移到XL2400P
    磁盘分区如何分? 电脑磁盘分区免费软件指南!
    【cv】图像预处理技术——从特征检测讲述图像预处理理论、实践、应用|01
    技术书籍超级阅读法
    R语言ggplot2可视化:使用ggpubr包的ggdonutchart函数可视化甜甜圈图(donut chart)、color参数自定义甜甜圈图中线条的颜色
  • 原文地址:https://blog.csdn.net/qq_29523119/article/details/140310455
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号