【算法】【算法杂谈】判断点是否在三角形内部(面积法和向量法)

news/2024/4/20 18:26:23/文章来源:https://blog.csdn.net/qq_39760347/article/details/130374423

目录

  • 前言
  • 问题介绍
  • 解决方案
  • 代码编写
    • java语言版本
    • c语言版本
    • c++语言版本
  • 思考感悟
  • 写在最后

前言

当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~

在此感谢左大神让我对算法有了新的感悟认识!

问题介绍

原问题
给定三个点坐标代表三角形的三个顶点,再给定一个(x,y)点,判断该点是否在三角形内部

解决方案

原问题
方法一:面积法
1、利用海伦公式求出以改点为顶点,三角形各边为底边的三角形面积之和,如果该和大于三角形的总面积,那么点在外面,如果不大于,则点在里面
优点:容易想到,容易编写,只需要编写点到点之间的距离即可利用公式快速计算面积从而判断答案
缺点:由于海伦公式存在开根会导致精度缺失判断失误
方法二:向量法
如下图:
在这里插入图片描述
1、向量的叉乘,假设A(2,1) B(2,0),则AxB = 0-2 = -2 < 0 ,也就是说如果A向量旋转到B向量同向时,叉乘为负数,反之则为正数
2、由此可以得到一个点在向量的那一侧,如果在右侧,那么叉乘为负数,如果在左侧,那么叉乘为正数
3、为什么要这个准备工作呢?我们再看一张图:
在这里插入图片描述

4、如果D点在三角形内,那么我们就能够得到D点一定在ABC三条边的同一侧!
5、所以更具这个定理我们只需要写一个叉乘的方法就能够解决
优点:简单快捷、没有精度缺失问题
缺点:不容易想到,容易被方法一抢风头~

代码编写

java语言版本

