на тему рефераты
 
Главная | Карта сайта
на тему рефераты
РАЗДЕЛЫ

на тему рефераты
ПАРТНЕРЫ

на тему рефераты
АЛФАВИТ
... А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я

на тему рефераты
ПОИСК
Введите фамилию автора:


Дипломная работа: Разработка программной системы, обеспечивающей отображение и сравнение в трехмерном пространстве исходных данных из двух матричных форм


Зтек оц – текущие затраты, связанные с эксплуатацией задачи на ЭВМ, которые связаны с решением задачи на ВТ (заработная плата должностных лиц, обслуживающих компьютеры, электроэнергия, амортизация);

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

С учетом вышеизложенного, формула для расчета годового экономического эффекта приобретает вид:

 (3.3)

Здесь:

 (3.4)

где:

Тр – трудоемкость одноразового решения задачи вручную;

кр – периодичность решения задачи в течение года;

tr – среднечасовая тарифная ставка должностного лица;

n – коэффициент, учитывающий премии и доклады;

R – коэффициент отчисления от фонда оплаты труда;

Ен – нормативный коэффициент эффективности капитальных затрат, принимается равным 0.15.

Тр=0.32 ч; кр = 500 опер.; tr = 107 руб.; n = 1,4; R =1,36.

 (3.5)


где:

Титр – трудоемкость одноразового решения задачи автоматизировано.

 

 (3.6)

где:

Тпр – продолжительность разработки программы в мес;

кл – количество человек, участвующих в разработке;

Fм – месячный фонд времени работы;

tr – среднечасовая тарифная ставка разработчика.

Тпр=1 мес.; кл = 1 чел.; Fм = 80 час. (при норм. усл.); tr = 100 руб.;

 

 (3.7)

где:

Тм – время машинной реализации задачи;

Сэвм – стоимость ЭВМ, программных продуктов и обучения

должностных лиц;

Fэвм – действительный фонд времени ЭВМ в течение года.

Тм=0.015 час; Сэвм=15000 руб.; Fэвм=2880 час;

Зк оц=(0.015 500 15000)/2880 ≈ 39 руб.

 (3.8)

где:

Зитр – заработная плата должностных лиц, обслуживающих

ЭВМ;

А – амортизация (A=0.12 Сэвм=1800 руб.);

Зэл – затраты на электроэнергию.

 (3.9)

где:

Fгод – годовой фонд заработной платы должностных лиц, обслуживающих ЭВМ;

Зитр=(216000/2880) 0.015 500 1.4 1.36 =1071 руб.

 (3.10)

где:

Кис – коэффициент использования энергоустановок по

мощности;

СУМэвм – суммарная установленная мощность ЭВМ;

Цэл – стоимость одного кВт/ч энергии.

Кис=0.9; СУМэвм=100; Цэл=2.5 руб;

Зэл=0.9 100 0.015 500 2.5=1688 руб;

Зтек оц=1071+1800+1688=4559 руб;

Основными затратами по автоматизации будут:

а)  обучение должностных лиц обеспечивающих работу ЭВМ;

б)  обслуживание компьютерной техники.

Затраты по базовому варианту:

Зрб=32600 руб.;

Затраты по оцениваемому варианту:

Зр оц = 1530 руб.

Зтек оц=4559 руб.;

Зк оц=39 руб.

Зпр оц =15232 руб.

Тогда годовой экономический эффект будет:

Эг=(Зрб-Зр оц-Зтек оц)-Ен (Зк оц+Зпр оц)=(32600-1530-4559)-0.15 (39+15232)=26511-2291=24220 руб.

Расчет годовой экономии.

 (3.11)

Расчет расчетного коэффициента эффективности капиталовложений.

 (3.12)

Внедрение КИТ является эффективным если Ер>Ен, т. е. расчетный коэффициент эффективности больше нормативного.

Расчет срока окупаемости капиталовложений.

 (3.13)

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


3.4 Рекомендации по обеспечению безопасной жизнедеятельности при работе с ПСПИ

Эксплуатация разработанной ПСПИ предполагается на ПЭВМ, которая является источником вредных факторов, негативно влияющих на безопасность жизнедеятельности пользователей. Для снижения воздействия этих факторов при организации эксплуатации системы необходимо руководствоваться описанными ниже рекомендациями.

3.4.1 Рекомендации по обеспечению электробезопасности

Источником питающего напряжения ПЭВМ должна быть сеть переменного тока с напряжением 220 В, на которую распространяется ГОСТ 25861-83.

Для предупреждения поражений электрическим током необходимо:

а)  чётко и в полном объёме выполнять правила производства работ и правила технической эксплуатации;

б)  исключить возможность доступа оператора к частям оборудования, работающим под опасным напряжением, неизолированным частям, предназначенным для работы при малом напряжении и не подключенным к защитному заземлению;

в)  применять изоляцию, служащую для защиты от поражения электрическим током, выполненную с применением прочного сплошного или многослойного изоляционного материала, толщина которого обусловлена типом обеспечиваемой защиты;

г)  подводить электропитание к ПЭВМ от розетки здания при помощи специальной вилки с заземляющим контактом;

д)  защитить от перегрузок по току, рассчитывая на мощность, потребляемую от сети; а также защитить от короткого замыкания оборудование, встроенное в сеть здания;

е)  надёжно подключить к заземляющим зажимам металлические части, доступные для оператора, которые в результате повреждения изоляции могут оказаться под опасным напряжением;

ж)  проверить, что защитный заземляющий проводник не имеет выключателей и предохранителей и надёжно изолирован.

3.4.2 Рекомендации по обеспечению пожарной безопасности

