Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

Вернуться   Форум программистов > Delphi > Паскаль
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 30.10.2006, 15:17   #1
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Адрес: Химки
Сообщений: 13,564
Репутация: 2756
По умолчанию рисование изолиний

перенесено со старого форума. сообщение от Юдифь.

Добрый день!
Уважаемые эксперты, не подскажете, как на Паскале реализовать алгоритм рисования изолиний (линий уровня) и траектории спуска в точку экстремума для квадратичной функции двух переменных? Вернее, траекторию спуска я себе представляю, как нарисовать, а вот с линиями уровня проблема.

перенесено со старого форума. сообщение от pascal65536.

Насколько я понимаю, функция 2х переменных это уже 3D?

перенесено со старого форума. сообщение от Юдифь.

Да, это функция в простанстве, но мне нужны именно линии уровня. Вот определение:
**************************
Линией уровня функции двух переменных называется линия на плоскости XOY, принадлежащая D(z), в каждой точке которой функция принимает одно и то же значение.
Уравнение линии уровня: f(x, y)=c, где с - произвольное число. На данной линии уровня значение функции z=c. Линий уровня бесконечно много, и через каждую точку области определения можно провести линию уровня.
**************************

Должна получиться вот такая картинка .

перенесено со старого форума. сообщение от zetrix.

Можно в лоб решать: перебирать все x,y и проверять f(x,y)=c

перенесено со старого форума. сообщение от pascal65536.

Ну, блин, тут надо уравнение решать.
Перебором, я думаю не пойдёт, а вот метод хорд или Ньютона в самый раз.

перенесено со старого форума. сообщение от Юдифь.

Добрый день!
Большое спасибо за ответы. У меня получилось дойти до функции одной переменной. Но тут возникла другая проблема:
Получилась квадратная функция, которую я пыталась решить методом хорд и дихотомии. Но оба эти метода находят лишь один корень на отрезке. А мне нужны оба. Можно, конечно, решить через дисриминант, но квадратное уравнение уравнение получилось лишь в моем случае, а в общем случае может получиться любое. Как мне быть?

перенесено со старого форума. сообщение от zetrix.

Хм... Может в прошлом моём сообщении я как-то непонятно сказал... Ну график ты как строишь? по точкам. Вот у тебя разрешение экрана допустим 640х480. Берём 2 цикла вложенных по x и y, и перебираем их по разрешению:

for y:=1 to 480 do
for x:=1 to 640 do
begin
// здесь мы проверяем f(x,y)=c если равно, то на экране отображаем точку (x,y), если не равно, то ничего не делаем.
end;

Может этот метод не годится, т.к. он достаточно долгий, но это всё же вариант...

перенесено со старого форума. сообщение от Юдифь .


Твой вариант не годится. Дело в том, что функция дана такая: 4*x^2+4*x*y+6*y^2-17*x.
Приравниваю я ее к 1 (например), решение: x=3,4....., y=-4.06.....
То есть очень приблизительно. А ты мне предлагаешь через For, где шаг равен единице. То есть ни однй точки подходящей я не найду.

перенесено со старого форума. сообщение от pascal65536.

Как-то так.

uses graph;



const zoom = 100;



var x,y,w : Real;

grDriver : Integer;

grMode : Integer;

I,J : Integer;

Color : Byte;





function f(x,y : real):real;

begin

f:=4*x*x+4*x*y+6*y*y-17*x;

end;



begin

w := 1/zoom;



grDriver := Detect;

InitGraph(grDriver,grMode,'c:\tp\bg i\');



For I := 0 To GetMaxX Do

Begin

For J := 0 To GetMaxY Do

Begin

X := (GetMaxX/2-I)/zoom;

Y := (GetMaxY/2-J)/zoom;

Color := Round(f(x,y));



If ((X > -w) And (X < w))

Or ((Y > -w) And (Y < w))

Then Color := 0;



PutPixel(I, J, Color);

End;

End;

readln;

CloseGraph;



end.

перенесено со старого форума. сообщение от Юдифь.

Огромное спасибо!
Только я поменяла три строчки в Вашем коде, чтобы изолинии были повернуты куда надо:
...
X := (I-GetMaxX/2)/zoom;
Y := (J-GetMaxY/2)/zoom;
....
PutPixel(I,GetMaxY-J,Color);
Alar на форуме   Ответить с цитированием
Ответ

Опции темы

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

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование квадрата KocT9 Assembler 10 22.10.2014 11:58
JavaScript :: Рисование beginner JavaScript, Ajax 7 11.08.2008 11:32
рисование на форме Kostua Помощь студентам 2 26.07.2008 16:24
рисование в TImage Rusl92 Общие вопросы Delphi 8 02.05.2008 20:23
Рисование... HunterMan Win Api 10 30.04.2008 23:46


23:52.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru