如何判断一个点在三角形之外

本文介绍了六种判断一个点是否位于三角形内部的方法,包括面积法、射线法、夹角法、边界法、同向法及重心法。每种方法都详细解释了其原理和判断依据。

1.面积法

三角形之外的点与三角形的三个点构成的三个三角形面积要大于原来的三角形本身;


2.射线法

http://www.cnblogs.com/graphics/archive/2010/08/09/1795348.html


3.夹角法

三角形之外的点与三个点的夹角是否为 360 度,不为 360 则为 三角形之外的点;


4.边界法

三角形之外的点在三角形的三个点的一侧,三个点的两个对应坐标,(x,y),总有一个要比点的 或者都大,或者都小;


5.同向法

假设点P位于三角形内,会有这样一个规律,当我们沿着ABCA的方向在三条边上行走时,你会发现点P始终位于边AB,BC和CA的右侧。我们就利用这一点,但是如何判断一个点在线段的左侧还是右侧呢?我们可以从另一个角度来思考,当选定线段AB时,点C位于AB的右侧,同理选定BC时,点A位于BC的右侧,最后选定CA时,点B位于CA的右侧,所以当选择某一条边时,我们只需验证点P与该边所对的点在同一侧即可。问题又来了,如何判断两个点在某条线段的同一侧呢?可以通过叉积来实现,连接PA,将PA和AB做叉积,再将CA和AB做叉积,如果两个叉积的结果方向一致,那么两个点在同一测。判断两个向量的是否同向可以用点积实现,如果点积大于0,则两向量夹角是锐角,否则是钝角;


6.重心法

http://www.cnblogs.com/graphics/archive/2010/08/05/1793393.html




在 C++ 中判断个坐标点是否位于给定的三角形内,可以采用多种方法,其中种常见的做法是利用向量的叉积(Cross Product)。以下是个简单的步骤说明: 1. **确定三角形的顶点**:假设三角形有三个顶点 A(x1, y1), B(x2, y2), 和 C(x3, y3)。 2. **计算两个边对应的向量**:对于每对相邻顶点 AB = (x2 - x1, y2 - y1), BC = (x3 - x2, y3 - y2)。 3. **检查目标点 P(x, y) 是否在线段AB上**:如果点P在线段AB上,它必定在三角形内。你可以通过比较向量 AP 和 AB 的叉积与它们长度的乘积。若AP * AB == |AP| * |AB| * cos(θ),则P在线段上,其中θ是向量AP和AB之间的夹角。如果cos(θ) > 0,则P在AB左侧,反之在右侧。 4. **排除线段外的情况**:如果P不在线段AB上,计算PB的叉积并与AB的叉积做比较。同样,如果PB * AB > 0,则P在AC区域,如果PB * AB < 0,则在BC区域。 5. **第三条边**:最后,检查点P是否在AC线上并计算CP的叉积,根据结果判断P在不在三角形内。 6. **总结判断**:如果P分别满足以上三个条件之,则点P在三角形内;否则,它在三角形之外。 ```cpp bool isPointInTriangle(int x1, int y1, int x2, int y2, int x3, int y3, int px, int py) { int ax = x2 - x1; int ay = y2 - y1; int bx = x3 - x2; int by = y3 - y2; // 检查点是否在线段AB或BC上 int apx = px - x1; int apy = py - y1; if ((apx * ay - apy * ax) * (bx * ay - by * ax) <= 0 && (apx * bx + apy * by) * (ax * by - ay * bx) <= 0) return true; // 如果点不在上述两条边上,考虑第三条边AC int cpx = px - x3; int cpy = py - y3; return (apx * cpy - apy * cpx) * (bx * cpy - by * cpx) <= 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值