Пожарная безопасность помещений, имеющих электрические сети, регламентируется ГОСТ 12.1.033-81, ГОСТ 12.1.004-85. Работа оператора ЭВМ должна вестись в помещении, соответствующем категории Д. Огнестойкость здания должна соответствовать СНиП 2.01.02-85 .

В конструкции дисплеев должны использоваться специальные разъемы, уменьшающие переходное сопротивление, и, соответственно, нагрев. ЭВМ нельзя располагать вблизи источников тепла или термоизлучателей, на экраны дисплеев не должны падать прямые солнечные лучи. Устанавливать ЭВМ необходимо так, чтобы задняя и боковые стенки отстояли не менее чем на 0.2 м от других предметов. Для соблюдения теплового режима в корпусе ЭВМ должны быть предусмотрены вентиляционные отверстия и охлаждающий вентилятор. Внутренний монтаж должен быть выполнен проводом с повышенной теплостойкостью.

Пожарная безопасность объекта должна обеспечиваться:

а)  системой предотвращения пожара;

б)  системой противопожарной защиты;

в)  организационно-техническими мероприятиями.

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

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

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

3.4.3 Рекомендации по обеспечению допустимого уровня шума и вибрации в помещениях

Показатели уровня шумов в рабочих помещениях, где будет осуществляться эксплуатация программы должны соответствовать требованиям ГОСТ 12.1.003-83. Допустимый уровень шума при умственном труде, требующем сосредоточенности, 50дБ[2]).

Для уменьшения шума и вибрации в помещении оборудование, аппараты и приборы должны устанавливаться на специальные фундаменты и амортизирующие прокладки. Если стены и потолки помещения являются источниками шумообразования, они должны быть облицованы звукопоглощающим материалом.


Заключение

Анализ существующего подхода к оперативной оценке поступающей информации выявил необходимость разработки и внедрения дополнительных ПС представления информации.

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

На основе вышесказанного, определен альтернативный вариант реализации ПС представления информации – самостоятельная разработка с использованием ИСР Borland Delphi 7.0.

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

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

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


Список использованной литературы

1.  Иваненко А. Ю. Оформление документации на программные средства. – М.: Издательство МГТУ им. Баумана, 2002;

2.  Фаронов В. В. Delphi Программирование на языке высокого уровня. – СПБ: «Питер», 2003;

3.  ГОСТ 19.101-77 ЕСПД «Виды программ и программных документов».

4.  ГОСТ 19.402-78 ЕСПД «Описание программы».

5.  ГОСТ 19.701-90 ЕСПД. «Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения в соответствии с ним».

6.  ГОСТ 24.211-82 «Требования к содержанию документа «Описание алгоритма»».

7.  Мамиконов А. Г. Модели и методы проектирования информационного обеспечения АСУ. – М.: Статистика, 1978.

8.  ГОСТ ЕСКД, ГОСТ ЕСПД, ГОСТ КС и РД АСУ, ГОСТ СТД АСУ.

9.  Иваненко А. Ю. Оформление документации на программные средства. – М.: Издательство МГТУ им. Баумана, 2002.

10.  Фленов М. Е., DirectX и Delphi. Искусство программирования. – СПб.: БХВ-Петербург, 2006.

11.  Краснов М. В., DirectX. Графика в проектах Delphi. – СПб.: БХВ-Петербург, 2005.

12.  Архангельский А. Я. Программирование на Borland Delphi 7.0. – М: «Бином», 2004.

13.  Актуальные задачи развития Вооруженных сил Российской Федерации // издание «Красная звезда» от 11.10.2003.

14.  Аленичева Е. В., Монастырев П. В. Электронный учебник (проблемы создания и оценки качества) // Высшее образование в России, №1, 2001.

15.  ISO 9126:1991 Информационная технология. Оценка программного продукта. Характеристики качества и руководство по их применению.

16.  ГОСТ Р ИСО/МЭК 9126-93 “Информационные технологии. Оценка программной продукции. Характеристики качества и руководства по их применению”

17.  ГОСТ 19.101-77 ЕСПД «Виды программ и программных документов»

18.  ГОСТ 19.201-78 ЕСПД. Техническое задание. Требования к содержанию и оформлению.

19.  ГОСТ 19.401-78 ЕСПД. «Текст программы. Требования к содержанию и оформлению».

20.  ГОСТ 19.402-78 ЕСПД «Описание программы»

21.  ГОСТ 19.701-90 ЕСПД. «Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения в соответствии с ним».

22.  ГОСТ 24.211-82 «Требования к содержанию документа «Описание алгоритма»»

23.  ГОСТ-28195-95 “Оценка качества программных средств. Общие положения”.

24.  ГОСТ 12.1.004-85. ССБТ. Пожарная безопасность.


Приложение А

Алгоритм программы


Приложение Б

Текст программы

unit Unit1;

interface

uses

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

ExtCtrls, Menus, OpenGL, Buttons, ExtDlgs, ComCtrls, StdCtrls, Dialogs;

type

TRenderPanel = record

DC:HDC;

HRC:HGLRC;

ps:TPaintStruct;

end;

TMatrix = record

w:Integer; //размерность матрицы

vx:Array of Array of Extended;//массив вершин

nx:Array of Array of Array[1..3] of Extended;//массив нормалей

cx:Array of Array of Array[1..3] of GLfloat;//массив цветов

cc:Array of Array of Array[1..3] of GLfloat;//массив цветов

end;

PMatrix = ^TMatrix;

TMat = class(TForm)

Panel1: TPanel;

OpenPictureDialog1: TOpenPictureDialog;

Panel4: TPanel;

GroupBox1: TGroupBox;

Label1: TLabel;

Label2: TLabel;

Edit1: TEdit;

Edit2: TEdit;

UpDown1: TUpDown;

UpDown2: TUpDown;

Label3: TLabel;

Edit3: TEdit;

