Одна вещь, которая кажется особенно легкой в работе с Flash IDE, но с которой сложно сделать код, - это набросок органической формы. В среде IDE вы можете просто использовать инструмент inkbucket, чтобы нарисовать штрих вокруг чего-то. Использование ничего, кроме кода, кажется намного сложнее. Один из методов, который я видел, заключается в том, чтобы добавить фильтр свечения к рассматриваемой форме и просто испортить силу. Но что, если я хочу только показать схему?Рисование очертаний вокруг органических фигур
Что бы я хотел сделать, это собрать все точки, составляющие край формы, а затем просто соединить точки. На самом деле я дошел до того, что собрал все точки с быстрым и грязным сценарием обнаружения границ, который я написал. Итак, теперь у меня есть вектор всех точек, которые составляют мою форму. Как подключить их в правильной последовательности, чтобы она действительно выглядела как исходный объект?
Для тех, кто заинтересован здесь мой край сценарий обнаружения:
// Create a new sprite which we'll use for our outline
var sp:Sprite = new Sprite();
var radius:int = 50;
sp.graphics.beginFill(0x00FF00, 1);
sp.graphics.drawCircle(0, 0, radius);
sp.graphics.endFill();
sp.x = stage.stageWidth/2;
sp.y = stage.stageHeight/2;
// Create a bitmap data object to draw our vector data
var bmd:BitmapData = new BitmapData(sp.width, sp.height, true, 0);
// Use a transform matrix to translate the drawn clip so that none of its
// pixels reside in negative space. The draw method will only draw starting
// at 0,0
var mat:Matrix = new Matrix(1, 0, 0, 1, radius, radius);
bmd.draw(sp, mat);
// Pass the bitmap data to an actual bitmap
var bmp:Bitmap = new Bitmap(bmd);
// Add the bitmap to the stage
addChild(bmp);
// Grab all of the pixel data from the bitmap data object
var pixels:Vector.<uint> = bmd.getVector(bmd.rect);
// Setup a vector to hold our stroke points
var points:Vector.<Point> = new Vector.<Point>;
// Loop through all of the pixels of the bitmap data object and
// create a point instance for each pixel location that isn't
// transparent.
var l:int = pixels.length;
for(var i:int = 0; i < l; ++i)
{
// Check to see if the pixel is transparent
if(pixels[i] != 0)
{
var pt:Point;
// Check to see if the pixel is on the first or last
// row. We'll grab everything from these rows to close the outline
if(i <= bmp.width || i >= (bmp.width * bmp.height) - bmp.width)
{
pt = new Point();
pt.x = int(i % bmp.width);
pt.y = int(i/bmp.width);
points.push(pt);
continue;
}
// Check to see if the current pixel is on either extreme edge
if(int(i % bmp.width) == 0 || int(i % bmp.width) == bmp.width - 1)
{
pt = new Point();
pt.x = int(i % bmp.width);
pt.y = int(i/bmp.width);
points.push(pt);
continue;
}
// Check to see if the previous or next pixel are transparent,
// if so save the current one.
if(i > 0 && i < bmp.width * bmp.height)
{
if(pixels[i - 1] == 0 || pixels[i + 1] == 0)
{
pt = new Point();
pt.x = int(i % bmp.width);
pt.y = int(i/bmp.width);
points.push(pt);
}
}
}
}
Я тестирую код, который я использую, чтобы получить края, и, если я не сделаю что-то неправильно, похоже, это довольно быстро. Согласно тест-жгуту Гранта Скиннера он работает в 9,63 мс или 9631 мс за 1000 итераций. Буду признателен, если кто-нибудь успеет дважды проверить это. Код, который я использую, находится здесь: http://pastebin.com/s59FPGvB –
Создание эффекта в пустой растровой картинке, вероятно, ближе всего к тому, что мне нужно. Вы бы просто применили объект преобразования от исходного растрового изображения к пустому? это даже работает? –