![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
А зачем их копировать из картинки в массив, чтобы потом в другую картинку вставлять? Не проще напрямую getPixel из одной и setPixel в другую?
|
|
|||||
|
Я пикселы храню в массиве ,чтобы потом генерить случайные эл-ты массива содержащие инфу о пикселах ,вставлять их в битмапДату и удалять эти эл-ты из массива , чтобы не сгенерить их повторно. во
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Всё, у меня вывих мозга.
|
|
|||||
|
Ух ты убираешь: this.myarray.splice(pixelNumber-1,1);
и производительность в раз 5 возрастает |
|
|||||
|
теперь вопрос:как избежать повторения пикселов?
|
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Цитата:
// массив с точками
var ar:Array = new Array();
// размеры картинки
var bitmapWidth:Number = 100;
var bitmapHeight:Number = 100;
// собираем в массив координаты всех точек
for (var i:Number=0; i<bitmapHeight; i++) {
for (var j:Number=0; j<bitmapWidth; j++) ar.push(new Point(j, i));
}
// перетасовываем массив по алгоритму Fisher-Yates
var a:Number = ar.length;
var b:Point, c:Number;
while(a--) {
c = Math.floor(Math.random()*(a+1));
b = ar[c];
ar[c] = ar[a];
ar[a] = b;
};
// Тестируем что получилось
// Сделаем текстовые картинки
var myBitmapData:BitmapData = new BitmapData(bitmapWidth, bitmapHeight, false, 0xFF0000);
var resultBitmapData:BitmapData = new BitmapData(bitmapWidth, bitmapHeight, false, 0xFF);
addChild(new Bitmap(resultBitmapData))
// выводим случайные точки по enterFrame
addEventListener(Event.ENTER_FRAME, onDraw);
function onDraw(e:Event):void {
var n:int = 200; // выводим 200 точек
while (n-- && ar.length) {
// берем следующую точку
var pixel:Point = ar.pop();
// рисуем ее
trace("Draw:", pixel.x, pixel.y);
resultBitmapData.setPixel(pixel.x, pixel.y, myBitmapData.getPixel(pixel.x, pixel.y));
}
}
|
|
|||||
|
Цитата:
var n:int = 200; // выводим 200 точек
while (n-- && ar.length) {
// берем следующую точку
var pixel:Point = ar.pop();
в идеале для скорости было красиво просто хранить начальный индекс в массиве и количество выводимых точек. var currentPos : number = 0;
........
var countPoint : number = ((currentPos+200)> ar.length) ? 200 : ar.length-currentPos
var pixel:Point;
while (countPoint >0) {
pixel = ar[countPoint + currentPos ];
trace("Draw:", pixel.x, pixel.y);
resultBitmapData.setPixel(pixel.x, pixel.y, myBitmapData.getPixel(pixel.x, pixel.y));
countPoint--;
}
currentPos+=countPoint ;
if (currentPos>ar.length) trace ("the end");
)
__________________
33 коровы Последний раз редактировалось __i; 28.11.2006 в 19:57. |
|
|||||
|
юзайте byteArray для хранения больших массивов чисел - там сумасшедшая скорость....
|
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
byteArray действительно быстрее, но в данном случае сомнительно его применение. Как красиво и быстро перетасовать поток байтов я не представляю.
Если говорить об оптимизации, то следует еще при копировании точек лочить битмап: P.S. Кстати, можно устроить соревнование на создание наиболее быстрого алгоритма для решения этой задачи, есть желающие? ![]() |
|
|||||
|
Цитата:
![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:39. |
|
|
« Предыдущая тема | Следующая тема » |
|
|