2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Линии уровня функции от 2 переменных [Delphi]
Сообщение11.04.2012, 12:48 


11/04/12
21
Здравствуйте, форумчане. Мне нужно запрограммировать нахождение линий уровня на графике в Delphi для такой функции:

$\dfrac {5 x y(x+y)}{x^2 y^2+1} + \sqrt{x^2 y^2+1}$

Понимаю, что функцию нужно приравнять к $\operatorname{const}$. Далее, как я думаю, нужно выразить одну переменную через другую. Но не получается у меня это. Может не туда копаю.
Прошу помочь определиться с выбором метода решения.
Буду благодарен за любые наводящие ответы.

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение11.04.2012, 12:57 
Админ форума
Аватара пользователя


19/03/10
8952
 i  Тема перемещена в Карантин.

Чтобы оттуда выбраться

1. Запишите формулы в соответствии с требованиями Правил форума, т.е. в $\TeX$.
Краткие инструкции можно найти здесь: topic8355.html и topic183.html.
Кроме этого, в теме Видео-пособия для начинающих форумчан можно посмотреть видео-ролик "Как записывать формулы".

2. Приведите свои попытки решения задачи и объясните, что конкретно вызывает затруднения.

После того как исправите сообщение, сообщите об этом в теме Сообщение в карантине исправлено.
________________
Всякий, кто поступил в университет, но не хочет сам учиться - враг своей страны, подрывающий ее научно-технический, интеллектуальный и оборонный потенциалы.
(c) по мотивам сообщения Yuri Gendelman.


-- Ср 11.04.12 14:48:17 --

Немного поправил формулу и вернул (пока в учебную математику).

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение11.04.2012, 15:42 


11/04/12
21
To Toucan, рассматриваемая область относится к численным методам.
Всё , тему можно закрывать.
Вдруг кому понадобится решение:
Код:
var
x,y,w : Real;
I,J : Integer;
zoom:double = 5;
colour : integer;


....................................

