Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.01.2012, 23:23
sidoro89 sidoro89 вне форума
Прохожий
 
Регистрация: 06.01.2012
Сообщения: 7
Репутация: 10
Сообщение Изолинии и 2D Массива

Доброго времени суток. Интересуюсь у знатоков : как из массива данных (Xi,Yi,F(Xi,Yi)) построить изолинии для всей области X,Y. Заранее спасибо.
Ответить с цитированием
  #2  
Старый 22.01.2012, 07:11
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от sidoro89
Доброго времени суток. Интересуюсь у знатоков : как из массива данных (Xi,Yi,F(Xi,Yi)) построить изолинии для всей области X,Y. Заранее спасибо.

А что есть "изолиния", а то что-то искать лень...
Ответить с цитированием
  #3  
Старый 22.01.2012, 10:18
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

Изолинии- это линии соединяющие равные значения функции
Напр. Изобара- линия соедин равные значения давления воздуха (у синоптиков)

Алгоритм может быть примерно таким
1. Для заданной точки [x,y] ищем из 4-ех соседних точек ту
где функция наиболее близка к начальной точке.
2. Проводим туда вектор LineTo(x,y)
3. Для новой точки ищем из трех соседних (кроме начальной) наиболее близкое значение
4. продолжаем пока не упремся в тупик или линия не замкнется.
5. Все это проделываем для каждой точки с заданным интервалом по
F(x,y)
Учитывая что F(x,y)- типа float
проверяем неравенство
abs(F(x0,y0) - F(x,y)) < Epsilon
где Epsilon- это допускаемая погрешность вычисления F(x,y)


Громоздко. Может у кого есть идеи получше?
Задача нетривиальная.

Последний раз редактировалось chainik, 22.01.2012 в 10:30.
Ответить с цитированием
  #4  
Старый 22.01.2012, 11:39
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

Я тут немного подумал....

Мой алгоритм требует запоминания пути, те откуда мы пришли в
данную точку.
Наверное это не обязательно.

Предлагаю следующее

Пусть надо построить изолинию для значения функции Fn
и пусть задана точность определения изолинии Epsilon
и шаг по координатам X,Y равный Delta

Тогда
1. Просматриваем все точки (X,Y) с шагом Delta и проверяем условие
abs(F(X,Y) - Fn) < Epsilon
Если нет- точку пропускаем
2. Если да - то проверяем на это же условие соседние 4 точки (X+-Delta, Y+-Delta)
Если да то проводим туда векторы из данной точки. LineTo(X+-Delta, Y+-Delta)
3. И так по всем точкам.
Изолинии нарисуются сами как совокупность векторов.

Этот вариант куда как алгоритмически проше чем первый.

Занятно
Если задать слишком грубое Epsilon то изолинии станут толстыми.
Если Epsilon мало- то в линиях могут появиться разрывы.

Последний раз редактировалось chainik, 22.01.2012 в 11:52.
Ответить с цитированием
  #5  
Старый 22.01.2012, 23:42
sidoro89 sidoro89 вне форума
Прохожий
 
Регистрация: 06.01.2012
Сообщения: 7
Репутация: 10
По умолчанию

chainik. Задумка интересная, что-то подобное получилось реализовать, но как заметили получается разная толщина линий причем существенно. Даже целая замкнутая область получилась. Мне очень понравилась реализация в МАтКад, но при работе с большими массивами данных он просто тупит((( Поэтому: - исходников никто не видел на дэлфи?
Ответить с цитированием
  #6  
Старый 23.01.2012, 10:45
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

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

ещё гуглани на тему интерполяция, сплайны

Последний раз редактировалось Pyro, 23.01.2012 в 10:49.
Ответить с цитированием
  #7  
Старый 23.01.2012, 12:35
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

Код:
{----------------------------------------------------------------------
    здесь исправленный алгоритм. От точки (x,y) ищется из 4-ех соседних
    наиболее близкая по значению функции и в эту точку проводится вектор
    ( а не во все как в моем предыд алгоритме).
    В качестве функции здесь как пример конус опрокинутый вершиной на коорд плоскость.
    Соответственно изолинии- это сечения конуса те окружности.
    Рмсует на TImage размером 200х200 пикс
-------------------------------------------------------------------------}


const
Delta=1;
Epsilon=0.8;

var
H:extended;


function Isoln(x,y:extended):extended;
begin
Result:=Sqrt((x-100)*(x-100)+(y-100)*(y-100));  //конус
end;

{--------------------------------------------------------
    находит оптимальный путь
    возвращает true- путь найден
---------------------------------------------------------}
function FindTrace(x,y:extended;const H,Epsilon:extended; out OutX,OutY:extended):boolean;
begin
Result:=(abs(Isoln(x,y) - H) < Epsilon);
if Result then
    begin
    OutX:=x-Delta;OutY:=y;
    if abs(Isoln(x+Delta,y) - H) < abs(Isoln(OutX,OutY) - H) then
        OutX:=X+Delta;
    if abs(Isoln(x,y-Delta) - H) < abs(Isoln(OutX,OutY) - H) then
        OutY:=Y-Delta;
    if abs(Isoln(x,y+Delta) - H) < abs(Isoln(OutX,OutY) - H) then
        OutY:=Y+Delta;
    end;
end;

{--------------work----------------------------}
procedure TForm1.Button1Click(Sender: TObject);
var
OutX,OutY,x,y:extended;
begin
H:=StrToFloat(Edit1.Text);
x:=0;

with Image1.Canvas do
while x < 200 do
    begin
    y:=0;
    while y < 200 do
        begin
        if FindTrace(x,y,H,Epsilon,OutX,OutY) then
            begin
            MoveTo(round(x),round(y));LineTo(round(OutX),round(OutY));
            end;
        y:=y+Delta;
        end;
    x:=x+Delta;
    end;

end;

end.
Ответить с цитированием
  #8  
Старый 23.01.2012, 12:58
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Цитата:
Сообщение от sidoro89
chainik. Задумка интересная, что-то подобное получилось реализовать, но как заметили получается разная толщина линий причем существенно. Даже целая замкнутая область получилась. Мне очень понравилась реализация в МАтКад, но при работе с большими массивами данных он просто тупит((( Поэтому: - исходников никто не видел на дэлфи?
В Matlab'е есть функции contour и contour3 и MatLab исходники предоставляет (кроме встроенных функций).
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:51.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter