Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Расстояние до фигуры (http://www.flasher.ru/forum/showthread.php?t=208367)

faraday 07.07.2014 14:14

Вот рабочий вариант кода, по предложению gloomyBrain
для realTime расчета конечно плохо подходит, но для статики самое то. Ёлочкин вариант, так же упирается в количество выпущенных лучшей из точки, так что решил не экономить на спичках.
Код AS3:

function minDistance(point:Point,figure:DisplayObject):Point{
var bmp:BitmapData=new BitmapData(figure.width,figure.height,true,0xffffff);
var minDist:int=int.MAX_VALUE;
var endPoint:Point=new Point();
bmp.draw(figure);
for (var _x:int=0;_x<bmp.width;_x++)
for (var _y:int=0;_y<bmp.height;_y++)
if((bmp.getPixel32(_x,_y)>> 24 & 0xFF).toString(16)=='ff'){
var curDist:int=Math.sqrt(Math.pow(figure.x+_x - point.x, 2) + Math.pow(figure.y+_y - point.y, 2));
if (minDist>curDist) {minDist=curDist; endPoint.x=figure.x+_x; endPoint.y=figure.y+_y;}
}
return endPoint;
}


nubideus 08.07.2014 03:14

faraday,
Код AS3:

var point:Point = new Point(400, 400);
var endPoint:Point = new Point();
var minSqLen:Number = Infinity;
var vector:Vector.<uint> = bmd.getVector(bmd.rect);
var len:uint = vector.length;
var width:uint = bmd.width;
for (var i:uint = 0; i < len; i++) {
  if(vector[i] > 0x00FFFFFF){
        var x:uint = i % width;
        var y:uint = i / width | 0;
        var sqLen:Number = (point.x - x) * (point.x - x) + (point.y - y) * (point.y - y);
        if(minSqLen > sqLen){
          minSqLen = sqLen;
          endPoint.setTo(x, y);
        }
  }
}

если фигуры только векторные, то там можно вектор преобразовывать в полигоны, но это сложно. (если фигуры такие, как в 6 посту(только заливка, без линий и прочего), то не сложно)


Часовой пояс GMT +4, время: 02:57.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.