【技术】如何判定一个点是否在三角形内?判定方法介绍
(相关资料图)
判定一个点是否在三角形内如何判定一个点P是否存在于指定的三角形ABC内,这肯定是一个简单的问题,本文仅用一个图形界面程序展示了该问题,有兴趣的朋友可以看看。(2008.07.24最后更新) 在此处使用一种常见且简便的方法:如果三角形PAB,PAC和PBC的面积之和与三角形ABC的面积相等,即可判定点P在三角形ABC内(包括在三条边上)。 可知,该方法的关键在于如何计算三角形的面积。幸运地是,当知道三角形顶点(A,B和C)的坐标((Ax, Ay),(Bx, By)和(Cx, Cy))之后,即可计算出其面积: S = |(Ax * By + Bx * Cy + Cx * Zy - Ay * Bx - By * Cx - Cy * Ax) / 2| 关键的代码如下, // 由给定的三个顶点的坐标,计算三角形面积。 // Point(java.awt.Point)代表点的坐标。 private static double triangleArea(Point pos1, Point pos2, Point pos3) {double result = Math.abs((pos1.x * pos2.y + pos2.x * pos3.y + pos3.x * pos1.y - pos2.x * pos1.y - pos3.x * pos2.y - pos1.x * pos3.y) / 2.0D ); return result; } // 判断点pos是否在指定的三角形内。 private static boolean inTriangle(Point pos, Point posA, Point posB, Point posC) {double triangleArea = triangleArea(posA, posB, posC); double area = triangleArea(pos, posA, posB); area += triangleArea(pos, posA, posC); area += triangleArea(pos, posB, posC); double epsilon = 0.0001 ; // 由于浮点数的计算存在着误差,故指定一个足够小的数,用于判定两个面积是否(近似)相等。 if (Math.abs(triangleArea - area) < epsilon) {return true ; } return false ; } 执行该应用程序,用鼠标在其中点击三次,即可绘制一个三角形,如下组图所示: 然后仅需移动鼠标,就会出现一个空心圆圈。如果圆圈的中心在三角内(包含在三条边上),则圆圈显示为红色;否则,显示为蓝色。如下组图所示: 完整代码如下: public class CanvasPanel extends JPanel {private static final long serialVersionUID = - 6665936180725885346L ; private Point firstPoint = null ; private Point secondPoint = null ; private Point thirdPoint = null ; public CanvasPanel() {setBackground(Color.WHITE); addMouseListener(mouseAdapter); addMouseMotionListener(mouseAdapter); } public void paintComponent(Graphics g) {super .paintComponent(g); drawTriangel(g); } private void drawTriangel(Graphics g) {if (firstPoint != null && secondPoint != null ) {g.drawLine(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y); if (thirdPoint != null ) {g.drawLine(firstPoint.x, firstPoint.y, thirdPoint.x, thirdPoint.y); g.drawLine(secondPoint.x, secondPoint.y, thirdPoint.x, thirdPoint.y); } } } private static boolean inTriangle(Point pos, Point posA, Point posB, Point posC) {double triangeArea = triangleArea(posA, posB, posC); double area = triangleArea(pos, posA, posB); area += triangleArea(pos, posA, posC); area += triangleArea(pos, posB, posC); double epsilon = 0.0001 ; if (Math.abs(triangeArea - area) < epsilon) {return true ; } return false ; } private static double triangleArea(Point pos1, Point pos2, Point pos3) {double result = Math.abs((pos1.x * pos2.y + pos2.x * pos3.y + pos3.x * pos1.y - pos2.x * pos1.y - pos3.x * pos2.y - pos1.x * pos3.y) / 2.0D ); return result; } private MouseInputAdapter mouseAdapter = new MouseInputAdapter() {public void mouseReleased(MouseEvent e) {Point pos = e.getPoint(); if (firstPoint == null ) {firstPoint = pos; } else if (secondPoint == null ) {secondPoint = pos; Graphics g = CanvasPanel. this .getGraphics(); CanvasPanel. this .paintComponent(g); g.drawLine(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y); } else if (thirdPoint == null ) {thirdPoint = pos; Graphics g = CanvasPanel. this .getGraphics(); CanvasPanel. this .paintComponent(g); g.drawLine(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y); g.drawLine(firstPoint.x, firstPoint.y, thirdPoint.x, thirdPoint.y); g.drawLine(secondPoint.x, secondPoint.y, thirdPoint.x, thirdPoint.y); } } public void mouseMoved(MouseEvent e) {Point pos = e.getPoint(); Graphics2D g2 = (Graphics2D) CanvasPanel. this .getGraphics(); CanvasPanel. this .paintComponent(g2); if (firstPoint != null && secondPoint == null ) {g2.drawLine(firstPoint.x, firstPoint.y, pos.x, pos.y); } else if (firstPoint != null && secondPoint != null && thirdPoint == null ) {g2.drawLine(firstPoint.x, firstPoint.y, pos.x, pos.y); g2.drawLine(secondPoint.x, secondPoint.y, pos.x, pos.y); } else if (firstPoint != null && secondPoint != null && thirdPoint != null ) {if (inTriangle(pos, firstPoint, secondPoint, thirdPoint)) {g2.setColor(Color.RED); } else {g2.setColor(Color.BLUE); } int radius = 4 ; g2.drawOval(pos.x - radius, pos.y - radius, radius * 2 , radius * 2 ); } } }; } public class Triangle extends JFrame {private static final long serialVersionUID = 1L ; private CanvasPanel mainPanel = null ; public Triangle() {setTitle( " Triangle " ); setSize( new Dimension( 300 , 200 )); setResizable( false ); init(); Container container = getContentPane(); container.add(mainPanel); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible( true ); } private void init() {mainPanel = new CanvasPanel(); } public static void main(String[] args) {new Triangle(); } }
还可参见一篇英文文章: http://www.blackpawn.com/texts/pointinpoly/default.html 好文章 ;-)
标签:
相关推荐:
最新新闻:
- Portraiture是什么软件?Portraiture注册码及使用方法
- 尼康D40X相机好用吗?如何调整尼康D40X相机参数?
- 电脑如何卸载ie9浏览器?卸载ie9浏览器的方法
- win7如何格式化C盘?格式化C盘的方法步骤
- DNF称号宝珠有哪些?分享DNF称号宝珠大全
- 百度一键Root应该怎么使用?百度一键root的七个步骤使用教程
- 云服务器优势差别?三大主流云平台对比
- 域名前缀和域名后缀具体指什么?域名到底带不带www?
- 赛酷ocr破解版功能介绍 赛酷ocr怎么识别公式?
- 最资讯丨不会跑代码怎么办?python3的代码帮你解决
- 【环球时快讯】如何获取qq空间图片的url?获取方法步骤
- 当前短讯!U盘无法打开怎么办?如何修复U盘丢失的数据?
- 高主频的N79和高能效的N82哪个更好用?两者评测 世界速讯
- 三星s5830i怎么刷机?三星s5830i详细刷机教程:当前热文
- 参数错误是什么意思?通常是哪些原因导致的?
- 【技术】如何判定一个点是否在三角形内?判定方法介绍
- 搜苹果安装失败如何解决?问题原因及解决方法介绍
- 建站之星模板好吗?模板建站需要虚拟主机吗?
- xda助手是什么?xda助手有什么作用?
- 联想电脑品牌机排名介绍:联想扬天T4900上榜:独家
- win7待机时间在哪里设置?待机时间设置方法步骤
- ios7发布时间是什么时候?ios7支持机型有哪些?
- 速讯:【系统制作】戴尔DELLOEMWin7SP1简体中文旗舰版
- 三阶魔方开发孩子智力的方法?3阶魔方顶层还原图解 视点
- 精选!为什么手机信号是满格但上网速度很慢?原因分析
- 【当前独家】刺客信条4黑旗黑屏无响应闪退怎么办?解决方案
- linux上支持的3G上网卡怎么用?3G上网卡使用方法
- 世界新资讯:如何删除地址栏中的URL?删除IE地址栏的两种方法
- 怎么看懂NARS的生产日期?NARS的生产日期保质期批号怎么看?
- 新版剑灵怎么加点?剑灵系统推荐加点
- 世界观速讯丨股票选股公式有哪些?股票选股公式汇总
- 曝Tango Gameworks目前有两个项目在开发 其中之一为JRPG|天天快资讯
- 一天7个瓜!男星为户口陪睡男大佬,叔圈顶流潜规则女演员
- 大熊猫暖暖被饲养员用竹竿打 园方回应:永不允许此人养熊猫
- 焦点消息!被疯狂“种草”的布艺清洗机到底“香不香”?
- 马来西亚国旗的含义(马来西亚国旗)-世界视讯
- 《幽灵线:东京》XSX版的表现比PS5更差_环球关注
- 天天通讯!光环系列主创加盟网飞游戏将打造多平台3A游戏
- 航嘉携高端硬件装备亮相武汉“这里潮好玩"嘉年华
- 宁美3060主机5619元
- 报道:华为小羊皮手机壳11.2元
- 当前要闻:天力锂能(301152):4月17日北向资金减持4.81万股
- 美的电水壶不到1折39元|环球新消息
- 乔思伯超美小机箱特价仅需199元了
- 任天堂状告欧洲网盘提供盗版游戏下载获赔44万欧元:今日热搜
- 天天热资讯!曝阿加莎《波洛:伦敦案》9月30日发售 或于明日公布
- 《哈利波特:魁地奇冠军》面向主机和PC公布
- CyberConnect2蒙特利尔工作室将于7月底关闭
- 全速版小米67瓦氮化镓84元
- 创新骨传导耳机259元-环球热头条
- 像素格斗《Hyper HitBoxing》上架steam 第二季度发售
- RTX 4060/Ti严重缩水:除了显存 还有一点没法看 短讯
- 华硕TX GAMING B760M WIFI天选主板 售价1449元
- 《梦境》工作室联合创始人Mark Healey即将离开|全球快消息
- 给力!广西最长跨海大桥龙门大桥主缆完成架设(图)
- 即时看!《复仇者联盟:无限战争》剪掉45分钟灭霸剧情 团灭山达尔星
- 【新要闻】《西之绝境》DLC即将发售 4月19日前预购可获特典
- 环球新消息丨MediaTek 发布Dimensity Auto天玑汽车平台 赋能智能汽车科技创新
- 一加联动原神推出一加Ace 2原神定制礼盒 18GB+512GB售价3699元
- 欧冠1/4决赛次回合:米兰客战那波利,如何阻止奥斯梅恩,确保晋级-当前独家
- 全球实时:《黑豹2》网播定档5月6日:漫威最差开画、豆瓣仅5.4
- 焦点消息!59岁童心未泯!小岛秀夫欢乐游览迪士尼乐园
- 【游点东西】万物皆喵,万事皆允 《刺客信条》官方猫咪潮玩手办上线游民商城!
- 精彩看点:华为发布MateBook D 14超联接笔记本 搭载第13代酷睿®处理器售价5099元起
- 据说OMEN暗影精灵 9才是玩家心中再来亿把的高性价比之王?
- ?TCL华星解读小米13Ultra屏幕,完整参数公布
- 北青:国足6月热身对手不会选亚洲强队,可能踢缅甸、巴勒斯坦
- 《王国之泪》心之容器周边开启预定!售价196元
- 世界观点:5款游戏月末离开XGP:《DQ:创始小玩家2》等
- 国产顶级豪华!新一代红旗L5实车曝光:气场无敌-世界快资讯
- 环球今日报丨阿根廷照明展完美落幕,洲明科技闪耀全场!
- 399元!1TB ZHITAI 致态 TiPlus5000固态硬盘开车|全球观速讯
- 一文看完华为nova 11系列发布会,超十款产品,百元起售
- 全球即时看!华为Matebook D 16大屏轻薄本新品发布,最高搭载13代酷睿i9处理器
- 机械革命蛟龙16 Pro性能曝光,顶配锐龙9 7945HX处理器