GroupBox2: TGroupBox;

Button2: TButton;

FoDialog: TOpenDialog;

Addons: TGroupBox;

SpeedButton1: TSpeedButton;

Button1: TButton;

Button3: TButton;

LBData: TListBox;

ListBox1: TListBox;

cb_Surface: TCheckBox;

progress: TPanel;

Label4: TLabel;

bar: TProgressBar;

ComboBoxMatrix: TComboBox;

BitBtnSave: TBitBtn;

SaveDialogMain: TSaveDialog;

procedure CalcNormals(x1,y1,z1,x2,y2,z2,x3,y3,z3:Extended; var nx,ny,nz:Extended);

procedure GL(var Matrix:TMatrix); //прорисовка матрицы на экран

procedure Init();

procedure SelPos(var Matrix:TMatrix; xx:Integer;yy:Integer);

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

//---------------------------------

function LoadMatrixFromBitmap(filename:string; var Matrix:TMatrix):boolean;

function LoadMatrixFromDtFile(filename:string; var Matrix:TMatrix):boolean;

function MakeAnalysMatrixData(Matrix01,Matrix02:TMatrix; var Matrix03:TMatrix):boolean;

//---------------------------------

procedure bmp1Click(Sender: TObject);

procedure Panel4MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Panel4MouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

procedure Panel4MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

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

procedure Edit1Change(Sender: TObject);

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

