判定一个点是否包含在一个任意朝向椭圆内的基本几何算法(as3源码)
一个圆,沿着y轴压扁后,就变为一个椭圆了(可能只是类椭圆)
圆很常见,判定一个点是否包含在一个圆中很简单:只要判定此点距离圆心的距离是否小于圆的半径即可
椭圆虽是圆的"变种"(或者反过来说原始椭圆的特例),但是判定一个点是否在一个椭圆内,就不是这么方便了。
这给出的方法是判定一个点是否包含在一个任意朝向椭圆内的基本算法
沿y轴将圆压扁成为椭圆, 就相当于沿y轴将坐标空间压缩了
而椭圆的旋转就相当于坐标空间旋转了,废话就不说了,请看flash示例:
点击这个flash中椭圆附近的位置可做包含测试
检测方法as3源码如下:
//
/**
* @param px 待检测点x坐标
* @param py 待检测点y坐标
* @param cx 椭圆中心点x坐标
* @param cy 椭圆中心点y坐标
* (px,py) 与 (cx,cy) 位于同一坐标空间
*
* @param r 椭圆的最大半径(实际就是将圆沿y轴压扁变为椭圆的源圆的半径)
* @param sy 将圆沿y轴压扁变为椭圆时候的比例
* @param rad 椭圆旋转的角度
* */
private function containsXY(px:Number, py:Number, cx:Number, cy:Number, r:Number, sy:Number = 1.0,rad:Number = 0.0):Boolean {
// 旋转坐标空间
var tv:Vector_2D = new Vector_2D(px - cx, py - cy);
tv.rotate( -rad);
// 缩放坐标空间
tv.y /= sy;
if (tv.magnitude() < r) {
return true;
}
return false;
}
/**
* @param px 待检测点x坐标
* @param py 待检测点y坐标
* @param cx 椭圆中心点x坐标
* @param cy 椭圆中心点y坐标
* (px,py) 与 (cx,cy) 位于同一坐标空间
*
* @param r 椭圆的最大半径(实际就是将圆沿y轴压扁变为椭圆的源圆的半径)
* @param sy 将圆沿y轴压扁变为椭圆时候的比例
* @param rad 椭圆旋转的角度
* */
private function containsXY(px:Number, py:Number, cx:Number, cy:Number, r:Number, sy:Number = 1.0,rad:Number = 0.0):Boolean {
// 旋转坐标空间
var tv:Vector_2D = new Vector_2D(px - cx, py - cy);
tv.rotate( -rad);
// 缩放坐标空间
tv.y /= sy;
if (tv.magnitude() < r) {
return true;
}
return false;
}
此方法中的Vector_2d请见:http://www.cnblogs.com/vilyLei/articles/1567703.html