Поиск:

Ответ в темуСоздание новой темы Создание опроса
> отрисовка графиков на pictureBox, медленно, и есть пробелы между точками 
:(
    Опции темы
maxi91m
Дата 1.11.2009, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Написал программу распозвнования выражений, 
Строю графики различных функций, но для построения делаю много итераций из за чего график рисуется медленно, кто может подскажет как ускорить.

Вот так я вывожу
Код

    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
                    int n=textBox1->TextLength;
                    int len;
                    Pen^ pen;
                    switch(cl++)
                    {
                        case 0:cr = Color::Black; break;
                        case 1: cr = Color::DarkGray;    break;
                        case 2: cr = Color::Blue;    break;
                        case 3: cr = Color::Brown;    break;
                        case 4: cr = Color::Red;    break;
                        case 5: cr = Color::Green;    break;
                        case 6: cr = Color::Pink;    break;
                        default: 
                            {
                                cl=0;
                                cr = Color::Black;
                            }
                    }
                    pen = gcnew Pen(cr, 1);

                    char* str = new char[n];
                    char* str1 = new char[2*n];
                    for(int i=0; i<n; i++)
                        str[i]=Convert::ToChar(textBox1->Text[i]);

                    if(check(str,n))
                    {
                    translate_str(str,str1,n,len);
                    for(double i=-10;i<10;i+=0.001)
                      try{
                          pictureBox1->CreateGraphics()->DrawRectangle(pen,30*i+290,-30*solution(str1,len,i)+200,1,1);
                      }
                      catch(...){
                          if(i==0.0) 
                            { //деление на ноль
                                i+=0.001;
                                 pictureBox1->CreateGraphics()->DrawRectangle(pen,30*i+290,-30*solution(str1,len,i)+200,1,1);
                            }
                            else if(i<0) {//обработка отрицательных чисел для корня
                                i=0.00000001;
                             pictureBox1->CreateGraphics()->DrawRectangle(pen,30*i+290,-30*solution(str1,len,i)+200,1,1);
                            }
                     }
                    }else
                        MessageBox::Show("Ошибка","Некоректно заанна выражение",MessageBoxButtons::OK);
                  
             }

Если мало итераций то пропуски
  for(double i=-10;i<10;i+=0.01)//вот при таких условиях
user posted image

--------------------
PM MAIL ICQ   Вверх
GremlinProg
Дата 1.11.2009, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 1
Всего: 106



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

если у тебя строятся произвольные графики, то здесь расчет координат "простым проходом луча" не поможет,
смотри алгоритмы по растеризации,

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

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

Добавлено через 10 минут и 4 секунды
Цитата(GremlinProg @  1.11.2009,  03:15 Найти цитируемый пост)
если разница ординат между двумя последними итерациями меньше единицы

конечно, это с учетом шага = 1

Добавлено через 14 минут и 39 секунд
Цитата(GremlinProg @  1.11.2009,  03:15 Найти цитируемый пост)
меньше единицы

больше )


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
maxi91m
Дата 1.11.2009, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Это уже будет  увесистая программа посчет алгоритмов, да и при замени осей я так думаю придется переходить к обратной функции, ну или как- то еще измудряться.
А можно как нибуть строить ввиде прямых которые будут соеденять 2 точки, пред идущею и новую?
Как еще можно туда подкрутить что то вроде осей с цифирками?
--------------------
PM MAIL ICQ   Вверх
GremlinProg
Дата 1.11.2009, 01:44 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 1
Всего: 106



конечно можно,
просто замени DrawRectangle на DrawLine либо на LineTo и т.п.,
при использовании LineTo, поставь один вызов MoveTo на первую точку перед циклом

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
maxi91m
Дата 1.11.2009, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



А почему не исчезнут то, прямая тогда же станет целостной кривой?
--------------------
PM MAIL ICQ   Вверх
GremlinProg
Дата 1.11.2009, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 1
Всего: 106



да, но крутые повороты эта прямая будет срезать точно так же, как и точечный вариант
только это будет нагляднее


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
maxi91m
Дата 1.11.2009, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



А может где есть уже реализованные методы отрисовки таких функций? Где уже все утчтено.
--------------------
PM MAIL ICQ   Вверх
GremlinProg
Дата 6.11.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 1
Всего: 106



обрати внимание на эту тему: http://forum.vingrad.ru/forum/topic-278955...анных-окно.html
сплайны - как раз то, что подходит для таких непредсказуемых функций


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0481 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.