Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.02.2008, 12:40
lexa2000lexa вне форума Посмотреть профиль Отправить личное сообщение для lexa2000lexa Найти все сообщения от lexa2000lexa
  № 1  
Ответить с цитированием
lexa2000lexa

Регистрация: Sep 2005
Сообщений: 950
По умолчанию Помогите оптимизировать.

Доброго времени суток всем...
Сталкнулся с такой проблемой, пытаюся нарисовать эквипотинциальные поверхности от положительных и отрицательных зарядов в количестве от 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);
							}
						}
				}
			}
			
	}
}

Старый 05.02.2008, 10:31
CorC вне форума Посмотреть профиль Отправить личное сообщение для CorC Найти все сообщения от CorC
  № 2  
Ответить с цитированием
CorC
 
Аватар для CorC

Регистрация: Jul 2006
Адрес: Земля>Россия>Вологда
Сообщений: 3,056
Отправить сообщение для CorC с помощью ICQ Отправить сообщение для CorC с помощью MSN Отправить сообщение для CorC с помощью Skype™
А что вы хотели? 620*620*20 цикл и сетПиксел
__________________
"We Are The Champions My Friends!" Queen

Старый 05.02.2008, 10:46
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 3  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

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

Старый 05.02.2008, 11:33
lexa2000lexa вне форума Посмотреть профиль Отправить личное сообщение для lexa2000lexa Найти все сообщения от lexa2000lexa
  № 4  
Ответить с цитированием
lexa2000lexa

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

Старый 05.02.2008, 12:51
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 5  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Внимательно прочитайте мой пост ещё раз.
У вас значение n от 0 до 620. Зачем вы пересчитываете разницу (50-n) 384400 раз вместо 620?

Старый 06.02.2008, 10:45
lexa2000lexa вне форума Посмотреть профиль Отправить личное сообщение для lexa2000lexa Найти все сообщения от lexa2000lexa
  № 6  
Ответить с цитированием
lexa2000lexa

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

Старый 06.02.2008, 11:29
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 7  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Код:
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);
					}
				}
			}
		}
	}
}
так рисует до конца. затык тут конечно в количестве итераций и ничего тут не попишешь.
попробуйте исключить из прорисовки "дальние" от зарядов области, где значения потенциалов заведомо "малы", т.е. чтобы в этих областях не просчитывать потенциалы и не отображать их на экране, ибо все равно там пусто будет.
характер задачи изначально предполагает большое количество вычислений. насколько я знаю подобные вычислительные задачи в случае сложного распределения зарядов решаются "штучно", т.е. на мощном компе и изредка при острой необходимости.


Последний раз редактировалось alexcon314; 06.02.2008 в 12:09.
Старый 06.02.2008, 12:45
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 8  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
lexa2000lexa, запятые придумали для того, чтобы удобнее было читать, а не для того, чтобы их пропускали.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 06.02.2008, 14:03
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 9  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Код:
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();


Последний раз редактировалось etc; 06.02.2008 в 14:16.
Старый 06.02.2008, 15:11
lexa2000lexa вне форума Посмотреть профиль Отправить личное сообщение для lexa2000lexa Найти все сообщения от lexa2000lexa
  № 10  
Ответить с цитированием
lexa2000lexa

Регистрация: Sep 2005
Сообщений: 950
Спасибо огромное за помошь.....

Создать новую тему Ответ Часовой пояс GMT +4, время: 04:57.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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