原问题:
方法一:

   /*** 二轮测试:判断点是否在三角形的内部* 方法一:面积法* @param x1* @param y1* @param x2* @param y2* @param x3* @param y3* @param x* @param y* @return*/public static boolean isInsideCp1(double x1, double y1,double x2, double y2,double x3, double y3,double x, double y) {return getSquare(x1, y1, x2, y2, x, y) + getSquare(x1, y1, x3, y3, x, y) + getSquare(x3, y3, x2, y2, x, y)<= getSquare(x1, y1, x2, y2, x3, y3);}/*** 给定三个点,求三角形面积* @param x1* @param y1* @param x2* @param y2* @param x3* @param y3* @return*/private static double getSquare(double x1, double y1,double x2, double y2,double x3, double y3) {// 先求三边double len1 = getLen(x1, y1, x2, y2);double len2 = getLen(x1, y1, x3, y3);double len3 = getLen(x2, y2, x3, y3);double p = (len1 + len2 + len3)/2;return Math.sqrt(p * (p-len1) * (p - len2) * (p - len3));}/*** 计算两点之间的距离* @param x1* @param y1* @param x2* @param y2* @return*/private static double getLen(double x1, double y1,double x2, double y2) {return Math.sqrt((x1-x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));}

方法二:

    /*** 二轮测试:判断点是否在三角形内* 方法二:向量法* 该方法不存在精度问题导致的结果不准确* @param x1* @param y1* @param x2* @param y2* @param x3* @param y3* @param x* @param y* @return*/public static boolean isInsideCp2(double x1, double y1,double x2, double y2,double x3, double y3,double x, double y) {// 判断点是否是顺时针顺序,如果不是则调整一下if (getCrossCp2(x1, y1, x3, y3, x2, y2) < 0) {// 说明x2,y2在右边,交换3和2double temx = x2;double temy = y2;x2 = x3;y2 = y3;x3 = temx;y3 = temy;}// 判断叉乘是否都是小于0if (getCrossCp2(x1, y1, x2, y2, x, y) <= 0&& getCrossCp2(x2, y2, x3, y3, x, y) <= 0&& getCrossCp2(x3, y3, x1, y1, x, y) <= 0) {return true;}return false;}/*** 计算x,y点在(x1, y2) -> (x2, y2) 向量的左边还是右边* 大于0,左边 小于0,右边* @param x1* @param y1* @param x2* @param y2* @param x* @param y* @return*/public static double getCrossCp2(double x1, double y1,double x2, double y2,double x, double y) {// 以x1,y1为基准double xs = x2 - x1;double ys = y2 - y1;double xs1 = x - x1;double ys1 = y - y1;// 计算叉乘return xs * ys1 - ys * xs1;}public static void main(String[] args) {System.out.println(isInsideCp2(0 ,0, 2, 0, 1, 2, 1, 1));}

c语言版本

正在学习中

c++语言版本

正在学习中

思考感悟

这也是个数学题,如果知道解法后,对于编程来说不算什么大问题,比较简单。

写在最后

方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
如果需要git源码可邮件给2260755767@qq.com
再次感谢左大神对我算法的指点迷津!

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

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

相关文章

Java企业电子招标采购系统源码Spring Boot + Mybatis + 前后端分离 构建企业电子招采平台之立项流程图

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

HTB靶机-Lame-WP

Lame 简介&#xff1a; Lame is a beginner level machine, requiring only one exploit to obtain root access. It was the first machine published on Hack The Box and was often the first machine for new users prior to its retirement Tags&#xff1a; Injection, C…

OSCP-XPosedAPI(本地文件包含、查看源码、os.system、命令盲注)

目录 扫描 Web API枚举 命令盲注 提权 扫描 发现了两个开放的端口:端口22上的SSH和端口13337上的未知服务。 用netcat手动探测端口13337,但是运行几个常见的TCP/UDP服务初始化命令没有输出。 尝试了一个完整的脚本和版本nmap扫描的开放端口࿰

Vue+Echarts 项目演练(下)收尾工作图表绘制

设置销售总量图表 中心容器地图设置 产品库存统计图 产品类别图表 项目可视化完结-整体展示 设置销售总量图表 在第一个容器中进行图表设置 <template><div><h2>A</h2><div class"chart" id"oneChart">容纳后期的图表…

ChatGPT进化的过程简介

Chat GPT可以做什么&#xff1f; 分点列条的回答问题 写代码或SQL 翻译 语法检查 ChatGPT官方还未公开论文&#xff0c;ChatGPT有一个“孪生兄弟”InstructGPT&#xff0c;InstructGPT有论文&#xff0c;可以根据InstructGPT论文推导ChatGPT的训练过程&#xff1a; ChatGPT的…

MySQ基础知识整合

目录 模糊查询 排序 单行函数 多行函数 分组函数 having 单表查询执行顺序总结 distinct 连接查询 子查询 union limit DQL语句执行顺序 DDL语句 日期化 date和date_format区别 update table 的快速创建以及删除&#xff08;及回滚&#xff09; 约束 事务 …

Vector-常用CAN工具 - 入门到精通 - 专栏链接

一、CANoe篇 1、CANoe入门到精通_软件安装 2、CANoe入门到精通_硬件及环境搭建 3、CANoe入门到精通_软件环境配置 4、CANoe入门到精通_Network Node CAPL开发 5、CANoe入门到精通_Node节点开发基本数据类型 6、CANoe入门到精通_Test Node节点开发设置 7、CANoe入门到精通…

缩小数据文件

今天又出现12.2c 环境的问题&#xff0c;1T的数据空间还剩下2G&#xff0c;吓了一身冷汗&#xff0c;赶紧查看原因&#xff0c;不知道哪路业务大神作妖了。 发现sysaux和system增加N多数据文件&#xff0c;而且目前使用不多&#xff0c; 缩小表空间的数据文件 可以使用下面的语…

【python中的魔法方法有哪些?】

__init__(self, ...): 类的构造函数&#xff0c;用于创建一个类的实例并初始化它的属性。__str__(self): 返回对象的字符串表示形式&#xff0c;可以用于打印对象或者转化成字符串。__repr__(self): 返回对象的字符串表示形式&#xff0c;通常是用于开发者调试和查看对象信息。…

【FPGA-DSP】第九期:音频信号处理

从本文开始将记录一些简单的音频信号处理算法在System Generator中的实现方法。本文将介绍如何搭建音频信号的采集与输出模型。 音频信号属于一维信号&#xff0c;一些基本概念如下&#xff1a; 采样频率&#xff1a;根据奈奎斯特采样定理&#xff0c;采样频率Fs应该不低于声…

【C语言】基础语法5:数组和指针

上一篇&#xff1a;函数和递归 下一篇&#xff1a;字符串和字符处理 ❤️‍&#x1f525;前情提要❤️‍&#x1f525;   欢迎来到C语言基本语法教程   在本专栏结束后会将所有内容整理成思维导图&#xff08;结束换链接&#xff09;并免费提供给大家学习&#xff0c;希望…

记一次死锁问题

最近在做一个需求&#xff0c;碰到了死锁的问题&#xff0c;记录下解决问题的过程 背景 这个需求要改动一个接口&#xff0c;我这边称为A接口&#xff0c;原先的逻辑是A接口内部会调用c方法&#xff0c;c方法是一个dubbo方法&#xff0c; 现在需要再A接口里添加调用B方法&…

【ROS】ubuntu18.04安装ROS(ROS1 Melodic)

1、添加中科大ROS源 1.1、添加源 sudo sh -c . /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ lsb_release -cs main" > /etc/apt/sources.list.d/ros-latest.list1. 2、添加公钥 sudo apt-key adv --keyserver hkp://keyser…

编译预处理

编译预处理 1、宏定义1.1、 无参宏定义1.2、使用宏定义的优点1.3、宏定义注意点1.4、带参数的宏(重点)1.5、条件编译1.6、宏定义的一些巧妙用法(有用)1.7、结构体占用字节数的计算原则&#xff08;考题经常考&#xff0c;要会画图&#xff09;1.8、#在宏定义中的作用&#xff0…

ESP32设备驱动-BMM150数字地磁传感器驱动

BMM150数字地磁传感器驱动 文章目录 BMM150数字地磁传感器驱动1、BMM150介绍2、硬件准备3、软件准备4、驱动实现1、BMM150介绍 BMM150 是一款低功耗、低噪声的 3 轴数字地磁传感器,用于罗盘应用。 具有 1.56 x 1.56 mm 和 0.60 mm 高度的 12 引脚晶圆级芯片级封装 (WLCSP) 为…

直升机空气动力学基础--004翼型的阻力

来源 1. 空气的粘性 2.阻力的产生 3.形成因素 4.阻力系数曲线

转换json格式的日期为Javascript对象的函数

项目中碰到了用jQuery从后台获取的json格式的日期的字符串&#xff0c;需要将此字符串转换成JavaScript的日期对象。 代码如下: //转换json格式的日期&#xff08;如&#xff1a;{ServerDatetime:"\/Date(1278930470649)\/"}&#xff09;为Javascript的日期对象 fu…

Linux tail 命令

前言 Linux 实时查看日志文件&#xff0c;最主要使用的就是tail命令。 linux tail命令用于显示文件尾部的内容&#xff0c;默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个&#xff0c;则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为“-”…

湿法冶金以及铼提取工艺,湿法冶金工艺特点及工艺流程

湿法冶金是利用浸出剂在一定温度压力下与矿石接触&#xff0c;把矿石中有用的金属溶解后再从溶液中回收有价金属的一种工艺&#xff0c;因为其过程大都是在水溶液中进行&#xff0c;所以又被称为“水法冶金”。 01 湿法冶金工艺特点及工艺流程 湿法冶金作为解决我国金属矿产资…

深度赋能产业数字化转型,蚂蚁集团数字化三件套亮相中国国际金融展

“十四五”规划纲要指出&#xff1a;加快推动数字产业化&#xff0c;推进产业数字化转型&#xff0c;实施“上云用数赋智”行动&#xff0c;推动数据赋能全产业链协同转型。明确提出了通过科技创新&#xff0c;加快产业数字化转型的要求。 4月25日&#xff0c;以“荟萃金融科技…