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

Техническое обеспечение автоматизированных информационных систем, современные средства сбора и обработки земельно-кадастровых данных, вычислительной и телекоммуникационной техники. Перечень этапов реализации методов исследования операций и их описание.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 22.04.2014
Размер файла 931,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Содержание

Введение

Глава 1

1.1. Этапы построения моделей

1.2. Методы построения 3D моделей местности

1.3. Описание метода обратных квадратов

Глава 2

2.1 Листинг данной программы

2.2 Результат практической реализации алгоритма в данной работе

Глава 3

3.1 Преимущества метода обратных квадратов

Заключение

Список литературы

Введение

Техническое обеспечение автоматизированных информационных систем Государственного земельного кадастра должно базироваться на современных средствах сбора и обработки земельно-кадастровых данных, вычислительной и телекоммуникационной технике. С учетом фактора постоянной модернизации аппаратных средств информационных систем и модификации программных средств необходимым условием функционирования является обеспечение автоматизированной системы инструментом сбора и обработки материалов полевых съемок и данных дистанционного зондирования (аэрокосмической, цифровой и видеосъемок). Таким образом, становится очевидной необходимость введения в курс «Информационные технологии в землеустройстве и земельном кадастре», для специалистов данной квалификации графических программных систем ориентированных на построение трёхмерных геометрических моделей, а также на формирование графической технической документации в соответствии с действующими ГОСТами. В частности, построение 3D модели местности позволяет более наглядно изучить особенности рельефа, прогнозирования перспективных участков для последующих работ.

Глава 1

1.1 Этапы построения моделей

Исследование операций, как инструмент задачи принятия решения, можно рассматривать и как науку, и как искусство. Наука здесь представлена всей мощью математических методов, а искусство -- тем обстоятельством, что успех на всех этапах, предшествующих получению оптимального решения математической модели, в большей степени зависит от творчества и опыта всей команды, занимающейся решением задачи ИО.

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

1. Формализация исходной проблемы.

2. Построение математической модели.

3. Решение модели.

4. Проверка адекватности модели.

5. Реализация решения.

Из всех пяти приведенных этапов только третий, решение модели, достаточно точно определен и наиболее прост для реализации в рамках методики ИО. поскольку действия на этом этапе основываются на точном математической теории. Выполнение остальных этапов в значительной мере является искусством, а не наукой. Поэтому мы не можем точно описать процедуры выполнение * i их этапов.

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

2. Построение математической модели означает перевод формализованной задачи, описание которой получено на предыдущем этапе, на четкий язык математических соотношений. Если полученная модель является одной из стандартных математических моделей, таких как модель линейного программирования, то решение обычно достигается путем использования соответствующих существующих алгоритмов. Если же результирующая модель очень сложная и не приводится к какому-либо стандартному типу моделей, то команда ИО может либо упростить модель, либо применить эвристический подход, либо использовать имитационное моделирование. В некоторых случаях комбинация математической, имитационной и эвристической моделей может привести к решению исходной проблемы.

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

4. Проверка адекватности модели предполагает проверку правильности модели, т.е. определения того, соответствует ли поведение модели в определенных ситуациях поведению исходной реальной системы. Но сначала команда аналитиков ИО должна удостовериться, что модель не содержит "сюрпризов". Другими словами, надо убедиться, что решение, полученное в рамках построенной модели, имеет смысл и интуитивно приемлемо. Формальным общепринятым методом проверки адекватности модели является сравнение полученного решения (поведение модели) с известными ранее решениями или поведением реальной системы. Модель считается адекватной, если при определенных начальных условиях ее поведение совпадает с поведением исходной системы при тех же начальных условиях. Конечно, это не гарантирует, что при других начальных условиях поведение модели будет совпадать с поведением реальной системы. В некоторых случаях в силу разных причин невозможно прямое сравнение модели с реальной системой или сравнение решений, полученных в рамках этой модели, с известными решениями (например, из-за отсутствия таких данных). В такой ситуации для проверки адекватности математической модели можно использовать имитационное моделирование, т.е. сравнивать поведение математической и имитационной моделей.

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

1.2 Методы построения 3D моделей местности