function TForm1.f(x,y : real):real;
begin
f:=5*(x+y)*(x*y)/(x*x*y*y+1)+sqrt(x*x*y*y+1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if (Edit1.Text<>'')and(Edit1.Text<>'Введите шаг') then
  zoom:=StrToFloat(Edit1.Text);
   w := 1/zoom;
   For I := 0 To Form1.ClientWidth Do
   Begin
      For J := 0 To Form1.ClientHeight Do
      Begin
         X := (Form1.ClientWidth/2-I)/zoom;
         Y := (Form1.ClientHeight/2-J)/zoom;
         colour := Round(f(x,y));
         If ((X > -w) And (X < w))
         Or ((Y > -w) And (Y < w))
         Then colour := 0;
         Canvas.Pixels[I, J]:= colour;
      End;
   End;
end;
....................................
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if (not(key in ['0'..'9',#8,#44])) then key:=#0;
end;


 i  Переехали в Программирование. /Toucan

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение12.04.2012, 11:49 


01/07/08
836
Киев
Hasar1n в сообщении #559011 писал(а):
рассматриваемая область относится к численным методам.
Всё , тему можно закрывать.


Уверенность очень хорошо. Очень нужное качество для менеджера. А что у вас кроме? :?:

Hasar1n в сообщении #559011 писал(а):
Вдруг кому понадобится решение


Это не решение. Это типовой "зловред". Тему закрывать рано, "не говори гоп",нужно получить оценку вашего преподавателя. С уважением,

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение12.04.2012, 14:33 


11/04/12
21
Не к численным, а к вычислительным.Извиняюсь, перепутал.
Мне не надо получать оценку, делал незнакомому человеку за спасибо, потратив целый день.
Кстати, там нужно кое-что подправить, чтобы изолинии были повернуты в нужную сторону. При проверке своего алгоритма на функции $f(z)=y^2+x-2\cdot y+1$ изолинии повёрнуты в другую сторону.
Почему "зловред"?

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение12.04.2012, 16:21 
Заслуженный участник


09/09/10
3729
Хотя бы потому, что присваивание Canvs.Pixels[I, J] := color работает настолько медленно, что это даже не смешно.
Цитата:
Note: Setting and getting individual pixels is thousands of times slower than performing graphics operations on regions. Do not use the Pixel array property to access the image pixels of a general array. For high-performance access to image pixels, see the TBitmap.ScanLine property.

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение12.04.2012, 17:12 


01/07/08
836
Киев
Hasar1n в сообщении #559306 писал(а):
Мне не надо получать оценку, делал незнакомому человеку за спасибо, потратив целый день.

Я не говорю об оценке. Я имею в виду, что у вас отсутствует связь между словесной постановкой задачи, описанием выбранного алгоритма(отсутствует напрочь) и его реализацией. Если вы делаете для кого-то одолжение, то лучше было-бы сначала самому разобраться в постановке. То что вы выставили на форум, невозможно использовать на трезвую голову. Лучше вам не заниматься программированием, во всяком случае в той области которую вы называете вычислительные методы. А под "зловредностью" вашей программы я имею в виду урон который вы можете нанести своему незнакомому человеку, пусть и за спасибо, и другим, которые будут ориентироваться на авторитет форума. Главный девиз форума "здесь нет шары". Шара кроме бесплатной работы имеет значение - плохо сделанная работа(халтура). С уважением,

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение12.04.2012, 21:37 


11/04/12
21
Joker_vD
Соглашусь с тем, что scanline работает намного быстрей. Но тут работа происходит не с Tbitmap.Canvas, а с TForm1.Canvas . Уже сделал некоторые поправки в программе, и работаю со сканлайном. Правда, все равно пока вывожу не линии уровня, а градиент, цвет которого в каждой точке определяет высоту. Но и с градиентом тоже есть нерешённые проблемы.
hurtsy
Учту дивиз форума. Постановка задачи и реализация не соответствуют. Решил задачу тупым перебором, т.к. для других методов не хватило знаний для понимания. Интересно строите мысль, сначала опуская человека по всем пунктам, а в конце, скорей всего из-за привычки, воздавая дань уважения к нему.
Если у вас есть мысли по поводу решения данной темы, описанной в заголовке, я бы с удовольствием выслушал Вас. Но пока кроме того, что я бездарь и руки у меня кривые, я, увы, ничего полезного не услышал.

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение12.04.2012, 22:12 
Заслуженный участник


09/08/09
3438
С.Петербург
Hasar1n,
обычно под задачей построения линий уровня понимают нахождение их в виде, пригодном для дальнейшей обработки, например, в виде набора полигонов. Эту задачу Ваша программа не решает. Если же Вам надо было просто каким-то образом дать представление о значениях функции в разных точках, то вопросов, естественно, нет. При этом, если работа разовая (например, для вставки растровой картинки в документ), то и вопрос производительности критического значения не имеет.

Задача построения линий уровня в "традиционном понимании" обычно решается с помощью алгоритма триангуляции Делоне

Hasar1n в сообщении #559439 писал(а):
Учту дивиз форума.
Не стоит делать поспешных выводов о "девизе форума" на основании отдельных выступлений отдельных его участников.

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение13.04.2012, 14:58 


01/07/08
836
Киев
Hasar1n в сообщении #559439 писал(а):
Если у вас есть мысли по поводу решения данной темы, описанной в заголовке, я бы с удовольствием выслушал Вас. Но пока кроме того, что я бездарь и руки у меня кривые

Я такого не писал, это Вы проявляете здоровую самокритичность да и телепатию. Предлагаю отвлечься от школярской постановки задачи.
И если это возможно отойти от
Maslov в сообщении #559457 писал(а):
Задача построения линий уровня в "традиционном понимании" обычно решается с помощью алгоритма триангуляции Делоне

За этой задачей "стоят" алгоритмы которыми мозг живого существа обрабатывает сигналы поступающие от глаз. А все что я писал ранее, я готов признать "провокацией" и готов принять участие в такой беседе.
Глаз не является ни фото, ни кино камерой, хотя бы потому, что обездвиженный глаз не воспринимает никакого изображения. В таком случае я согласен с Вашим "тему закрыть", создать её в том виде как пожелаете, мне кажется , что я никого не обидел. С уважением,

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение13.04.2012, 20:34 


11/04/12
21
Maslov
Благодарю, что откликнулись, и предложили метод решения.
Цитата:
обычно под задачей построения линий уровня понимают нахождение их в виде, пригодном для дальнейшей обработки, например, в виде набора полигонов.

Да я подумывал о том, создать 2-мерный динамич. массив точек, и анализировать пиксели-соседи и если |pixel[i,j]-pixel[i+i1,j+j1]|< epsilon (где i1, j1 могут принимать целые значения от -1 до 1), то записывать координаты пикселя в N-ую сторку массива, если |pixel[i,j]-pixel[i+i1,j+j1]|> epsilon, то создавать N+1 строку массива и записывать точку туда. Если поэкспериментировать на разных функциях и создавать массивы, чтобы первый эл-нт j-той строки массива был равен последнему, то мы получали замкнутое пространство, другими словами набор полигонов. Но получается очень медленный алгоритм и также все это будет осуществляться методом проб и ошибок. Наверно придётся отказаться.
Так же нашёл книгу "Скворцов А. В. Триангуляция Делоне и её применение.", где рассматривается построение изолиний. Попробую почитать, но вот с матаном у меня проблемы.
hurtsy
Смысл вашего последнего комментария заключает в себе лишь отказ от метода, предложенного Максимом Масловым.
Но так и не было предложений каких-либо других решений. Мне кажется, что вы намекаете бросить эту затею. Также думаю, что незачем плодить одинаковые по смыслу темы.

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение13.04.2012, 21:07 
Заслуженный участник


09/08/09
3438
С.Петербург
Hasar1n в сообщении #559745 писал(а):
Да я подумывал о том, создать 2-мерный динамич. массив точек, и анализировать пиксели-соседи и если |pixel[i,j]-pixel[i+i1,j+j1]|< epsilon (где i1, j1 могут принимать целые значения от -1 до 1), то записывать координаты пикселя в N-ую сторку массива, если |pixel[i,j]-pixel[i+i1,j+j1]|> epsilon, то создавать N+1 строку массива и записывать точку туда. Если поэкспериментировать на разных функциях и создавать массивы, чтобы первый эл-нт j-той строки массива был равен последнему, то мы получали замкнутое пространство, другими словами набор полигонов.
Растровые алгоритмы здесь плохо подходят. В частности, в случае медленно меняющихся участков поверхности достаточно велик риск получить вместо линии "не пойми что". Да и в достаточно хороших случаях линии получатся ступенчатыми из-за малого разрешения пиксельного массива. Лучше, на мой взгляд, пользоваться стандартными методами. Наверняка, для Delphi подобное уже сто раз написано.

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение14.04.2012, 17:12 


01/07/08
836
Киев
Maslov в сообщении #559759 писал(а):
Растровые алгоритмы здесь плохо подходят. В частности, в случае медленно меняющихся участков поверхности достаточно велик риск получить вместо линии "не пойми что". Да и в достаточно хороших случаях линии получатся ступенчатыми из-за малого разрешения пиксельного массива.

Плохо понятно, какие задачи имеются в виду здесь. ТС начал с построения линий уровня для функций вида $z=f(x,y);$. Более сложной является построение линий уровня для неявной функции 2-х переменных вида $f(x,y,z)=0;$. Такие задачи любит матанализ. Задачи, которые решают с применением триангуляции Делоне, обычно относятся к непрерывному восполнению функций заданных на множестве точек. Множества бывают регулярными и нерегулярными. Обычно данные получаются в результате геодезических и геологических измерений. Методов восполнения много, но ни один из них не является общепризнанным. Триангуляция Делоне самый "модный". Стандартного метода, имхо, нет.
Maslov в сообщении #559759 писал(а):
В частности, в случае медленно меняющихся участков поверхности достаточно велик риск получить вместо линии "не пойми что".

Здесь вина не растрового метода, просто "линии уровня" не всегда являются линиями, а иногда могут быть плоскими фигурами.
Maslov в сообщении #559759 писал(а):
Да и в достаточно хороших случаях линии получатся ступенчатыми из-за малого разрешения пиксельного массива.

Пиксельный массив должен быть достаточного для задачи размера. :?

Hasar1n в сообщении #559745 писал(а):
Смысл вашего последнего комментария заключает в себе лишь отказ от метода, предложенного Максимом Масловым.
Но так и не было предложений каких-либо других решений. Мне кажется, что вы намекаете бросить эту затею.


Вольному -воля, но такого смысла мои посты не содержат. Вы сказали, что чувствуете слабость в матанализе. Во первых это при желании поправимо, а во вторых для этих задач матанализ не является необходимостью. 560 лет исполнилось со дня рождения Леонардо да Винчи. Он не слушал никаких курсов матанализа, но рисовал очень сложные для матанализа поверхности.
С уважением,

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение14.04.2012, 17:22 
Заслуженный участник


09/08/09
3438
С.Петербург
hurtsy в сообщении #559973 писал(а):
Задачи, которые решают с применением триангуляции Делоне, обычно относятся к непрерывному восполнению функций заданных на множестве точек. Множества бывают регулярными и нерегулярными.
Да, Вы правы. Причем для регулярных (прямоугольных) сеток для построения триангуляции Делоне никакие специальные алгоритмы не нужны: треугольники строятся просто проведением диагоналей в прямоугольниках, образующих сетку.

 Профиль  
                  
 
 Re: Линии уровня функции от 2 переменных
Сообщение15.04.2012, 13:01 


11/04/12
21
Maslov
Как понял, триангуляция Делоне для непрерывных функций строится из прямоугольной сетки. А большие ли ошибки будут, если применять для прерывистых функций регулярную сетку?
hurtsy
Чтож, я ошибался, что вы хотите отговорить меня, и прошу прощения, был опрометчив. Вы наконец-то втянулись в разговор, связанный с темой. Спасибо.

(Оффтоп)

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group