Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Diplom-cho.docx
Скачиваний:
14
Добавлен:
01.04.2015
Размер:
505.13 Кб
Скачать
    1. Использованные технологии и алгоритмы

Для реализации программного продукта использовалась библиотека Windows GDI для рендеринга графических элементов и стандартные библиотеки и компоненты Delphi.

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

Алгоритм программной реализации модели деформации тела осуществляется на основе пружинной системы. Для ее исполнения, необходимо, чтобы система получила внешнее воздействие на ее объекты (тела). Воздействие внешних сил производится только на точку, таким образом, чтобы внешние силы изменили текущее положение точки. В таком случае, имея начальное положение смещенной точки и ее текущее положение, можно рассчитать упругую деформацию всего тела используя итерационный метод Гаусса-Зейделя (14 и 15). Метод ведет расчет двух точек соединенных пружинными силами. Для расчета изменения положения всего тела, необходимо циклично пройти по парам точек, соединенных пружинами. При этом стоит учесть что начала обхода следует вести с места начала внешних воздействий в глубь тела, проходя алгоритмом обхода графа в ширину. Расчеты являются достаточно ресурсоемким процессом, поэтому в зависимости от мощности компьютера рекомендуется ограничивать число используемых в модели пружин, так как при каждой итерации потребуется расчет изменения текущего положения для всех точек модели.

  1. Реализация рассмотренной модели в виде отдельного программного обеспечения.

Программный продукт разработан на алгоритмическом языке Delphi, имеет модульную структуру, функционирует в операционных системах семейства Windows, предоставляет пользователю интуитивно понятный графический интерфейс, предназначен для применения в отраслевых САПР и ERP-системах.

В качестве графической подсистемы взята за основу стандартная библиотека операционной системы Windows отвечающая за вывод двухмерной графики GDI/GDI+. В среде разработки Embarcadero Delphi 2010 поддержка данной библиотеки реализовано объектно-ориентированной оберткой canvas.

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

Для работы с приложением, пользователь может работать в 3 режимах:

  • работа с точками (Adding_points);

procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
 Adding_points:=true;
 Adding_springs:=false;
 fixing_points:=false;
end;
  • работа с пружинами (Adding_springs);

procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
 Adding_springs:=true;
 fixing_points:=false;
Adding_points:=false;end;
  • работа с инструментов фиксации точек (Fixing_points);

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
 Adding_points:=false;
 Adding_springs:=false;
fixing_points:=true;end;

Функции обработки элементов графического интерфейса программы реагируют на нажатие кнопок мыши, движения курсора мыши и нажатия кнопок меню. За их обработку отвечают процедуры:

  • PaintBox1MouseDown – реагирует на нажатие левой определяет нахождение под курсором мыши точки и запоминает номер точки, для дальнейшего использования;

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
 i,np:integer;
 rx,ry:extended;
p:Tpoint_3d;
begin
 selected:=-1;
 rx:=get_rx(X);
 ry:=get_ry(Y);
 np:=PointsList.Count;
 for i:=0 to np-1 do
 begin
  p:=PointsList.Items[i];
  if ((abs(rx-p.x)<5) and (abs(ry-p.y)<5)) then
  begin
   selected:=i;
   break;
  end
 end;
end;
  • PaintBox1MouseMove – запоминает текущее положение курсора мышки при каждом его движении;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
 rx,ry:extended;
begin
 rx:=get_rx(X);
 ry:=get_ry(Y);
 statusbar1.Panels[0].Text:=' X: ' + intToStr(x)+ ' rX: ' +FloatToStrF(rx,fffixed,8,3);
 statusbar1.Panels[1].Text:=' Y: '+intToStr(y)+ ' rY: ' +FloatToStrF(ry,fffixed,8,3);
end;

  • PaintBox1MouseUp – выполняет выбор действий на основе текущего режима работы приложения;

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
 p:TPoint_3d;
 rx,ry:extended;
 point_select:boolean;
 otr:TOtr_3d;
 S:TSpring;
 l:Extended;
 value_n:integer;
 d:extended;
begin
 d:=2;
 rx:=get_rx(X);
 ry:=get_ry(Y);
 if Adding_points then
 begin
  AddPointTo(rX,rY);
  memos_update;
 end;
 if Adding_springs then
 begin
  if FirstSelected then
  begin
   if selected<>-1 then
   begin
    p2:=PointsList[selected];
    otr:=TOtr_3d.Create_withPoints(p1,p2);
    l:=abs(otr.GetLength);
    value_n:=round(l/d)+1;
    s:=TSpring.Create_withParam(otr,l,5,d,2*d,value_n);
    SpringsList.Add(s);
    selected:=-1;
    FirstSelected:=false;
    memos_update;
   end;
  end
  else
  begin
   if selected<>-1 then
   begin
    p1:=PointsList[selected];
    FirstSelected:=true;
   end;
  end;
 end;
 if fixing_points then
 begin
  if selected<>-1 then
  begin
   p:=PointsList[selected];
   if mbLeft = Button then
   begin
    p.fixed:=1;
   end
   else
   begin
    p.fixed:=0;
   end;
  end;
  memos_update;
end;
paintbox1.repaint;
end;

  • PaintBox1Paint – реагирует на сообщение WM_PAINT.

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

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
 i,np,ns:integer;
 nx,ny:integer;
 rx,ry:extended;
 x,y:integer;
 p,p1,p2:TPoint_3d;
 s:TSpring;
 str:string;
 oldcolor:Tcolor;
 tw,th:integer;