Основой для представления данных о земной поверхности являются цифровые модели рельефа.

Поверхности - это объекты, которые чаще всего представляются значениями высоты Z, распределенными по области, определенной координатами X и Y.

Цифровые модели рельефа (ЦМР) используют для компьютерного представления земных поверхностей.

Построение ЦМР требует определённой формы представления исходных данных (набора координат точек X,Y,Z) и способа их структурного описания, позволяющего восстанавливать поверхность путем интерполяции или аппроксимации исходных данных.

Источники данных для формирования ЦМР

Исходные данные для формирования ЦМР могут быть получены по картам - цифрованием горизонталей, по стереопарам снимков, а также в результате геодезических измерений или лазерного сканирования местности. Наиболее распространен первый способ, т.к. сбор по стереопарам снимков отличается трудоемкостью и требует специфического программного обеспечения, но в то же время позволяет обеспечить желаемую степень детальности представления земной поверхности. Лазерное сканирование перспективный современный метод, пока достаточно дорогой.

Структура данных для представления поверхностей

Построение ЦМР требует определенной структуры данных, а исходные точки могут быть по разному распределены в пространстве. Сбор данных может осуществляться по точкам регулярной сетки, по структурным линиям рельефа или хаотично. Первичные данные с помощью тех или иных операций приводят к одному из наиболее распространенных в ГИС структур для представления поверхностей: GRID, TIN или TGRID.

TIN (Triangulated Irregular Network) - нерегулярная триангуляционная сеть, система неперекрывающихся треугольников. Вершинами треугольников являются исходные опорные точки. Рельеф в этом случае представляется многогранной поверхностью, каждая грань которой описывается либо линейной функцией (полиэдральная модель), либо полиноминальной поверхностью, коэффициенты которой определяются по значениям в вершинах граней треугольников. Для получения модели поверхности нужно соединить пары точек ребрами определенным способом, называемым триангуляцией Делоне (рис. 1).

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

Рис. 2. Триангуляция Делоне

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

GRID - модель, представляет собой регулярную матрицу значений высот, полученную при интерполяции исходных данных. Для каждой ячейки матрицы высота вычисляется на основе интерполяции. Фактически это сетка, размеры которой задаются в соответствии с требованиями точности конкретной решаемой задачи. Регулярная сетка соответствует земной поверхности, а не изображению.

При использовании GRID-модели существует некоторая сложность в выборе интервала между точками. Например, участки поверхности могут быть как сильно пересеченными, так и выположенными. В первом случае необходимо большее количество точек на единицу площади.

Рис. 3. Плотность точек в модели GRID

1.3 Описание метода обратных квадратов и адгоритм его практической реализации

Есть несколько алгоритмов, оперирующих только положением точек и значениями в них. Самый простой из этих способов -- «метод обратных квадратов».

Суть метода заключается в том, что значение в произвольной точке P вычисляется, как линейная комбинация значений заданных точек; причём веса в линейной комбинации берутся обратно пропорциональными квадрату расстояний от этой точки P до соответствующих заданных точек.

Например, даны точки с координатами (X1,Y1), (X2,Y2), ... , (Xn,Yn), имеющие значения F1, ... , Fn соответственно. И есть точка (X, Y), в которой нам необходимо вычислить значение F. Тогда мы вначале вычисляем веса:

Затем нормируем веса так, чтобы их сумма была равна единице:

S := K1+...+Kn;

Ki := Ki / S, i=1,...,n.

Затем вычисляем нужное нам значение, как линейную комбинацию заданных значений с вычисленными весами:

F:=K1•F1+...+KnFn.

Если вдруг так оказалось, что точка (X,Y) совпала с одной из заданных точек, то, чтобы не было деления на ноль, мы просто берем значение совпавшей точки:

F := Fi, если X=Xi и Y=Yi.

Глава 2

2.1 Листинг данной программы

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids, StdCtrls, Buttons, Menus;

type

TForm1 = class(TForm)

StringGrid1: TStringGrid;

Button_ApGrig: TButton;

Button_Load: TButton;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;

Button_Save: TButton;

Button_Clear: TButton;

SpeedButton1: TSpeedButton;

Button_start: TButton;

PopupMenu1: TPopupMenu;

N1: TMenuItem;

N2: TMenuItem;

StringGrid2: TStringGrid;

Button1: TButton;

procedure StringGrid1Enter(Sender: TObject);

procedure StringGrid1KeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure Button_ApGrigClick(Sender: TObject);

procedure Button_LoadClick(Sender: TObject);

procedure Button_SaveClick(Sender: TObject);

procedure Button_ClearClick(Sender: TObject);

procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);

procedure SpeedButton1Click(Sender: TObject);

procedure Button_frozenClick(Sender: TObject);

procedure Button_startClick(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

coordinates=record

x:real;

y:real;

z:real;

ex:boolean;

end;

original=array [1..10000] of coordinates;

var

Form1: TForm1;

m,m1,step,numofint:integer;

editcontrol:boolean;

resultnet:array [1..10000, 1..3] of double;

scale,scale_z:real;

line: array [1..10000,1..6] of real;

o:integer;

implementation

uses Unit2, Unit3, Unit4;

{$R *.dfm}

procedure TForm1.StringGrid1Enter(Sender: TObject);

var n: Integer;

s: string;

begin

StringGrid1.Cells[1,0]:='X';

StringGrid1.Cells[2,0]:='Y';

StringGrid1.Cells[3,0]:='Z';

StringGrid1.Cells[0,0]:='№';

StringGrid1.Cells[0,1]:='1';

end;

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

var n:integer; s:string;

begin

n:= StringGrid1.RowCount;

if Key = VK_RETURN then begin //adds one more row

if StringGrid1.Cells[3,n-1] <> '' then

begin

//showmessage('');

n:=n+1 ;

StringGrid1.RowCount:=n;

s:=inttostr(n-1);

StringGrid1.Cells[0,n-1] :=s;

StringGrid1.Row:=n-1;

StringGrid1.Col:=1;

end;

end;

if Key = VK_RETURN then begin

if StringGrid1.Cells[1,n-1] <> '' then

begin

StringGrid1.Row:=n-1;

StringGrid1.Col:=2;

end;

end;

if Key = VK_RETURN then begin

if StringGrid1.Cells[2,n-1] <> '' then

begin

StringGrid1.Row:=n-1;

StringGrid1.Col:=3;

end;

end;

end;

procedure TForm1.Button_ApGrigClick(Sender: TObject);

begin

Stringgrid1.Visible:=true;

Button_Save.Visible:=true;

Button_Clear.Visible:=true;

Form1.ClientHeight:=Button_start.Top+40;

if editcontrol=false then

begin

editcontrol:=true; Stringgrid1.Options:=[goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine,goRangeSelect,goEditing,goTabs,goAlwaysShowEditor];

Button_ApGrig.Caption:='Готово';

end

else

begin

editcontrol:=false; Stringgrid1.Options:=[goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine,goRangeSelect,goTabs,goAlwaysShowEditor];

Button_ApGrig.Caption:='Редактировать';

end;

end;

procedure TForm1.Button_LoadClick(Sender: TObject);

type

coord = record

x:string;

y:string;

z:string;

end;

var f:textfile ; s,str:string; n,i,p:integer; xyz: coord;

begin

openDialog1.Filter :=

'Текстовый файл с разделителем|*.txt';

If OpenDialog1.Execute then

begin

s:=Opendialog1.FileName;

AssignFile(f,s);

Reset(f);

n:=0;

while not eof(f) do

begin

Readln(f,str);

n:=n+1;

StringGrid1.RowCount:=n+1;

trimleft(str);

trimright(str);

p:=pos(' ',str);

xyz.x:=copy(str,1,p) ;

delete (str,1,p);

trimleft(str);

p:=pos(' ',str);

xyz.y:=copy(str,1,p) ;

delete (str,1,p);

trimleft(str);

xyz.z:=str;

//showmessage(xyz.y);

Stringgrid1.Cells[1,n]:=trimright(xyz.x);

Stringgrid1.Cells[2,n]:=trimright(xyz.y);

Stringgrid1.Cells[3,n]:=xyz.z;

end;

StringGrid1.Visible:=true;

Button_Save.Visible:=true;

Button_Clear.Visible:=true;

StringGrid1.Cells[1,0]:='X';

StringGrid1.Cells[2,0]:='Y';

StringGrid1.Cells[3,0]:='Z';

StringGrid1.Cells[0,0]:='№';

for i:=1 to n do

begin

s:=inttostr(i);

StringGrid1.Cells[0,i]:=s;

end;

closefile(f);

Form1.ClientHeight:=423;

Button_ApGrig.Caption:='Редактировать';

editcontrol:=false; Stringgrid1.Options:=[goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine,goRangeSelect,goTabs,goAlwaysShowEditor];

end;

end;

procedure TForm1.Button_SaveClick(Sender: TObject);

var s,str:string; f:textfile; n,i:integer;

begin

saveDialog1.Filter := 'Текстовый файл с разделителем|*.txt' ;

saveDialog1.DefaultExt := 'txt';

if savedialog1.Execute then

begin

s:=Savedialog1.FileName;

AssignFile (f,s);

Rewrite(f);

n:=StringGrid1.Rowcount;

for i:=1 to n-1 do

begin

str:=StringGrid1.Cells[1,i]+'StringGrid1.Cells[2,i]+' '+StringGrid1.Cells[3,i]+#13;

Writeln (f,str);

end;

CloseFile(f);

Showmessage ('Файл успешно сохранен!')

end;

end;

procedure TForm1.Button_ClearClick(Sender: TObject);

begin

Form2.Showmodal;

end;

procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);

