
Код:
import flash.display.BitmapData;
import flash.geom.*;
/**
* Класс BoundPoints позволяет находить координаты крайних точек объекта касающихся прямоугольной рамки описанной вокруг объекта.
*
* Точки находятся с помощью определения уровня прозрачности точек по периметру рамки описанной вокруг объекта. Все точки имеющие уровень прозрачности 1-255 считаются крайними. Однако с помощью параметра limit метода getPoints, можно задать диапазон прозрачности, в пределах которого метод будет возвращать массив точек.
*
* Поиск координат крайних точек проводится относительно самого объекта. Для преобразования координат точек в другое пространство координат, воспользуйтесь методам <code>MovieCLip.localToGlobal</code> и <code>MovieCLip.globalToLocal</code>. Также такие виды трансформации как поворот или скос не учитываются. Однако можно найти крайние точки у растрового изображение с поддержкой альфа-канала (экземпляр BitmapData), полученного из мувиклипа с учетом матрицы трансформации.
*
* @author iNils
* @version 1.0
*/
class ru.inils.object.BoundPoints extends Object {
private var __bmp:BitmapData = null;
private var __t:Array = null;
private var __b:Array = null;
private var __l:Array = null;
private var __r:Array = null;
private var __a:Array = null;
/**
* Конструктор класса.
* Создает новый экземпляр BoundPoints.
* @param mc - Мувиклип, координаты крайних точек которого надо найти.
*
* @return Ничего.
*/
function BoundPoints (mc:Object) {
__t = new Array ();
__b = new Array ();
__l = new Array ();
__r = new Array ();
__a = new Array ();
var o:Object = mc.getBounds ();
var w:Number = o.xMax - o.xMin;
var h:Number = o.yMax - o.yMin;
var tx:Number = -o.xMin;
var ty:Number = -o.yMin;
__bmp = new BitmapData (w--, h--, true, 0xFF);
__bmp.draw (mc, new Matrix (1, 0, 0, 1, tx, ty));
var mca = mc._parent.createEmptyMovieClip ("mca" + mc._parent.getNextHighestDepth (), mc._parent.getNextHighestDepth ())
mca.attachBitmap (__bmp, 0);
mca._x = mc._x;
mca._y = 300;
var alpha:Number = null;
for (var i:Number = 0; i < h + 1; i++) {
alpha = __bmp.getPixel32 (0, i) >> 24 & 0xFF;
if (alpha > 0) {
__l.push ({x:-tx, y:i - ty, level:alpha});
}
alpha = __bmp.getPixel32 (w, i) >> 24 & 0xFF;
if (alpha > 0) {
__r.push ({x:w - tx, y:i - ty, level:alpha});
}
}
for (var i:Number = 0; i < w + 1; i++) {
alpha = __bmp.getPixel32 (i, 0) >> 24 & 0xFF;
if (alpha > 0) {
__t.push ({x:i - tx, y:-ty, level:alpha});
}
alpha = __bmp.getPixel32 (i, h) >> 24 & 0xFF;
if (alpha > 0) {
__b.push ({x:i - tx, y:h - ty, level:alpha});
}
}
__t.sortOn ("level", Array.NUMERIC);
__t.reverse ();
__b.sortOn ("level", Array.NUMERIC);
__b.reverse ();
__l.sortOn ("level", Array.NUMERIC);
__l.reverse ();
__r.sortOn ("level", Array.NUMERIC);
__r.reverse ();
__a = __t.concat (__b, __l, __r);
__a.sortOn ("level", Array.NUMERIC);
__a.reverse ();
}
/**
* Метод.
* Находит координаты крайних точек для заданной стороны и уровня прозрачности, и возвращает их в виде массива объектов.
*
* @param side [дополнительный параметр] - Сторона, для которой нужно найти точки. Может принимать следующие значения: "top" (крайние верхние), "bottom" (крайние нижние), "left" (крайние левые), "right" (крайние правые) и "all" (все стороны). По умолчания используется "all".
* @param limit [дополнительный параметр] - Граница уровня прозрачности точки, в пределах которой точка считается крайней. По умолчанию выводятся все точки.
* @param useAbsolute [дополнительный параметр] - Булево значение, при <code>true<code> - показывающие надо ли использовать абсолютное значение параметра <code>limit<code>, все точки с уровнем прозрачности ниже <code>limit<code>, будут отбрасываться. При <code>false<code> - границей считается разница между уровнем прозрачностью точки с макслимальным значением и <code>limit<code>, все точки с уровнем прозрачности ниже этой разницы, будут отбрасываться. По умолчанию имеет значение <code>false<code>.
*
* @return Массив объектов со свойствами <code>x</code> (координата точки по оси X), <code>y</code> (координата точки по оси Y) и <code>level</code> (уровень прозрачности точки [1-255]).
*/
public function getPoints (side:String, limit:Number, useAbsolute:Boolean):Array {
var array:Array = null;
side = side.toLowerCase ();
switch (side) {
case "top":
array = __t;
break;
case "bottom":
array = __b;
break;
case "left":
array = __t;
break;
case "right":
array = __r;
break;
case "all":
array = __a;
break;
default:
array = __a;
}
if (limit == undefined) {
return array;
} else {
if (!useAbsolute) {
limit = array[0].level - limit;
}
var len:Number = array.length;
var id:Number = 0;
for (var i:Number = 0; i < len; i++) {
if (array[i].level < limit) {
break;
} else {
id++;
}
}
return array.slice(0, id);
}
}
}