Показать сообщение отдельно
Старый 20.04.2011, 12:59
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 1  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
По умолчанию Как работает BitmapData.hitTest?

Нужна формула, для определения того, как определяет hitTest непрозрачный (с пороговой альфой) пиксель.
Разница появляется на некоторых файлах с разным порогом альфы.
Код AS3:
package 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Point;
	import flash.text.TextField;
 
	public class Main extends Sprite 
	{
 
		[Embed(source = '../fla/sun.png')]
		private var Sun:Class;
 
		private var tf:TextField;
		private function log(text:String):void {
			tf.appendText(text + '\n');
		}
 
		public function Main() {
 
			tf = new TextField();
			tf.width = tf.height = 300;
			tf.border = true;
 
			addChild(tf);
 
			if (stage) addedToStageListener();
			else addEventListener(Event.ADDED_TO_STAGE, addedToStageListener);
		}
 
		private function addedToStageListener(event:Event = null):void {
			var pic:Bitmap = new Sun() as Bitmap;
			var bmd:BitmapData = pic.bitmapData;
			var i:int, j:int;
 
			var v:Vector.<uint> = bmd.getVector(bmd.rect);
			var k:int = 0;
			for (j = 0; j < bmd.height; j++) {
				for (i = 0; i < bmd.width; i++) {
					var thrasholdAlpha:uint = 1;
					var hitTest:Boolean = bmd.hitTest(new Point(), thrasholdAlpha, new Point(i, j));
					var hitPixel:Boolean = (v[k] >>> 24) > thrasholdAlpha;// нужна правильная формула
					                                                      // (v[k] >>> 24) >= thrasholdAlpha) дает другой эффект
					if (hitTest != hitPixel) {
						// выводим пиксель
						log('hitTest:' + String(hitTest) + ', hitPixel: ' + String(hitPixel) + ', pixel: 0x' + v[k].toString(16));
					}
					k++;
				}
			}
		}
	}
}
Изображения