博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快速检测一个点是否包含在一个2d三角形内
阅读量:5048 次
发布时间:2019-06-12

本文共 1579 字,大约阅读时间需要 5 分钟。

如下图所示:

 

由三条线段连接起来的A,B,C三个点在2d平面中构成了一个三角形。

P点位于三角形外, q点位于三角形内,那么用什么方案来判定一个任意点是否位于三角形内部呢?

 我们得找到一个规律:

假定你按照顺时针的方向从A点出发向B点前进再到C点继而在到A点,你会发现如果点在三角形内,则点一定位于你的右手,如果在三角形外的点,一定位于你的左手

ok,规律找到了,就能用实际的算法来实现。从上面的规律可以看出,三角形的三个顶点是有序的,这种结构可以保证更快速的计算

,但是也可以不用有序的结构。下面给出的代码以无序顶点来计算包含关系的:

         //

        
private 
var temp_0_v:Vector_2D = 
new Vector_2D();
        
private 
var temp_1_v:Vector_2D = 
new Vector_2D();
        
private 
var value_0:Number = 
0;
        
private 
var value_1:Number = 
0;
        
/*
*
            判定当前的三角形是否包含一个点
            @param            t    当前的任意三角形,有三个属性:t.pA_v,t.pB_v,t.pC_v,每一个属性就
                                表示一个顶点,而且都是Vector_2D对象
            @param            pos_v    需要计算的一个点的矢量表示            
        
*/
        
public function contains(t:Triangle, pos_v:Vector_2D):Boolean{
            
            
            
            
//
    计算A->P矢量叉乘A->B矢量    
            temp_0_v.x = pos_v.x - t.pA_v.x;
            temp_0_v.y = pos_v.y - t.pA_v.y;
            temp_1_v.x = t.pB_v.x - t.pA_v.x;
            temp_1_v.y = t.pB_v.y - t.pA_v.y;
            
            value_0 = temp_0_v.cross( temp_1_v );
            
            
//
    计算B->P矢量叉乘B->C矢量
            temp_0_v.x = pos_v.x - t.pB_v.x;
            temp_0_v.y = pos_v.y - t.pB_v.y;
            temp_1_v.x = t.pC_v.x - t.pB_v.x;
            temp_1_v.y = t.pC_v.y - t.pB_v.y;            
            
            value_1 = temp_0_v.cross( temp_1_v );
            
//
            
if(value_0 * value_1 < 
0){
                
return 
false;
            }
            
            
//
    计算C->P矢量叉乘C->A矢量
            temp_0_v.x = pos_v.x - t.pC_v.x;
            temp_0_v.y = pos_v.y - t.pC_v.y;
            temp_1_v.x = t.pA_v.x - t.pC_v.x;
            temp_1_v.y = t.pA_v.y - t.pC_v.y;
            
            value_0 = temp_0_v.cross( temp_1_v );
            
            
return value_0 * value_1 >= 
0;
            
        }
        
//

这分代码是我as3 2d库的一个工具类的代码片段。

如果你要用的话,注意实现:Triangle类和Vector_2D类,请见()

通过上面讲的规律,我们就能推出三角形和线段,三角形和三角形相交等的快速实现算法。

由此也可以推出凸多边形相关的算法实现。 

下面我们来聊聊三角形吧。

这里从三个角度来看三角形:

1. 三条线段连接起来的三个点在2d平面中构成了一个三角形

2.三角形可以看成是三对平行线的交集

3.三角形可以看做三个半平面的交集

后面,再来看看这三个角度带来的应用 

 

 

 

转载于:https://www.cnblogs.com/vilyLei/articles/2233786.html

你可能感兴趣的文章
自定义tabbar(纯代码)
查看>>
extjs fieldset 和 radio
查看>>
小程序底部导航栏
查看>>
Codeforces Gym101505G:Orchard Division(扫描线+线段树第k大)
查看>>
ibatis学习笔记
查看>>
18-ES6(1)
查看>>
poj1611 简单并查集
查看>>
tensorflow实现迁移学习
查看>>
Ubuntu 14.04下安装CUDA8.0
查看>>
跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
查看>>
关于Redis处理高并发
查看>>
C# BS消息推送 SignalR介绍(一)
查看>>
asp.net core 系列 16 Web主机 IWebHostBuilder
查看>>
WPF星空效果
查看>>
WPF Layout 系统概述——Arrange
查看>>
PIGOSS
查看>>
几款Http小服务器
查看>>
iOS 数组排序
查看>>
第三节
查看>>
PHP结合MYSQL记录结果分页呈现(比较实用)
查看>>