Просмотр полной версии : Помогите оптимизировать.
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);
}
}
}
}
}
}
А что вы хотели? 620*620*20 цикл и сетПиксел
У вас постоянные вычисления констант, зачем?
Разницу 50-n и подобные можно было посчитать заранее для всех значений n один раз, а не пересчитывать по 620 раз за один проход.
Можно ещё повесить отрисовку на setInterval по столбцу за итерацию.
lexa2000lexa
05.02.2008, 11:33
Разницу 50-n и подобные можно было посчитать заранее для всех значений n один раз, а не пересчитывать по 620 раз за один проход.
проблемма в том что это как пример и значения пита 50 это есть иксовая кордината заряда , и она может меняться в зависимости от расположения заряда на экране.
Внимательно прочитайте мой пост ещё раз.
У вас значение 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);
}
}
}
}
}
}
так рисует до конца. затык тут конечно в количестве итераций и ничего тут не попишешь.
попробуйте исключить из прорисовки "дальние" от зарядов области, где значения потенциалов заведомо "малы", т.е. чтобы в этих областях не просчитывать потенциалы и не отображать их на экране, ибо все равно там пусто будет.
характер задачи изначально предполагает большое количество вычислений. насколько я знаю подобные вычислительные задачи в случае сложного распределения зарядов решаются "штучно", т.е. на мощном компе и изредка при острой необходимости.
lexa2000lexa, запятые придумали для того, чтобы удобнее было читать, а не для того, чтобы их пропускали.
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
Спасибо огромное за помошь.....
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.