码农知识堂 - 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博客


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

  • 相关阅读:
    【云原生】docker+k8微服务容器化实战(下篇)
    GO学习之 消息队列(Kafka)
    Java二十三种设计模式-享元模式(12/23)
    记一次Redis Cluster Pipeline导致的死锁问题
    try-catch-finally | 里面有return语句时执行顺序
    解决 sharp: Installation error: unable to verify the first certificate
    Cruise 从零搭建模型
    Java多线程(5):CAS
    最受欢迎的11个Python开发软件
    本地的git仓库和远程仓库
  • 原文地址:https://blog.csdn.net/qq_30220519/article/details/140418211
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号