4.4 给定的点是否在三角形之内

2024-05-28 15:58

本文主要是介绍4.4 给定的点是否在三角形之内,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 前言

本文的一些图片, 资料 截取自编程之美

2. 问题描述

这里写图片描述

3. 问题分析

假设给定的三角形为ABC, 给定的点为D, 使用S(ABC) 表示ABC三个点构成的三角形的面积
解法一 : 连接AD, BD, CD, 然后求解S(ABC); S(DBC), S(ADC), S(ABD), 如果S(ABC) == S(DBC) + S(ADC) + S(ABD), 则说明给定的点D是在三角形ABC内部, 否则后者的面积是会大于ABC的面积的

解法二 : 逆时针遍历ABC的三个边, AB, BC, CA, 如果相对于这三个边, D**均**在左边, 则说明D在三角形ABC的内部

可能上面的描述比较抽象, 特别是第二种解法, 下面是一些图解
解法一 :
1 D在ABC内部
这里写图片描述
2 D在ABC外部
这里写图片描述

解法二 :
1 D在ABC内部
这里写图片描述
2 D在ABC外部
这里写图片描述

4. 代码

/*** file name : Test13IsPointInTriangle.java* created at : 9:34:57 AM May 30, 2015* created by 970655147*/package com.hx.test04;public class Test13IsPointInTriangle {// 判断给定的点是否在三角形内部public static void main(String []args) {Point point = new Point(0, 6);Triangle tri = new Triangle(new Point(0, 0), new Point(5, 0), new Point(0, 7) );isPointInTriangle01(point, tri);isPointInTriangle02(point, tri);}// 思路 : 将tri的三个顶点和point连接起来, 然后判断(abd + acd + bcd) 是否大于abc// 如果大于   则说明d在abc之外, 否则说明d在abc之内public static void isPointInTriangle01(Point point, Triangle tri) {double offset = 0.001;Triangle abd = new Triangle(tri.vertex01, tri.vertex02, point);Triangle acd = new Triangle(tri.vertex01, tri.vertex03, point);Triangle bcd = new Triangle(tri.vertex02, tri.vertex03, point);if(abd.getArea() + acd.getArea() + bcd.getArea() > (tri.getArea() + offset) ) {Log.log(false);} else {Log.log(true);}}// 从d开始逆时针旋转   可以发现  点d在边ab, bc, ca的左边   于是便有了下面的方法// 如果点d 在ab, bc, ca的左边   则说明点d存在于该三角形内// 否则  点d在三角形内public static void isPointInTriangle02(Point point, Triangle tri) {if(crossProduct(tri.vertex01, tri.vertex02, point) >= 0.0d && crossProduct(tri.vertex02, tri.vertex03, point) >= 0.0d && crossProduct(tri.vertex03, tri.vertex01, point) >= 0.0d) {Log.log(true);} else {Log.log(false);}}// 表示向量 ab x ad// 如果ab x ad > 0,  则说明d在ab的左边// 如果ab x ad < 0,  则说明d在ab的右边// 如果ab x ad == 0,  则说明d在ab的上private static double crossProduct(Point a, Point b, Point d) {return (b.x - a.x) * (d.y - a.y) - (d.x - a.x) * (b.y - a.y);}// 三角形static class Triangle {// 三个顶点  三个边长Point vertex01, vertex02, vertex03;double edge12, edge23, edge31;// 初始化public Triangle() {}public Triangle(Point vertex01, Point vertex02, Point vertex03) {this.vertex01 = vertex01;this.vertex02 = vertex02;this.vertex03 = vertex03;edge12 = calcEdge(vertex01, vertex02);edge23 = calcEdge(vertex02, vertex03);edge31 = calcEdge(vertex03, vertex01);}// 给定两个顶点  计算他们之间的距离private double calcEdge(Point vertex01, Point vertex02) {return Math.sqrt(Math.pow((vertex01.x - vertex02.x ), 2) + Math.pow((vertex01.y - vertex02.y ), 2) );}// 利用海伦公式求面积public double getArea() {double p = (edge12 + edge23 + edge31) / 2;return Math.sqrt((p - edge12) * (p - edge23) * (p - edge31) * p );}}}

5. 运行结果

这里写图片描述

6. 总结

这个问题不仅让我了解到了这两种方法, 还有一个收获就是, 了解到了海伦公式, 以及勾股定理的证明

注 : 因为作者的水平有限,必然可能出现一些bug, 所以请大家指出!

这篇关于4.4 给定的点是否在三角形之内的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011023

相关文章

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作