begin
  rx:=get_rx(paintbox1.ClientWidth-nkx-delx);
  nx:=round(rx/10);
  ry:=get_ry(dely);
  ny:=round(ry/10);
  for i:=0 to nx do
  begin
   str:=FloatToStrF(i*10,fffixed,4,1);
   tw:=PaintBox1.Canvas.TextWidth(str);
   PaintBox1.Canvas.TextOut(nkx+round(mx*10*i-tw/2),nky+5,str);
   moveto_r(PaintBox1.Canvas,i*10,0);
   Lineto_r(PaintBox1.Canvas,i*10,10*ny);
  end;
  for i:=0 to ny do
  begin
   str:=FloatToStrF(i*10,fffixed,4,1);
   tw:=PaintBox1.Canvas.TextWidth(str);
   th:=PaintBox1.Canvas.TextHeight(str);
   PaintBox1.Canvas.TextOut(nkx-tw-2,nky-round(my*10*i)-th div 2,str);
   moveto_r(PaintBox1.Canvas,0,i*10);
   Lineto_r(PaintBox1.Canvas,10*nx,i*10);
  end;
 np:=PointsList.Count;
 if np<>0 then
 begin
  for i:=0 to np-1 do
  begin
   p:=PointsList[i];
   oldcolor:=PaintBox1.Canvas.Brush.Color;
   PaintBox1.Canvas.Brush.Color:=clgreen;
   if p.fixed=1 then PaintBox1.Canvas.Brush.Color:=clred;
   Circle_r(PaintBox1.Canvas,p.X,p.Y,2);
   PaintBox1.Canvas.Brush.Color:=oldcolor;
  end;
 end;
 ns:=SpringsList.Count;
 if ns<>0 then
 begin
  for i:=0 to ns-1 do
  begin
   s:=SpringsList[i];
   p1:=s.Otr.First;
   p2:=s.Otr.Last;
   Pruzh_1d_ris(PaintBox1.Canvas,s,p1.X,p1.Y,p2.X,p2.Y);
end;
 end;
 memos_update;
end;
  • TPoint_3d – суперкласс, определяет объект точки;

  • TOtr_3d – класс, описывающий готовый отрезок;

  • TSpring – класс, описывающий пружины.

Процедура PaintBox1MouseUp выполняет действия в зависимости от режима:

  1. Режим работы с точками. Производит вызов процедуры AddPointTo с передачей в аргументах координаты курсора мыши.

  2. Режим работы с пружинами: требует выбрать две точки, для скрепления их пружиной.

  3. Режим работы с инструментом фиксации. Помечает опознанную точку функцией PaintBox1MouseDown как фиксированную.

Вычисления по формулам 13, 14 выполняется код

begin
ax:=0; 
bx:=0; 
cx:=0;
ay:=0; 
by:=0; 
cy:=0;
    for j:=0 to np-1 do // повсемточкамbegin
     p1:=PointsList[j];
     if p1<>p then      //еслиточкадругаяbegins:=get_spring(p,p1); //определяем пружину которая соединяет эти точкиif s<>nil then
      begin
       l:=s.l;
       k:=s.k;ax:=ax+p1.x*k;           // вычисление формулы 13bx:=bx-sgn(p.X,p1.X)*l;
       cx:=cx+k;ay:=ay+p1.y*k;           // вычисление формулы 14by:=by-sgn(p.y,p1.y)*l;
       cy:=cy+k;
      end;
     end;end;pu:=p.x;          //для определения ошибокp.x:=(ax+bx)/cx;     //новое значение х-координатыif (abs(pu-p.x)>=razn) then razn:=abs(pu-p.x);pu:=p.y;          //для определения ошибокp.y:=(ay+by-pm)/cy;  //новое значение у-координатыif (abs(pu-p.y)>=razn) then razn:=abs(pu-p.y);end;

На рисунке 2 показана запущенная программа. Интерфейс имеет четыре кнопки: добавить точки, добавить пружины, закрепить точки и демонстрационный режим, где пользователь может проводить манипуляции с точками, то есть тянуть их. Слева находятся Memo1 и Memo2 (списки), в которых отображается координаты и номер добавленной точки (верхний Memo), на нижнем показаны добавленные пружины, которые прикреплены к точке отображающиеся в виде координат. При работе в режиме инструмента закрепления пользователь левым кликом мыши закрепленная точка закрашивается красным цветом и в дальнейшем эту точку невозможно передвинуть. На данном рисунке добавили точки, добавили пружины (соединили точки) и закрепили точку.

Рис. 2. Интерфейс программы.

На рисунке 3 добавляем точки на сетке программы. Добавленные точки видны зеленым цветом. Справа сверху список добавленных точек в виде координат, там же находится информация о том, закреплена ли точка или нет. Точки можно удалить правым кликом мыши.

Рис. 3 Добавление точек.

На рисунке 4 уже добавлены пружины к точкам. Справа внизу есть информация о добавленных пружинах, в виде координат точек к которым прикреплены пружины, их жесткости и длине.

Рис. 4 Добавление пружин.

На рисунке 5 показана уже готовая каркасно-пружинная модель. Пользователь закрепляет точки (закрепленные точки закрашивается красным цветом). Справа вверху списка видно, что точка под номером 1 закреплена (это показывает число 1 в конце строки информации о точке). Закрепленные точки можно отменить, нажав по закрепленной точке правым кликом мыши.

Рис. 5. Закрепление точек.

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

Рис. 6. Демонстрационный режим.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]