Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Построение графика функции двух переменных, какая идея реализации 
:(
    Опции темы
w1zard350
Дата 24.2.2010, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 4.5.2009

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



Здравствуйте!  smile 

Функции я представляю в виде:
Код

double f1(double x, double y)
{
    return x*x-y;
}

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

while(x < endInterval)
{
    y = f(x);
    lineTo(x,y);
    x+=0.01;
}

Как видно, тут обычная зависимость значения от переменной X и не более. f - указатель на ту самую функцию одной переменной.

Когда дело дошло до функции двух переменных я чето задумался. Получается мы не высчитываем никакой зависимости, нам просто нужно передавать туда две координаты и проверять их на 0 ? Тогда это получается охренительно ресурсозатратно:
Код

eps = 0.001;
while(x < endIntervalX)
{
    y = 0;
    while(y < endIntervalY)
    {
        if(f(x,y) < eps)
            lineTo(x,y);
        y+=0.01;
    }
    x+=0.01;
}

Вариант выразить зависимость вручную отпадает, т.к. необходима возможность построения графика вида: x^2 + y^2 = 1
Графическая библиотека гипотетическая. Жду с нетерпением любой мысли в нужную сторону. Горю желанием решить эту задачу =)) Спасибо.
PM MAIL   Вверх
17dufa
Дата 24.2.2010, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

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



правильно ли я понял, что нужно нарисовать график f(x,y)=0?

особых идей нет, но что точно - рисовать подобное при помощи такого LineTo точно нельзя, херь получится. внутри if ты будешь получать точки (x,y) но вот в каком порядке их стоит соединить lineTo - это совершенно неочевидно. 
да и if достаточно спорный. если функция непрерывная, лучше проверять на то, что функция меняет знак, что-то типа:
if (f(x,y)*f(x+dx,y) < 0 || f(x,y)*f(x,y+dy)<0 || f(x,y)*f(x+dx,y+dy)<0)

Это сообщение отредактировал(а) 17dufa - 24.2.2010, 13:22
PM MAIL   Вверх
Static
Дата 24.2.2010, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

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



w1zard350, если вдруг не знаешь - то функция 2-х переменных - это не линия. Это поверхность. Т.е. зависимость сохраняется (куда ж ей деться-то?) - просто график функции строится в трехмерном пространстве.
Есть координаты x, y, z.
z = x*x-y;
Вот по ним и рисуется.
--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
chaos
Дата 24.2.2010, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



w1zard350, в книге
user posted image
есть пример реализации

PM WWW   Вверх
w1zard350
Дата 25.2.2010, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 4.5.2009

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



17dufa
Да, все верно. Именно f(x,y)=0. LineTo не катит, согласен, я выше написал вприкидку, особо не думая. Я даже не рассматривал вариант использовать такой подход. Насчет вашего условия не понял =( 
Мое условие f(x,y) < eps означало то, мы не сравниваем напрямую с нулем, т.к. мы имеем дело с компьютером, у которого ограниченная разрядность и нужно рисовать с определенной точностью. Если я делал f(x,y) =0 - никогда такого бы не было.

Static
Зачем вы мне говорите о функции двух переменных? Люди, которые не знают что это такое обычно не пытаются с подобным работать. Вы просто невнимательно прочли мое сообщение, а там я имел ввиду именно выражение f(x,y) = 0. Мы рассматриваем это в двухмерном пространстве.

chaos
Спасибо, сейчас гляну! =)

Это сообщение отредактировал(а) w1zard350 - 25.2.2010, 15:41
PM MAIL   Вверх
17dufa
Дата 25.2.2010, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

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



w1zard350, ну почему с равенством на 0 сравнивать некорректно я знаю. Но и предложенный if на мой взгляд недостаточно хорош, чисто математически ты будешь получать некое "облако" точек вокруг реального графика, фишка в том, что это "облако" может оказаться слишком широким, получишь слишком много точек вокруг реального графика. лучше сравнивать не на то, что функция в заданной точке "достаточно мала", а на то, что функция при переходе от заданной точки (x,y) к следующей (x+dx,y) или (x,y+dy) ну или (x+dx, y+dy) меняет знак. именно эту смену знака я попытался отразить в своем варианте if.
в общем, читай умную книжку, потом напишешь что получилось.
PM MAIL   Вверх
bilbobagginz
Дата 25.2.2010, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



Цитата(17dufa @  25.2.2010,  16:44 Найти цитируемый пост)
w1zard350, ну почему с равенством на 0 сравнивать некорректно я знаю. Но и предложенный if на мой взгляд недостаточно хорош, чисто математически ты будешь получать некое "облако" точек вокруг реального графика, фишка в том, что это "облако" может оказаться слишком широким, получишь слишком много точек вокруг реального графика.

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

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





--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
17dufa
Дата 26.2.2010, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

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



bilbobagginz, исчо раз: почему нужен eps а не сравнение с 0 - я понимаю.
насчет изменчивости - выбор сетки как раз позволит отловить переходы через 0. 
а такой пример (для простоты функция одного переменного) 1/x = 0. пусть eps = 0.001 это значит что данная проверка для всех x>1000 будет выдавать, что этот x - корень, что несколько некорректно все-таки.
PM MAIL   Вверх
w1zard350
Дата 7.3.2010, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 4.5.2009

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



Пока что решил разбивать функцию на две части и рисую эти графики отдельно. 
PM MAIL   Вверх
Peter
Дата 7.3.2010, 20:12 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Присоединённый файл ( Кол-во скачиваний: 47 )
Присоединённый файл  7apps.zip 2,16 Kb


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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