const Digit: set of Char=['1'..'9', '0', #8];

Separator: set of Char=['/', '.', ',', 'б', 'Б', 'ю', 'Ю'];

var i,j:integer;

begin

f (Key in Separator)

then Key:=DecimalSeparator

else

if (not(Key in Digit))

then Key:=#0;

i:=Stringgrid1.Row;

j:=Stringgrid1.Col;

if((Key=DecimalSeparator)and(pos(DecimalSeparator, Stringgrid1.Cells[i,j])<>0))

then Key:=#0;

end;

procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

Form3.Showmodal;

end;

procedure TForm1.Button_frozenClick(Sender: TObject);

var row,n,i:integer;

begin

//if editcontrol=1 then begin

// row:=stringgrid1.Row;

// n:=stringgrid1.RowCount;

// for i:=row to n do

// begin

// end;

//end;

end;

procedure TForm1.Button_startClick(Sender: TObject);

var massive:original;

i,n,j,width_n,height_n,t,l,k,min:integer;

maxx,maxy,minx,miny,width,height,buf,bufz,maxz,sump,sumz:real;

aux,aux1:array [1..10000, 1..2] of real;

alert:string[50];

begin

n:=stringgrid1.rowcount-1;

//setlength(massive,n);

//setlength(aux,n);

for i:=1 to n do

begin

try

massive[i].x:=strtofloat(stringgrid1.Cells[1,i]);

massive[i].y:=strtofloat(stringgrid1.Cells[2,i]);

massive[i].z:=strtofloat(stringgrid1.Cells[3,i]);

massive[i].ex:=true;

except

alert:='Точка '+inttostr(i)+' содержит ошибку и будет заморожена.';

showmessage(alert);

massive[i].ex:=false;

stringgrid1.Cells[0,i]:=stringgrid1.Cells[0,i]+'*';

end;

end;

minx:=massive[1].x;

miny:=massive[1].y;

maxx:=massive[1].x;

maxy:=massive[1].y;

for i:=1 to n-1 do

begin

if massive[i].x < minx then minx:=massive[i].x;

if massive[i].y < miny then miny:=massive[i].y;

if massive[i].x > maxx then maxx:=massive[i].x;

if massive[i].y > maxy then maxy:=massive[i].y;

end;

step:=strtoint(Form3.Edit_step.Text);

width:=0;

width_n:=1;

height:=0;

height_n:=1;

while width < (maxy-miny) do

begin

width:=width+step;

width_n:=width_n+1;

end;

while height < (maxx-minx) do

begin

height:=height+step;

height_n:=height_n+1;

end;

numofint:=strtoint(Form3.Edit_NearNeib.Text);

if n < numofint then numofint:=n;

//setlength(aux1,numofint);

t:=1;

//showmessage(inttostr(width_n));

for j:=1 to height_n do begin

i:=t;

Repeat

resultnet[i,1]:=minx+(j-1)*step;

resultnet[i,2]:=miny+(i-t)*step;

i:=i+1;

Until i>j*width_n;

t:=t+width_n;

end;{for j:=1 to height_n}

for i:=1 to t do //

begin

for j:=1 to n do

begin

aux[j,1]:=sqrt((massive[j].x-resultnet[i,1])*(massive[j].x-resultnet[i,1])+(massive[j].y-resultnet[i,2])*(massive[j].y-resultnet[i,2]));

aux[j,2]:=massive[j].z;

end;//auxillary massive formed, contains minimal distances and Z's

for j:=1 to n do begin

k:=j;

while aux[k,1]>aux[k-1,1] do begin

buf:=aux[k,1];

aux[k,1]:=aux[k-1,1];

aux[k-1,1]:=buf;

bufz:=aux[k,2];

aux[k,2]:=aux[k-1,2];

aux[k-1,2]:=bufz;

end;

end;

if aux[1,1]=0 then resultnet[i,3]:=aux[1,2]

else

begin

for j:=1 to numofint do

begin

sump:=sump+(aux[j,1]*aux[j,2]);

sumz:=sumz+aux[j,1];

end;

resultnet[i,3]:=(sump/sumz);

end;

sump:=0;

sumz:=0;

end;

Stringgrid2.Rowcount:=t;

for i:=1 to t-1 do

begin

Stringgrid2.Cells[1,i]:=floattostr(resultnet[i,1]);

Stringgrid2.Cells[2,i]:=floattostr(resultnet[i,2]);

Stringgrid2.Cells[3,i]:=floattostr(resultnet[i,3]);

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

setka: array [1..10000,1..3] of real;

min_x,max_x,min_y,max_y,min_z,max_z,mid_x,mid_y,mid_z:real;

razmer:integer;

i,p,j:integer;

begin

for i:=1 to (StringGrid2.RowCount-1) do //читаю значения из таблицы

begin

setka[i,1]:=strtofloat(StringGrid2.Cells[1,i]);

setka[i,2]:=strtofloat(StringGrid2.Cells[2,i]);

setka[i,3]:=strtofloat(StringGrid2.Cells[3,i]);

razmer:=i;

end;

min_x:=setka[1,1]; //поиск среднего значения координат, необходимо бут при прорисовке

max_x:=setka[1,1];

min_y:=setka[1,2];

max_y:=setka[1,2];

min_z:=setka[1,3];

max_z:=setka[1,3];

for i:=2 to razmer do

begin

if setka[i,1]<min_x then min_x:=setka[i,1];

if setka[i,1]>max_x then max_x:=setka[i,1];

if setka[i,2]<min_y then min_y:=setka[i,2];

if setka[i,2]>max_y then max_y:=setka[i,2];

if setka[i,3]<min_z then min_z:=setka[i,3];

if setka[i,3]>max_z then max_z:=setka[i,3];

end;

mid_x:=(max_x+min_x)/2;

mid_y:=(max_y+min_y)/2;

mid_z:=(max_z+min_z)/2;

if (abs(max_x-mid_x))>(abs(max_y-mid_y)) //определение масштаба при прорисовке

then scale:=abs(max_x-mid_x)

else scale:=abs(max_y-mid_y);

scale_z:=abs(max_z-mid_z)*5;

p:=1;

for i:=1 to razmer do

for j:=1 to razmer do

begin

if ((sqrt(sqr(setka[i,1]-setka[j,1])+sqr(setka[i,2]-setka[j,2])))<=(step+0.001)) then

begin

line[p,1]:=setka[i,1]-mid_x;

line[p,2]:=setka[i,2]-mid_y;

line[p,3]:=setka[i,3]-mid_z;

line[p,4]:=setka[j,1]-mid_x;

line[p,5]:=setka[j,2]-mid_y;

line[p,6]:=setka[j,3]-mid_z;

p:=p+1;

o:=p-1;

end;

end;

Application.CreateForm(TForm4, Form4);

Form4.Show;

end;

end.

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm2 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Button1: TButton;

Button2: TButton;

procedure Button2Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.Button2Click(Sender: TObject);

begin

Close;

end;

procedure TForm2.Button1Click(Sender: TObject);

var i:integer;

begin

for i:=1 to form1.stringgrid1.rowcount-1 do

begin

Form1.Stringgrid1.Cells[1,i]:='';

Form1.Stringgrid1.Cells[2,i]:='';

Form1.Stringgrid1.Cells[3,i]:='';

end;

Form1.Stringgrid1.Rowcount:=2;

Close;

end;

end.

unit Unit3;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm3 = class(TForm)

Label1: TLabel;

CheckBox1: TCheckBox;

Edit_NearNeib: TEdit;

Label2: TLabel;

Edit_step: TEdit;

Button_SaveSettng: TButton;

Button_Cancel: TButton;

procedure Button_CancelClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button_CancelClick(Sender: TObject);

begin

Close;

end;

end.

unit Unit4;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls,OpenGL, StdCtrls, Spin, ComCtrls, Buttons;

type

TForm4 = class(TForm)

Panel1: TPanel;

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure FormPaint(Sender: TObject);

procedure FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

private

dc : HDC;

hrc: HGLRC;

{ Private declarations }

public

{ Public declarations }

end;

var

Form4: TForm4;

u,ox,oy,oz:integer;

procedure setdcpixelformat(hdc:hdc);

implementation

uses Unit2, Unit1, Unit3;

{$R *.dfm}

procedure TForm4.FormCreate(Sender: TObject);

begin

dc := GetDC (Form4.Panel1.Handle);

SetDCPixelFormat(dc);

hrc := wglCreateContext(dc);

u:=0;

ox:=0;

oy:=0;

oz:=0;

end;

procedure SetDCPixelFormat (hdc : HDC);

var

pfd : TPIXELFORMATDESCRIPTOR;

nPixelFormat : Integer;

begin

FillChar(pfd, SizeOf(pfd), 0);

nPixelFormat := ChoosePixelFormat (hdc, @pfd);

SetPixelFormat (hdc, nPixelFormat, @pfd);

end;

procedure TForm4.FormDestroy(Sender: TObject);

begin

wglDeleteContext(hrc);

end;

procedure TForm4.FormPaint(Sender: TObject);

var

ps : TPaintStruct;

i:integer;

begin

BeginPaint (form4.panel1.Handle, ps);

wglMakeCurrent(dc, hrc);

glViewPort (0, 0, form4.panel1.ClientWidth, form4.panel1.ClientHeight);

glClearColor (0.9, 0.9, 0.9, 1.0);

glClear (GL_COLOR_BUFFER_BIT);

glRotatef (u, ox, oy, oz);

glBegin (GL_LINES);

glColor3f (0.0, 1.0, 0.0);

glVertex3f (0,0,0);

glVertex3f (1,0,0);

glColor3f (1.0, 0.0, 0.0);

glVertex3f (0,0,0);

glVertex3f (0,1,0);

glColor3f (0.0, 0.0, 1.0);

glVertex3f (0,0,0);

glVertex3f (0,0,1);

glEnd;

glColor3f (0.0, 0.0, 0.0);

glScalef (1/(sqrt(2)*scale),1/(sqrt(2)*scale),1/(sqrt(2)*scale_z));

for i:=1 to o do

begin

glBegin (GL_LINES);

glVertex3f (line[i,2],line[i,1],line[i,3]);

glVertex3f (line[i,5],line[i,4],line[i,6]);

glEnd;

end;

glScalef (sqrt(2)*scale,sqrt(2)*scale,sqrt(2)*scale_z);

SwapBuffers(form4.panel1.Handle);

wglMakeCurrent(0, 0);

EndPaint (form4.panel1.Handle, ps);

end;

procedure TForm4.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if (Key=38) then

begin

u:=-1;

ox:=1;

oy:=0;

oz:=0;

Form4.FormPaint(Form4);

end;

if (Key=40) then

begin

u:=1;

ox:=1;

oy:=0;

oz:=0;

Form4.FormPaint(Form4);

end;

if (Key=37) and (HiWord(GetKeyState(VK_Shift))<>0) then

begin

u:=1;

ox:=0;

oy:=1;

oz:=0;

Form4.FormPaint(Form4);

end;

if (Key=39) and (HiWord(GetKeyState(VK_Shift))<>0) then

begin

u:=-1;

ox:=0;

oy:=1;

oz:=0;

Form4.FormPaint(Form4);

end;

if (Key=37) and (HiWord(GetKeyState(VK_Shift))=0) then

begin

u:=1;

ox:=0;

oy:=0;

oz:=1;

Form4.FormPaint(Form4);

end;

if (Key=39) and (HiWord(GetKeyState(VK_Shift))=0) then

begin

u:=-1;

ox:=0;

oy:=0;

oz:=1;

Form4.FormPaint(Form4);

end;

end;

end.

2.2 Результат практической реализации описанного алгоритма в данной работе

Программа содержит в себе 4 Form.Каждая из них содержит в себе определенные команды и функции.

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

На Form 2 была подключена команда Очистить. Когда требуется выполнить данную команду, тогда появляется служебное сообщение (см.рис.2):

Рис.2-Вид служебного сообщения

На Form 3 было расположено и настроено меню Настройки, которое дает возможность задать количество ближайших соседей, Шаг сетки, включить или отключить команду Нахождения грубых ошибок в исходных данных, а также сохранить выполненные настройки. (см. рис.3).

Рис.3-вид меню Настройки

На Form 4 находится сама панель, в которой и будет находиться же отрисованная 3D модель местности по заданным точкам.(см.рис.4)

Рис.4-Панель отрисовки 3D модели.

2.3 Апробация данного алгоритма

Апробация заключается в сравнении графических результатов реализации алгоритма в среде программирования Delphi 7 и программе Surfer. Этот этап является проверкой правильности данного алгоритма. Если результаты получены в двух программах будут одинаковые, то можно сделать вывод о том, что алгоритм, описанный в данной работе, верен и правильно выполняет поставленную перед ним задачу. Результаты апробации -рис.2.3.1 и 2.3.2

Рис.2.3.1-результат, полученный в программе Surfer.

Рис.2.3.2.-результат, полученный в программной среде Delphi 7

Глава 3

3.1 Преимущества и недостатки метода обратных квадратов по сравнению с другими методами

1) Метод обратных квадратов строит по точкам непрерывно дифференцируемую (гладкую) функцию, метод триангуляции строит лишь непрерывную (с «изломами» на рёбрах) функцию.

