C判断一个点在三角形上

 背景

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

原理

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

代码
#include <stdio.h>
#include <math.h>

// 点
typedef struct {
    float x;
    float y;
} *Point;

// 直线距离
float distance(Point a, Point b) {
    return sqrt((b->x - a->x) * (b->x - a->x) + (b->y - a->y) * (b->y - a->y));
}

// 三角形面积
float area(Point a, Point b, Point c) {
    float ab = distance(a, b);
    float ac = distance(a, c);
    float bc = distance(b, c);
    return 0.5 * sqrt(4 * ab * ab * ac * ac - (ab * ab + ac * ac - bc * bc) * (ab * ab + ac * ac - bc * bc));
}

// 判断点是否在三角形上
_Bool isPtOn(Point a, Point b, Point c, Point pt) {
    float triangleArea = area(a, b, c);
 
    float splitTriangle1 = area(a, b, pt);
    float splitTriangle2 = area(a, c, pt);
    float splitTriangle3 = area(b, c, pt);
    return (splitTriangle1 + splitTriangle2 + splitTriangle3 == triangleArea);
}

int main(int argc, char **argv) {
    Point a = malloc(sizeof(float) * 2);
    a->x = -5;
    a->y = 0;
    Point b = malloc(sizeof(float) * 2);
    b->x = 0;
    b->y = 5;
    Point c = malloc(sizeof(float) * 2);
    c->x = 5;
    c->y = 0;
    
    // 在三角形上
    Point d = malloc(sizeof(float) * 2);
    d->x = 0;
    d->y = 1;
    _Bool ret = isPtOn(a, b, c, d);
	printf("%d\n", ret);
	
	// 不在三角形上
    d->x = 0;
    d->y = -1;
	ret = isPtOn(a, b, c, d);
	printf("%d\n", ret);
}
输出
1
0
扩展

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

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

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/799151.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图解PyTorch中的Transpose操作

在PyTorch中&#xff0c;我们时常会对张量进行转置操作。若张量是二维的&#xff0c;则非常容易理解。若张量维度更高&#xff0c;则会令人摸不到头脑。 高维张量究竟是怎么转置的&#xff1f;简单来说&#xff0c;就是将参与转置的维度抽出来&#xff0c;将内侧的子张量视为一…

EasyCVR视频技术:城市电力抢险的“千里眼”,助力抢险可视化

随着城市化进程的加速和电力需求的不断增长&#xff0c;电力系统的稳定运行对于城市的正常运转至关重要。然而&#xff0c;自然灾害、设备故障等因素常常导致电力中断&#xff0c;给城市居民的生活和企业的生产带来严重影响。在这种情况下&#xff0c;快速、高效的电力抢险工作…

Chromium CI/CD 之Jenkins实用指南2024-如何创建新节点(三)

1. 前言 在前一篇《Jenkins实用指南2024-系统基本配置&#xff08;二&#xff09;》中&#xff0c;我们详细介绍了如何对Jenkins进行基本配置&#xff0c;包括系统设置、安全配置、插件管理以及创建第一个Job。通过这些配置&#xff0c;您的Jenkins环境已经具备了基本的功能和…

昇思25天学习打卡营第09天|保存与加载

在训练网络模型的过程中&#xff0c;实际上我们希望保存中间和最后的结果&#xff0c;用于微调&#xff08;fine-tune&#xff09;和后续的模型推理与部署&#xff0c;本章节我们将介绍如何保存与加载模型。 import numpy as np import mindspore from mindspore import nn fr…

Android TabLayout+ViewPager2如何优雅的实现联动详解

一、介绍 Android开发过程中&#xff0c;我们经常会遇到滑动导航栏的做法&#xff0c;之前的做法就是我们通过ViewGroup来转动&#xff0c;然后通过大量的自定义来完成&#xff0c;将导航栏item与viewpage 滑动&#xff0c;达到业务需求 二、现实方案 通过介绍&#xff0c;我…

【邀请函】庭田科技邀您第五届中国国际复合材料科技大会

第五届中国国际复合材料科技大会暨第七届国际复合材料产业创新成果技术展示&#xff08;ICIE7-新疆&#xff09;将于7月25-27日在新疆乌鲁木齐-国际会展中心举行。上海庭田信息科技有限公司将携多款仿真模拟软件亮相本次大会&#xff0c;诚挚欢迎各位到场咨询了解&#xff01; …

鸿蒙架构之AOP

零、主要内容 AOP 简介ArkTs AOP 实现原理 JS 原型链AOP实现原理 AOP的应用场景 统计类&#xff1a; 方法调用次数统计、方法时长统计防御式编程&#xff1a;参数校验代理模式实现 AOP的注意事项 一、AOP简介 对于Android、Java Web 开发者来说&#xff0c; AOP编程思想并不…

