Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Помогите оптимизировать. (http://www.flasher.ru/forum/showthread.php?t=107549)

lexa2000lexa 04.02.2008 12:40

Помогите оптимизировать.
 
Доброго времени суток всем...
Сталкнулся с такой проблемой, пытаюся нарисовать эквипотинциальные поверхности от положительных и отрицательных зарядов в количестве от 2х до 5ти зарядов, но сталкнулся с такой проблемой ни возможности даждаться прорисовки картинки до конца..
вот код , может ктонить сталькивалься с такой проблемой и сможет помочь.
Код:

import flash.display.BitmapData;
var myBitmapData:BitmapData = new BitmapData(620,620, false, 0x00ffffff);
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(myBitmapData, this.getNextHighestDepth());
function potential() {
        E = F =0;
                        for (var n = 0; n<620; n++){
                                for(var m = 0; m<620; m++){
                                        array_distance1 = Math.sqrt((50-n)*(50-n)+(25-m)*(25-m));
                                        array_distance2 = Math.sqrt((190-n)*(190-n)+(150-m)*(150-m));
                                        array_distance3 = Math.sqrt((150-n)*(150-n)+(100-m)*(100-m));
                                        array_distance4 = Math.sqrt((70-n)*(70-n)+(190-m)*(190-m));
                                        E = Math.round(10*(500/array_distance1-500/array_distance2+100/array_distance3+300/array_distance4))/10;
                                        lmax = 20;
                                        if(E<15&&E>-20){
                                                for (var j = 1; j<=20 ;j++){
                                                lmax -=2;
                                                        if(E>=lmax&&E<=lmax+0.1){
                                                                myBitmapData.setPixel(n,m,0xff000000);
                                                        }
                                                }
                                }
                        }
                       
        }
}


CorC 05.02.2008 10:31

А что вы хотели? 620*620*20 цикл и сетПиксел

etc 05.02.2008 10:46

У вас постоянные вычисления констант, зачем?
Разницу 50-n и подобные можно было посчитать заранее для всех значений n один раз, а не пересчитывать по 620 раз за один проход.
Можно ещё повесить отрисовку на setInterval по столбцу за итерацию.

lexa2000lexa 05.02.2008 11:33

Цитата:

Сообщение от __etc
Разницу 50-n и подобные можно было посчитать заранее для всех значений n один раз, а не пересчитывать по 620 раз за один проход.

проблемма в том что это как пример и значения пита 50 это есть иксовая кордината заряда , и она может меняться в зависимости от расположения заряда на экране.

etc 05.02.2008 12:51

Внимательно прочитайте мой пост ещё раз.
У вас значение n от 0 до 620. Зачем вы пересчитываете разницу (50-n) 384400 раз вместо 620?

lexa2000lexa 06.02.2008 10:45

Извините конечно за глупый вопрос но как мен потом в далнейшем посчитать гипатинузы если я посчитаю составляющие катетов не в циклах???
если можно то покажите на примере........

alexcon314 06.02.2008 11:29

Код:

function potential() {
        E = F = 0;
        for (var n = 0; n < 620; n = n + 3) {
                var n1 = 50 - n;
                var n2 = 190 - n;
                var n3 = 150 - n;
                var n4 = 70 - n;
                for (var m = 0; m < 620; m = m + 3) {
                        array_distance1 = Math.sqrt((n1) * (n1) + (25 - m) * (25 - m));
                        array_distance2 = Math.sqrt((n2) * (n2) + (150 - m) * (150 - m));
                        array_distance3 = Math.sqrt((n3) * (n3) + (100 - m) * (100 - m));
                        array_distance4 = Math.sqrt((n4) * (n4) + (190 - m) * (190 - m));
                        E = Math.round(10 * (500 / array_distance1 - 500 / array_distance2 + 100 / array_distance3 + 300 / array_distance4)) / 10;
                        lmax = 20;
                        if (E < 15 && E > -20) {
                                for (var j = 1; j <= 20; j++) {
                                        lmax -= 2;
                                        if (E >= lmax && E <= lmax + 0.1) {
                                                myBitmapData.setPixel(n, m, 0xff0000);
                                        }
                                }
                        }
                }
        }
}

так рисует до конца. затык тут конечно в количестве итераций и ничего тут не попишешь.
попробуйте исключить из прорисовки "дальние" от зарядов области, где значения потенциалов заведомо "малы", т.е. чтобы в этих областях не просчитывать потенциалы и не отображать их на экране, ибо все равно там пусто будет.
характер задачи изначально предполагает большое количество вычислений. насколько я знаю подобные вычислительные задачи в случае сложного распределения зарядов решаются "штучно", т.е. на мощном компе и изредка при острой необходимости.

iNils 06.02.2008 12:45

lexa2000lexa, запятые придумали для того, чтобы удобнее было читать, а не для того, чтобы их пропускали.

etc 06.02.2008 14:03

Код:

import flash.display.BitmapData;
var myBitmapData:BitmapData = new BitmapData(620,620, false, 0x00ffffff);
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(myBitmapData, this.getNextHighestDepth());
function precalc() {
        arr0 = [];
        arr1 = [];
        arr2 = [];
        arr3 = [];
        arr4 = [];
        arr5 = [];
        for (n = 0;n < 620;n++) {
                var value0 = 50-n;
                var value1 = 25-n;
                var value2 = 190-n;
                var value3 = 150-n;
                var value4 = 100-n;
                var value5 = 70-n;
                arr0[n] = value0*value0;
                arr1[n] = value1*value1;
                arr2[n] = value2*value2;
                arr3[n] = value3*value3;
                arr4[n] = value4*value4;
                arr5[n] = value5*value5;
        }
}
function potential() {
        precalc();
        E = F = n = 0;
        id = setInterval(this,'cycle',0);
}
function cycle() {
        var a = n+3;
        a = a > 620 ? 620 : a;
        for (;n<a;n++) {
                for(var m = 0; m<620; m++){
                        array_distance1 = Math.sqrt(arr0[n]+arr1[m]);
                        array_distance2 = Math.sqrt(arr2[n]+arr3[m]);
                        array_distance3 = Math.sqrt(arr3[n]+arr4[m]);
                        array_distance4 = Math.sqrt(arr5[n]+arr2[m]);
                        E = Math.round(10*(500/array_distance1-500/array_distance2+100/array_distance3+300/array_distance4))/10;
                        lmax = 20;
                        if(E<15&&E>-20){
                                for (var j = 1; j<=20 ;j++){
                                lmax -=2;
                                        if(E>=lmax&&E<=lmax+0.1){
                                                myBitmapData.setPixel(n,m,0xff000000);
                                        }
                                }
                        }
                }
        }
        if (a>=620) {
                clearInterval(id);
        }
}
potential();

Хотя бы так.

UPD: Вариант на AS3 существенно быстрее:

Код:

var myBitmapData:BitmapData = new BitmapData(620,620, false, 0x00ffffff);
addChild(new Bitmap(myBitmapData));
var arr0:Array;
var arr1:Array;
var arr2:Array;
var arr3:Array;
var arr4:Array;
var arr5:Array;
var n:uint;
var m:uint;
var lmax:Number = 20;
var id:uint;
var E:Number;
var F:Number;
var array_distance1:Number;
var array_distance2:Number;
var array_distance3:Number;
var array_distance4:Number;
function precalc() {
        arr0 = [];
        arr1 = [];
        arr2 = [];
        arr3 = [];
        arr4 = [];
        arr5 = [];
        for (n = 0;n < 620;n+=1) {
                var value0:int = 50-n;
                var value1:int = 25-n;
                var value2:int = 190-n;
                var value3:int = 150-n;
                var value4:int = 100-n;
                var value5:int = 70-n;
                arr0[n] = value0*value0;
                arr1[n] = value1*value1;
                arr2[n] = value2*value2;
                arr3[n] = value3*value3;
                arr4[n] = value4*value4;
                arr5[n] = value5*value5;
        }
}
function potential() {
        precalc();
        E = F = n = 0;
        id = setInterval(cycle,0);
       
}
function cycle() {
        var a:uint = n+10;
        a = a > 620 ? 620 : a;
        myBitmapData.lock();
        for (;n<a;n+=1) {
               
                for(m = 0; m<620; m+=1){
                        array_distance1 = Math.sqrt(arr0[n]+arr1[m]);
                        array_distance2 = Math.sqrt(arr2[n]+arr3[m]);
                        array_distance3 = Math.sqrt(arr3[n]+arr4[m]);
                        array_distance4 = Math.sqrt(arr5[n]+arr2[m]);
                        E = Math.round(10*(500/array_distance1-500/array_distance2+100/array_distance3+300/array_distance4))/10;
                        lmax = 20;
                        if(E<15&&E>-20){
                                for (var j:uint = 0; j<20 ;j++){
                                        lmax -=2;
                                        if(E>=lmax&&E<=lmax+0.1){
                                                myBitmapData.setPixel(n,m,0xff000000);
                                        }
                                }
                        }
                }
        }
        myBitmapData.unlock();
        if (a>=620) {
                clearInterval(id);

        }
}
potential();


lexa2000lexa 06.02.2008 15:11

Спасибо огромное за помошь.....


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

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