2) 2) При малом количестве вычисляемых точек метод обратных квадратов быстрее, при большом количестве вычисляемых точек (когда вычисляемых точек много больше, чем n•ln(n)), выигрывает оптимальная реализация, использующая триангуляцию Делоне.

3) 3) Метод обратных квадратов устойчив: при малом изменении координат исходных точек (по сравнению с расстояниями между ними) будет происходить малое изменение результирующей функции; метод триангуляции неустойчив: малое изменение координат может привести к перестройке триангуляции и значительным (но локальным) изменениям построенной интерполяционной поверхности.

4) 4) Метод триангуляции локален: это означает, что локальное изменение значений точек или их положения приведёт к локальной перестройке поверхности; метод обратных квадратов не локален: изменение исходных данных приводит к перестройке всей интерполяционной поверхности.

Заключение

На сегодняшний день во многих областях деятельности человека востребованы трехмерные модели реальных объектов. 3D моделирование необходимо при проектировании, архитектуре, дизайне, а также в спелеологии. Трехмерные модели обладают высоким уровнем интерактивности и реалистичности, помогают представить планируемый объект в полном объеме. Построение 3D модели местности позволяет наглядно изучать особенности рельефа при прогнозировании спелеологами перспективных участков для последующих полевых работ.

Размещено на Allbest.ru

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.