双时隙对讲模块:高效、低成本的数字对讲解决方案

商业对讲中&#xff0c;对讲机是一种提高工作效率的通讯工具&#xff0c;大大节省了工作时间和成本&#xff0c;使部门内和部门间的通讯更加便捷。市场行业需求&#xff0c;无线对讲机行业慢慢从模拟转向数字模式&#xff0c;在信息安全和频点利用上取得了重大提升。这为行业用…

为什么自养号测评推广是未来跨境电商的趋势,尤其是亚马逊

在当今跨境电商的激烈竞争中&#xff0c;测评补单的现象非但没有因平台的禁令而消退&#xff0c;反而愈发成为行业内的普遍现象&#xff0c;其背后的驱动力值得深入探讨。以下是对这一现象背后五大原因的优化阐述&#xff1a; 一、市场饱和与竞争加剧 随着跨境电商市场的日益…

Kafka:Kafka详解

Kafka 消息中间件 区别于rabbitmq,kafka更适用于量级较大的数据(100w级),主要在大数据领域使用 Kafka介绍 一个分布式流媒体平台,类似于消息队列或企业消息传递系统 Kafak的结构如下 producer:发布消息的对象 topic:Kafak将消息分门别类,每类的消息称为一个主题(Topic) …

mupdf 编译说明

进入官网下载源码&#xff1a;https://www.mupdf.com/releases 挑选需要的版本&#xff0c;下载解压&#xff0c;然后打开解决方案&#xff0c;进行编译

MySQL 数据库 - 事务

MySQL 数据库&#xff08;基础&#xff09;- 事务 事务简介 事务 是一组操作集合&#xff0c;他是一个不可分割的工作单位&#xff0c;事务会把所有的操作看作是一个整体一起向系统发送请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 比如&#xff1a;张…

tomcat的优化、动静分离

tomcat的优化 tomcat自身的优化 tomcat的并发处理能力不强&#xff0c;大项目不适应tomcat做为转发动态的中间件&#xff08;k8s集群&#xff0c;pytnon rubby&#xff09;&#xff0c;小项目会使用&#xff08;内部使用的&#xff09;动静分离 默认配置不适合生产环境&…

在 PostgreSQL 里如何处理数据的存储优化和查询优化的冲突?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何处理数据的存储优化和查询优化的冲突一、存储优化与查询优化的概述&#xff08;一…

前端实现一键复制功能

1、下载插件 npm i vue-clipboard32.0.0 2、在需要复制的文件中引入插件并使用&#xff1a; JS: import useClipboard from "vue-clipboard3"; const { toClipboard } useClipboard(); HTML: <el-tooltip content"复制内容" placement"top&…

Java 客户端操作 Redis 命令(端口号映射方法,命令演示,注意事项)

文章目录 开放端口号问题引入依赖验证连接通用命令使用set 和 get 命令的使用exists 和 del 命令的使用keys 命令的使用expire 和 ttl 命令type 命令的使用 String 类型命令使用mset 和 mget 命令getrange 和 setrange 命令append 命令incr 和 decr 命令 list 类型命令使用lpus…

05 以物品与用户为基础个性化推荐算法的四大策略

《易经》&#xff1a;“九二&#xff1a;见龙在田&#xff0c;利见大人”。九二是指阳爻在卦中处于第二位&#xff0c;见龙指龙出现在地面上&#xff0c;开始崭露头角&#xff0c;但是仍须努力&#xff0c;应处于安于偏下的位置。 本节是模块二第一节&#xff0c;模块二讲解传…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(六)-人工智能控制的自主无人机用例

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

开源浏览器引擎对比与适用场景:WebKit、Chrome、Gecko

WebKit与Chrome的Blink引擎对比 起源与关系&#xff1a; WebKit最初由苹果公司开发&#xff0c;用于Safari浏览器。后来&#xff0c;WebKit逐渐成为一个独立的开源项目&#xff0c;被多个浏览器厂商采用。Blink是Google基于WebKit项目分支出来的一个浏览器引擎&#xff0c;用于…

自主升级,平稳过渡!麒麟信安保障长沙市智慧交通发展中心CentOS迁移无忧

长沙市智慧交通发展中心围绕综合交通运输协调体系的构建&#xff0c;实施交通运行的监测、预测和预警&#xff0c;面向公众提供交通信息服务&#xff0c;开展多种运输方式的调度协调&#xff0c;提供交通行政管理和应急处置的信息保障。 该中心目前数据日交换量超2亿条&#x…