码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C判断一个点在三角形上


     背景

    鼠标操作时,经常要判断是否命中显示控件,特开发此算法快速判断。

    原理

    三角形三等分点定理是指在任意三角形ABC中,可以找到三个点D、E和F,使得线段AD、BE和CF均等分三角形ABC。 这意味着三个等分点分别位于三个边界上,并且每个等分点都将三角形划分为等面积部分。

    代码
    1. #include
    2. #include
    3. // 点
    4. typedef struct {
    5. float x;
    6. float y;
    7. } *Point;
    8. // 直线距离
    9. float distance(Point a, Point b) {
    10. return sqrt((b->x - a->x) * (b->x - a->x) + (b->y - a->y) * (b->y - a->y));
    11. }
    12. // 三角形面积
    13. float area(Point a, Point b, Point c) {
    14. float ab = distance(a, b);
    15. float ac = distance(a, c);
    16. float bc = distance(b, c);
    17. return 0.5 * sqrt(4 * ab * ab * ac * ac - (ab * ab + ac * ac - bc * bc) * (ab * ab + ac * ac - bc * bc));
    18. }
    19. // 判断点是否在三角形上
    20. _Bool isPtOn(Point a, Point b, Point c, Point pt) {
    21. float triangleArea = area(a, b, c);
    22. float splitTriangle1 = area(a, b, pt);
    23. float splitTriangle2 = area(a, c, pt);
    24. float splitTriangle3 = area(b, c, pt);
    25. return (splitTriangle1 + splitTriangle2 + splitTriangle3 == triangleArea);
    26. }
    27. int main(int argc, char **argv) {
    28. Point a = malloc(sizeof(float) * 2);
    29. a->x = -5;
    30. a->y = 0;
    31. Point b = malloc(sizeof(float) * 2);
    32. b->x = 0;
    33. b->y = 5;
    34. Point c = malloc(sizeof(float) * 2);
    35. c->x = 5;
    36. c->y = 0;
    37. // 在三角形上
    38. Point d = malloc(sizeof(float) * 2);
    39. d->x = 0;
    40. d->y = 1;
    41. _Bool ret = isPtOn(a, b, c, d);
    42. printf("%d\n", ret);
    43. // 不在三角形上
    44. d->x = 0;
    45. d->y = -1;
    46. ret = isPtOn(a, b, c, d);
    47. printf("%d\n", ret);
    48. }
    输出
    1
    0
    扩展

    如何判断在矩形,任意多边形上?(提示:计算多边形面积是等于点切割多边形面积和)

    C双指针元素去重-CSDN博客

    Qt 判断一个点是否落在三角形内(算法)_qt判断一个点在三角形内-CSDN博客


    创作不易,小小的支持一下吧!

  • 相关阅读:
    1028万!重庆统计局招标大数据平台,开建统计数据中台
    python异常常见处理
    摊牌了我后悔入行了,浅谈为何不该入行嵌入式
    怎么把两个pdf合并成一个pdf?
    【MM小贴士】SAP 批次双单位 CWM 的使用演示
    Flink CDC - Postgres
    接轨CCC国际标准,数字钥匙「出海」提速
    干货分享!各大跨境电商平台入驻指南及跨境电商实用工具推荐!
    Vue自定义名称下载PDF
    代码随想录算法训练营第二十七天| 131.分割回文串
  • 原文地址:https://blog.csdn.net/qq_30220519/article/details/140418211
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号