procedure Edit2Change(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure cb_SurfaceClick(Sender: TObject);

procedure ComboBoxMatrixChange(Sender: TObject);

procedure Edit3Change(Sender: TObject);

procedure BitBtnSaveClick(Sender: TObject);

private

MyPanels: TRenderPanel;

MCurrent: PMatrix;

myMatrix01:TMatrix; //первое изображение

myMatrix02:TMatrix; //второе изображение

myMatrix03:TMatrix; //наложение первого на второе

// w:Integer; //размерность матрицы

// vx:Array of Array of Extended;//массив вершин

// nx:Array of Array of Array[1..3] of Extended;//массив нормалей

// cx:Array of Array of Array[1..3] of GLfloat;//массив цветов

// cc:Array of Array of Array[1..3] of GLfloat;//массив цветов

mess:string;

bmp:TBitmap;

procedure InitOpenGL;

procedure SetDCPixelFormat(DC:HDC);

end;

var

yess: Boolean;

Mat: TMat;

MouseButton : Integer;

Xcoord, Ycoord, Zcoord : Integer;

YRot, XRot : integer;

Depth : integer;

LastCCX,LastCCY : Integer;

//-----------------------------------------------------------------------------

implementation

//-----------------------------------------------------------------------------

uses UAbout;

{$R *.dfm}

procedure TMat.InitOpenGL;

begin

MyPanels.DC:=GetDC(Panel4.Handle);

SetDCPixelFormat(MyPanels.DC);

MyPanels.HRC:=wglCreateContext(MyPanels.DC);

wglMakeCurrent(MyPanels.DC,MyPanels.HRC);

glEnable(GL_DEPTH_TEST);

glClearColor(0,0,0,1);

end;

procedure TMat.SetDCPixelFormat(DC:HDC);

var

pfd:TPixelFormatDescriptor;

nPixelFormat:Integer;

begin

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

pfd.dwFlags:=PFD_DOUBLEBUFFER or

PFD_DRAW_TO_WINDOW or

PFD_SUPPORT_OPENGL;

nPixelFormat:=ChoosePixelFormat(DC,@pfd);

SetPixelFormat(DC,nPixelFormat,@pfd);

end;

procedure TMat.FormCreate(Sender: TObject);

begin

MouseButton :=0;

bmp:=TBitmap.Create;

InitOpenGL;

Left:=0;

Top:=0;

LastCCX:=0;

LastCCY:=0;

self.MCurrent := @self.myMatrix01;

self.ComboBoxMatrix.ItemIndex := 0;

// Width:=Screen.Width;

// Height:=Screen.Height;

// WindowState:=wsMaximized;

// Timer1.Enabled:=True;

end;

procedure TMat.FormDestroy(Sender: TObject);

begin

wglMakeCurrent(0,0);

bmp.Destroy;

Finalize(myMatrix01.vx);

Finalize(myMatrix01.cx);

Finalize(myMatrix01.cc);

Finalize(myMatrix01.nx);

Finalize(myMatrix02.vx);

Finalize(myMatrix02.cx);

Finalize(myMatrix02.cc);

Finalize(myMatrix02.nx);

Finalize(myMatrix03.vx);

Finalize(myMatrix03.cx);

Finalize(myMatrix03.cc);

Finalize(myMatrix03.nx);

wglDeleteContext(MyPanels.HRC);

ReleaseDC(MyPanels.DC,Panel4.Handle);

DeleteDC(MyPanels.DC);

end;

procedure TMat.GL(var Matrix:TMatrix);

var

j,k,dw,dv : Integer;

ps : TPaintStruct;

av : Integer;

stroka:string;

begin

av:=0;

dw:=0;

dv:=0;

if (Yess=true) then

begin

GroupBox1.Enabled:=True;

dw:=Matrix.w div 2;

dv:=25 div 2;

BeginPaint(Panel4.Handle,ps);

wglMakeCurrent(MyPanels.DC,MyPanels.HRC);

glViewport(0,0,Panel4.Width,Panel4.Height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity;

gluPerspective(30,Panel4.Width/Panel4.Height,1,10000);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity;

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glLoadIdentity;

glTranslatef(0,0,-Zcoord);

glRotatef(Xrot,1,0,0);

glRotatef(Yrot,0,1,0);

try

if (Matrix.w>5) then

If cb_Surface.Checked then av:=2 else av:=1;

case av of

1 : begin

glDisable(GL_LIGHTING);

glDisable(GL_LIGHT0);

glColor3f(1,1,1);

glBegin(GL_LINES);

for j:=0 to Matrix.w-2 do

for k:=0 to Matrix.w-2 do

begin

glColor3f(Matrix.cx[j,k,1],Matrix.cx[j,k,2],Matrix.cx[j,k,3]);

glVertex3f(j-dw,Matrix.vx[j,k]-dv,k-dw);

glColor3f(Matrix.cx[j,k+1,1],Matrix.cx[j,k+1,2],Matrix.cx[j,k+1,3]);

glVertex3f(j-dw,Matrix.vx[j,k+1]-dv,k+1-dw);

end;

for j:=0 to Matrix.w-2 do

for k:=0 to Matrix.w-2 do

begin

glColor3f(Matrix.cx[j,k,1],Matrix.cx[j,k,2],Matrix.cx[j,k,3]);

glVertex3f(j-dw,Matrix.vx[j,k]-dv,k-dw);

glColor3f(Matrix.cx[j+1,k,1],Matrix.cx[j+1,k,2],Matrix.cx[j+1,k,3]);

glVertex3f(j+1-dw,Matrix.vx[j+1,k]-dv,k-dw);

end;

glEnd;

end;

2 : begin

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

glEnable(GL_COLOR_MATERIAL);

glColor3f(1,1,1);

glBegin(GL_TRIANGLES);

for j:=0 to Matrix.w-2 do

for k:=0 to Matrix.w-2 do

begin

glColor3f(Matrix.cx[j,k,1],Matrix.cx[j,k,2],Matrix.cx[j,k,3]);

glNormal3f(Matrix.nx[j,k,1],Matrix.nx[j,k,2],Matrix.nx[j,k,3]);

glVertex3f(j-dw,Matrix.vx[j,k]-dv,k-dw);

glColor3f(Matrix.cx[j+1,k,1],Matrix.cx[j+1,k,2],Matrix.cx[j+1,k,3]);

glNormal3f(Matrix.nx[j+1,k,1],Matrix.nx[j+1,k,2],Matrix.nx[j+1,k,3]);

glVertex3f(j-dw+1,Matrix.vx[j+1,k]-dv,k-dw);

glColor3f(Matrix.cx[j+1,k+1,1],Matrix.cx[j+1,k+1,2],Matrix.cx[j+1,k+1,3]);

glNormal3f(Matrix.nx[j+1,k+1,1],Matrix.nx[j+1,k+1,2],Matrix.nx[j+1,k+1,3]);

glVertex3f(j-dw+1,Matrix.vx[j+1,k+1]-dv,k-dw+1);

end;

for j:=0 to Matrix.w-2 do

for k:=0 to Matrix.w-2 do

begin

glColor3f(Matrix.cx[j,k,1],Matrix.cx[j,k,2],Matrix.cx[j,k,3]);

glNormal3f(Matrix.nx[j,k,1],Matrix.nx[j,k,2],Matrix.nx[j,k,3]);

glVertex3f(j-dw,Matrix.vx[j,k]-dv,k-dw);

glColor3f(Matrix.cx[j,k+1,1],Matrix.cx[j,k+1,2],Matrix.cx[j,k+1,3]);

glNormal3f(Matrix.nx[j,k+1,1],Matrix.nx[j,k+1,2],Matrix.nx[j,k+1,3]);

glVertex3f(j-dw,Matrix.vx[j,k+1]-dv,k-dw+1);

glColor3f(Matrix.cx[j+1,k+1,1],Matrix.cx[j+1,k+1,2],Matrix.cx[j+1,k+1,3]);

glNormal3f(Matrix.nx[j+1,k+1,1],Matrix.nx[j+1,k+1,2],Matrix.nx[j+1,k+1,3]);

glVertex3f(j-dw+1,Matrix.vx[j+1,k+1]-dv,k-dw+1);

end;

glEnd;

glDisable(GL_COLOR_MATERIAL);

end;

end;

except

Matrix.w:=0;

MessageBox(Handle,'Ошибка при прорисовке изображения',

'Ошибка',MB_OK or MB_ICONERROR);

end;

EndPaint(Panel4.Handle,ps);

glRotatef(120,1.0,0.0,0.0); // Rotate on x

glRotatef(120,0.0,1.0,0.0); // Rotate on y

glRotatef(120,0.0,0.0,1.0); // Rotate on z

SwapBuffers(MyPanels.DC);

//временная защита кода

// stroka := 'Это демонстрационная версия!!!';

// TextOut(myPanels.DC,300,200,PChar(stroka),Length(stroka));

// stroka := 'Программа сделана на заказ!!!';

// TextOut(myPanels.DC,300,220,PChar(stroka),Length(stroka));

// stroka := 'лоалофв аофоа длфыв а лдо';

// TextOut(myPanels.DC,300,240,PChar(stroka),Length(stroka));

end;

end;

procedure TMat.SelPos(var Matrix:TMatrix; xx:Integer;yy:Integer);

var

fx:Integer;

s:string;

begin

if (Matrix.w>0) then

begin

for fx := 0 to Matrix.w-1 do

begin

Matrix.cx[LastCCx,fx,1]:=Matrix.cc[LastCCx,fx,1];

Matrix.cx[LastCCx,fx,2]:=Matrix.cc[LastCCx,fx,2];

Matrix.cx[LastCCx,fx,3]:=Matrix.cc[LastCCx,fx,3];

Matrix.cx[fx,LastCCy,1]:=Matrix.cc[fx,LastCCy,1];

Matrix.cx[fx,LastCCy,2]:=Matrix.cc[fx,LastCCy,2];

Matrix.cx[fx,LastCCy,3]:=Matrix.cc[fx,LastCCy,3];

Matrix.cx[xx,fx,1]:=1;

Matrix.cx[xx,fx,2]:=1;

Matrix.cx[xx,fx,3]:=1;

Matrix.cx[fx,yy,1]:=1;

Matrix.cx[fx,yy,2]:=1;

Matrix.cx[fx,yy,3]:=1;

end;

LastCCx:=xx;

LastCCy:=yy;

s:=FormatFloat('0.00', Matrix.vx[LastCCx,LastCCy]);

// if Matrix.vx[LastCCx,LastCCy] < 0 then s:= '-'+s;

// Edit3.Text:=FloatToStr(Round(Matrix.vx[LastCCx,LastCCy]*100)/100);

Edit3.Text := s;

end; трехмерный изображение матричный графический

end;

//-----------------------------------------------------------------------------

function TMat.LoadMatrixFromBitmap(filename:string; var Matrix:TMatrix):boolean;

var

i,j :Integer;

ss : string;

begin

Result := false;

if not FileExists(filename) then exit;

with Matrix do

begin

bmp.Width:=0;

bmp.Height:=0;

bmp.LoadFromFile(OpenPictureDialog1.FileName);

w:=bmp.Width;

UpDown1.Max:=w;

UpDown2.Max:=w;

LastCCX:=w div 2;

LastCCY:=w div 2;

SetLength(vx,w);

SetLength(nx,w);

SetLength(cx,w);

SetLength(cc,w);

for i:=0 to w-1 do

begin

SetLength(vx[i],w);

SetLength(nx[i],w);

SetLength(cx[i],w);

SetLength(cc[i],w);

end;

ss:='';

ListBox1.Items.Clear;

for i:=0 to w-1 do

begin

for j:=0 to w-1 do

begin

vx[i,j]:=(GetRValue(bmp.Canvas.Pixels[i,j])+

GetGValue(bmp.Canvas.Pixels[i,j])+

GetBValue(bmp.Canvas.Pixels[i,j]))/50;

if vx[i,j]>10 then vx[i,j]:=9+(random(99)+1)/100;

ss:=ss+FormatFloat('0.00', vx[i,j])+' ';

cx[i,j,1]:=GetRValue(bmp.Canvas.Pixels[i,j])/255;

cx[i,j,2]:=GetGValue(bmp.Canvas.Pixels[i,j])/255;

cx[i,j,3]:=GetBValue(bmp.Canvas.Pixels[i,j])/255;

cc[i,j,1]:=GetRValue(bmp.Canvas.Pixels[i,j])/255;

cc[i,j,2]:=GetGValue(bmp.Canvas.Pixels[i,j])/255;

cc[i,j,3]:=GetBValue(bmp.Canvas.Pixels[i,j])/255;

end;

ListBox1.Items.Add(ss);

ss:='';

end;

Zcoord :=w*2;

SelPos(Matrix, LastCCX, LastCCY);

UpDown1.Position:=LastCCX;

UpDown2.Position:=LastCCY;

end;

Result := true;

end;

function TMat.LoadMatrixFromDtFile(filename:string; var Matrix:TMatrix):boolean;

var

i,x,y,j,k,posp,posbar:Integer;

spr,sfl,ss,formfl:String;

Fres : TFloatRec;

Conv : Extended ;

coint :integer;

ValStr :Extended;

begin

Result := false;

if not FileExists(filename) then exit;

with Matrix do

begin

LBData.Items.Clear;

bar.Position:=0;

progress.Visible:=True;

progress.Update;

LBData.Items.LoadFromFile(FileName);

if LBData.Items.Count>5 then

begin

bar.Position:=5;

bar.Update;

w:=LBData.Items.Count;

UpDown1.Max:=w;

UpDown2.Max:=w;

LastCCX:=w div 2;

LastCCY:=w div 2;

SetLength(vx,w);

SetLength(nx,w);

SetLength(cx,w);

SetLength(cc,w);

for i:=0 to w-1 do

begin

SetLength(vx[i],w);

SetLength(nx[i],w);

SetLength(cx[i],w);

SetLength(cc[i],w);

for y :=0 to w-1 do

begin

vx[i,y]:=0;

nx[i,y,1]:=0;

nx[i,y,2]:=0;

nx[i,y,3]:=0;

cx[i,y,1]:=0;

cx[i,y,2]:=0;

cx[i,y,3]:=0;

cc[i,y,1]:=0;

cc[i,y,2]:=0;

cc[i,y,3]:=0;

end;

end;

yess:=True;

mess:='';

for y :=0 to w-1 do

begin

spr:=LBData.Items[y];

x:=0;

while (((pos(' ',spr)>0) or (Length(spr)>0)) and (Yess=True) and (x<w)) do

begin

posp:=pos(' ',spr);

If (posp>0) then

begin

sfl:=trim (copy(spr,0,posp));

delete(spr,1,posp);

ValStr:=strtofloatdef(sfl,-100);

If (ValStr=-100) then

begin

yess:=False;

if (Length(mess)=0) then mess:='Неверное значение'+#13#10+'строка '+ IntToStr(y+1)+#13#10+'позиция '+IntToStr(x+1)+#13#10+'['+sfl+']';

break;

end;

If ((ValStr<-10) or (ValStr>10)) then

begin

yess:=False;

if (Length(mess)=0) then mess:='Значение >10, либо <-10'+#13#10+'строка '+ IntToStr(y+1)+#13#10+'позиция '+IntToStr(x+1)+#13#10+'['+sfl+']';

break;

end else vx[x,y]:=ValStr;

end else

begin

spr:=Trim(spr);

ValStr:=strtofloatdef(spr,-100);

If (ValStr=-100) then

begin

yess:=False;

if (Length(mess)=0) then mess:='Неверное значение'+#13#10+'строка '+ IntToStr(y+1)+#13#10+'позиция '+IntToStr(x+1)+#13#10+'['+spr+']';

break;

end;

If ((ValStr<-10) or (ValStr>10)) then

begin

yess:=False;

if (Length(mess)=0) then mess:='Значение >10, либо <-10'+#13#10+'строка '+ IntToStr(y+1)+#13#10+'позиция '+IntToStr(x+1)+#13#10+'['+spr+']';

break;

end else vx[x,y]:=ValStr;

spr:='';

end;

inc(x);

end;

formfl := FormatFloat('0',70*(((y+1)*(x))/(w*w)));

coint:=StrToInt(formfl);

bar.Position:=5+coint;

bar.Update;

// mat.Caption :=mat.Caption+inttostr(x)+' ';

if (x<w) then

begin

Yess:=false;

if (Length(mess)=0) then mess:='строка '+ IntToStr(y+1)+#13#10+'короткая, либо излишек строк в файле';

break;

end;

if (spr<>'') then

begin

Yess:=false;

if (Length(mess)=0) then mess:='строка '+ IntToStr(y+1)+#13#10+'длинная, либо недостаточно строк в файле';

break;

end;

end;

end else

begin

Yess:=false;

mess:='Форма должна иметь'+#13#10+'размер более чем 5х5';

end;

if Yess=true then

begin

bar.Position:=90;

bar.Update;

for i:=0 to w-1 do

begin

for j:=0 to w-1 do

begin

cx[i,j,1]:=(vx[i,j]+1)/9;

cx[i,j,2]:=1-vx[i,j+1]/9;

cx[i,j,3]:=0;

cc[i,j,1]:=(vx[i,j]+1)/9;

cc[i,j,2]:=1-vx[i,j+1]/9;

cc[i,j,3]:=0;

end;

end;

for i:=0 to w-1 do

for j:=0 to w-1 do

for k:=1 to 3 do

nx[i,j,k]:=1;

for i:=0 to w-2 do

for j:=0 to w-2 do

begin

CalcNormals(i,vx[i,j],j,

i+1,vx[i+1,j],j,

i+1,vx[i+1,j+1],j+1,

nx[i,j,1],nx[i,j,2],nx[i,j,3]);

end;

bar.Position:=100;

bar.Update;

Zcoord :=w*2;

XRot:=90;

YRot:=0;

UpDown1.Position:=LastCCX;

UpDown2.Position:=LastCCY;

SelPos(Matrix,LastCCX, LastCCY);

progress.Hide;

Panel4.Show;

end;

end;

Result := Yess;

end;

//-----------------------------------------------------------------------------

procedure TMat.bmp1Click(Sender: TObject);

begin

try

if OpenPictureDialog1.Execute then

if FileExists(OpenPictureDialog1.FileName) then

begin

self.LoadMatrixFromBitmap(OpenPictureDialog1.FileName,self.MCurrent^);

self.GL(self.MCurrent^);

end else

MessageBox(Handle,

PAnsiChar('Файл '+OpenPictureDialog1.FileName+' не найден'),

'Ошибка',MB_OK or MB_ICONERROR);

except

MessageBox(Handle,

PAnsiChar('Ошибка во время загрузки файла '+

OpenPictureDialog1.FileName),

'Ошибка',MB_OK or MB_ICONERROR);

end;

end;

procedure TMat.Panel4MouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

if Button = mbLeft then

begin

MouseButton :=1;

Xcoord := X;

Ycoord := Y;

end;

if Button = mbRight then

begin

MouseButton :=2;

Zcoord := Y;

end;

end;

procedure TMat.Panel4MouseMove(Sender: TObject; Shift: TShiftState;

X, Y: Integer);

begin

if MouseButton = 1 then

begin

xRot := xRot + (Y - Ycoord) div 2; // moving up and down = rot around X-axis

yRot := yRot + (X - Xcoord)div 2;

Xcoord := X;

Ycoord := Y;

GL(self.MCurrent^);

end;

if MouseButton = 2 then

begin

Depth :=Depth - (Y-ZCoord) div 3;

Zcoord := Y;

GL(self.MCurrent^);

end;

// caption:=inttostr(xRot)+':'+inttostr(yRot);

end;

procedure TMat.Panel4MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

MouseButton :=0;

end;

procedure TMat.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

if Ord(Key)<>8 then if ((key<'0') or (key>'9')) then Key:=#0;

end;

procedure TMat.Edit1Change(Sender: TObject);

var

x:Integer;

begin

If TryStrToInt(Edit1.Text,x)

then begin

if x>self.MCurrent^.w then Edit1.Text:=IntToStr(self.MCurrent^.w);

If x<2 then Edit1.Text:='1';

end

else begin

Edit1.Text:='1';

end;

SelPos(self.MCurrent^,UpDown1.Position-1,LastCCY);

GL(self.MCurrent^);

end;

procedure TMat.Edit2KeyPress(Sender: TObject; var Key: Char);

begin

if Ord(Key)<>8 then if ((key<'0') or (key>'9')) then Key:=#0;

end;

procedure TMat.Edit2Change(Sender: TObject);

var

x:Integer;

begin

If TryStrToInt(Edit2.Text,x)

then begin

if x>self.MCurrent^.w then Edit2.Text:=IntToStr(self.MCurrent^.w);

If x<2 then Edit2.Text:='1';

end

else begin

Edit2.Text:='1';

end;

SelPos(self.MCurrent^,LastCCX,UpDown2.Position-1);

GL(self.MCurrent^);

end;

procedure TMat.CalcNormals(x1,y1,z1,x2,y2,z2,x3,y3,z3:Extended; var nx,ny,nz:Extended);

var

wrki: Double;

vx1,vy1,vz1,vx2,vy2,vz2: Double;

begin

vx1:=x1-x2;

vy1:=y1-y2;

vz1:=z1-z2;

vx2:=x2-x3;

vy2:=y2-y3;

vz2:=z2-z3;

wrki:=sqrt(sqr(vy1*vz2-vz1*vy2)+sqr(vz1*vx2-vx1*vz2)+sqr(vx1*vy2-vy1*vx2));

nx:=-(vy1 * vz2 - vz1 * vy2)/wrki;

ny:=-(vz1 * vx2 - vx1 * vz2)/wrki;

nz:=-(vx1 * vy2 - vy1 * vx2)/wrki;

end;

procedure TMat.Button1Click(Sender: TObject);

begin

ListBox1.Items.SaveToFile(ChangeFileExt(Application.ExeName,'.txt'));

end;

procedure TMat.Init();

begin

Edit1.OnChange :=Edit1Change;

Edit1.OnKeyPress :=Edit1KeyPress;

Edit2.OnChange :=Edit2Change;

Edit2.OnKeyPress :=Edit2KeyPress;

Panel4.OnMouseDown :=Panel4MouseDown;

Panel4.OnMouseMove :=Panel4MouseMove;

Panel4.OnMouseUp :=Panel4MouseUp;

end;

procedure TMat.Button3Click(Sender: TObject);

begin

About.ShowModal;

end;

procedure TMat.Button4Click(Sender: TObject);

begin

Edit1.OnChange :=nil;

Edit1.OnKeyPress :=nil;

Edit2.OnChange :=nil;

Edit2.OnKeyPress :=nil;

Panel4.OnMouseDown :=nil;

Panel4.OnMouseMove :=nil;

Panel4.OnMouseUp :=nil;

Close;

end;

//проводим анализ данных, точки совпадения красным, ниже синим, выше зеленым

function TMat.MakeAnalysMatrixData(Matrix01,Matrix02:TMatrix; var Matrix03:TMatrix):boolean;

var

i,j,k,y:integer;

begin

Result := false;

//инициализация результ. матрицы

Matrix03.w := Matrix01.w;

with Matrix03 do

begin

SetLength(vx,w);

SetLength(nx,w);

SetLength(cx,w);

SetLength(cc,w);

for i:=0 to w-1 do

begin

SetLength(vx[i],w);

SetLength(nx[i],w);

SetLength(cx[i],w);

SetLength(cc[i],w);

for y :=0 to w-1 do

begin

vx[i,y]:=Matrix01.vx[i,y];

nx[i,y,1]:=Matrix01.nx[i,y,1];

nx[i,y,2]:=Matrix01.nx[i,y,2];

nx[i,y,3]:=Matrix01.nx[i,y,3];

cx[i,y,1]:=Matrix01.cx[i,y,1];

cx[i,y,2]:=Matrix01.cx[i,y,2];

cx[i,y,3]:=Matrix01.cx[i,y,3];

cc[i,y,1]:=Matrix01.cc[i,y,1];

cc[i,y,2]:=Matrix01.cc[i,y,2];

cc[i,y,3]:=Matrix01.cc[i,y,3];

cx[i,y,1]:=255;

cx[i,y,2]:=255;

cx[i,y,3]:=255;

//часть первого, которая не пересеклась со вторым

//окрашиваем в желтый цвет

if Matrix02.vx[i,y] = 0 then

begin

cx[i,y,1]:=(vx[i,y]+1)/6;

cx[i,y,2]:=(vx[i,y]+1)/6;

cx[i,y,3]:=0;

end;

//часть второго, которая не пересеклась с первой

//окрашиваем в красный цвет

if Matrix01.vx[i,y] = 0 then

begin

vx[i,y]:=Matrix02.vx[i,y];

cx[i,y,1]:=(vx[i,y]+1)/6;

cx[i,y,2]:=0;

cx[i,y,3]:=0;

end;

//если нет поверхностей => зеленый

if (Matrix01.vx[i,y] = 0)

and (Matrix02.vx[i,y] = 0)then

begin

cx[i,y,1]:=0;

cx[i,y,2]:=(vx[i,y]+1)/2;

cx[i,y,3]:=0;

end;

//совпадающие обозначае зеленым цветом

if (Matrix01.vx[i,y] = Matrix02.vx[i,y])

and (Matrix01.vx[i,y] <> 0)

and (Matrix02.vx[i,y] <> 0)then

begin

cx[i,y,1]:=0;

cx[i,y,2]:=(vx[i,y]+1)/2;

cx[i,y,3]:=0;

end;

//те, которые выше - делаем зеленым

if (Matrix01.vx[i,y] < Matrix02.vx[i,y])

and (Matrix01.vx[i,y] <> 0)

and (Matrix02.vx[i,y] <> 0)then

begin

vx[i,y]:=Matrix02.vx[i,y];

cx[i,y,1]:=0;

cx[i,y,2]:=(vx[i,y]+1)/2;;

cx[i,y,3]:=0;

end;

//те, которые ниже будут синим

if (Matrix01.vx[i,y] > Matrix02.vx[i,y])

and (Matrix01.vx[i,y] <> 0)

and (Matrix02.vx[i,y] <> 0)then

begin

cx[i,y,1]:=(vx[i,y]+1)/6;

cx[i,y,2]:=0;

cx[i,y,3]:=0;

end;

cc[i,y,1]:=cx[i,y,1];

cc[i,y,2]:=cx[i,y,2];

cc[i,y,3]:=cx[i,y,3];

end;

end;

end;

{

w:Integer; //размерность матрицы

vx:Array of Array of Extended;//массив вершин

nx:Array of Array of Array[1..3] of Extended;//массив нормалей

cx:Array of Array of Array[1..3] of GLfloat;//массив цветов

cc:Array of Array of Array[1..3] of GLfloat;//массив цветов

}

Result := true;

end;

procedure TMat.cb_SurfaceClick(Sender: TObject);

begin

GL(self.MCurrent^);

end;

procedure TMat.Button2Click(Sender: TObject);

begin

//возможно, режим анализа поверхностей

if self.ComboBoxMatrix.ItemIndex = 2 then

begin

if not self.MakeAnalysMatrixData(self.myMatrix01, self.myMatrix02, self.myMatrix03) then

begin

ShowMessage('Не удалось провести анализ поверхностей!');

end;

self.GL(self.MCurrent^);

exit;

end;

Panel4.Hide;

FoDialog.InitialDir:=ExtractFilePath(Application.ExeName);

If FoDialog.Execute then

begin

if self.LoadMatrixFromDtFile(FoDialog.FileName,self.MCurrent^) then

begin

self.GL(self.MCurrent^);

end else //Yess=false

begin

progress.Hide;

MessageBox(Handle,PAnsiChar('Ошибка в файле данных!'+#13#10+self.mess),PAnsiChar('Ошибка'),MB_OK or MB_ICONINFORMATION);

Panel4.Hide;

// w:=0;

end;

end;

end;

procedure TMat.ComboBoxMatrixChange(Sender: TObject);

begin

if self.ComboBoxMatrix.ItemIndex = 0 then self.MCurrent := @self.myMatrix01;

if self.ComboBoxMatrix.ItemIndex = 1 then self.MCurrent := @self.myMatrix02;

if self.ComboBoxMatrix.ItemIndex = 2 then self.MCurrent := @self.myMatrix03;

self.Button2.Caption := 'Загрузить';

if self.ComboBoxMatrix.ItemIndex = 2 then self.Button2.Caption := 'Провести анализ';

self.GL(self.MCurrent^);

exit;

end;

procedure TMat.Edit3Change(Sender: TObject);

var

pos_x:integer;

pos_y:integer;

value:real;

begin

//изменение значения вершины

pos_x := self.UpDown1.Position-1;

pos_y := self.UpDown2.Position-1;

value := StrToFloatDef(self.Edit3.Text,-1000);

if value > -1000 then

self.MCurrent^.vx[pos_x,pos_y] := value;

// else

// self.Edit3.Text := FloatToStr(self.MCurrent^.vx[pos_x,pos_y]);

//теперь просчитываем цвета

With self.MCurrent^ do

begin

cx[pos_x,pos_y,1]:=(vx[pos_x,pos_y]+1)/9;

cx[pos_x,pos_y,2]:=1-vx[pos_x,pos_y+1]/9;

cx[pos_x,pos_y,3]:=0;

cc[pos_x,pos_y,1]:=(vx[pos_x,pos_y]+1)/9;

cc[pos_x,pos_y,2]:=1-vx[pos_x,pos_y+1]/9;

cc[pos_x,pos_y,3]:=0;

end;

//после изменений перерисовываем

self.GL(self.MCurrent^);

exit;

end;

procedure TMat.BitBtnSaveClick(Sender: TObject);

var

Spisok:TStringList;

stroka:string;

k,y:integer;

begin

//button "save" click

if self.MCurrent^.w = 0 then

begin

ShowMessage('Матрица не загружена!');

exit;

end;

if self.SaveDialogMain.FileName = '' then

self.SaveDialogMain.InitialDir := ExtractFileDir(ParamStr(0));

if not self.SaveDialogMain.Execute() then exit;

//---------------------------------------------

Spisok := TStringList.Create();

with self.MCurrent^ do

begin

for y:= 0 to w-1 do

begin

stroka := '';

for k:= 0 to w-1 do

begin

stroka := stroka + ' ' + FloatToStr(vx[k,y]);

continue;

end;

stroka := trim(stroka);

Spisok.Add(stroka);

end;

end;

Spisok.SaveToFile(self.SaveDialogMain.FileName);

Spisok.Free();

//---------------------------------------------

ShowMessage('Матрица была сохранена.');

exit;

end;

end.

);

var

Spisok:TStringList;

stroka:string;

k,y:integer;

begin

//button "save" click

if self.MCurrent^.w = 0 then

begin

ShowMessage('Матрица не загружена!');

exit;

end;

if self.SaveDialogMain.FileName = '' then

self.SaveDialogMain.InitialDir := ExtractFileDir(ParamStr(0));

if not self.SaveDialogMain.Execute() then exit;

//---------------------------------------------

Spisok := TStringList.Create();

with self.MCurrent^ do

begin

for y:= 0 to w-1 do

begin

stroka := '';

for k:= 0 to w-1 do

begin

stroka := stroka + ' ' + FloatToStr(vx[k,y]);

continue;

end;

stroka := trim(stroka);

Spisok.Add(stroka);

end;

end;

Spisok.SaveToFile(self.SaveDialogMain.FileName);

Spisok.Free();

//---------------------------------------------

ShowMessage('Матрица была сохранена.');

exit;

end;

end.


[1]) Расчет обобщенного показателя производится в соответствии с методикой оценки качества программного обеспечения, разработанной на кафедре оценки эффективности Военной академии воздушно-космической обороны.

[2]) в отдельных случаях эксплуатация программы допускается при превышении            указанного значения


Страницы: 1, 2, 3


на тему рефераты
НОВОСТИ на тему рефераты
на тему рефераты
ВХОД на тему рефераты
Логин:
Пароль:
регистрация
забыли пароль?

на тему рефераты    
на тему рефераты
ТЕГИ на тему рефераты

Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое.


Copyright © 2012 г.
При использовании материалов - ссылка на сайт обязательна.