![]() |
|
|
Дипломная работа: Разработка программной системы, обеспечивающей отображение и сравнение в трехмерном пространстве исходных данных из двух матричных формЗтек оц – текущие затраты, связанные с эксплуатацией задачи на ЭВМ, которые связаны с решением задачи на ВТ (заработная плата должностных лиц, обслуживающих компьютеры, электроэнергия, амортизация); Зк оц – затраты на приобретение компьютерной техники, покупка программных продуктов для автоматизации задачи и обучение сотрудников. С учетом вышеизложенного, формула для расчета годового экономического эффекта приобретает вид:
Здесь:
где: Тр – трудоемкость одноразового решения задачи вручную; кр – периодичность решения задачи в течение года; tr – среднечасовая тарифная ставка должностного лица; n – коэффициент, учитывающий премии и доклады; R – коэффициент отчисления от фонда оплаты труда; Ен – нормативный коэффициент эффективности капитальных затрат, принимается равным 0.15. Тр=0.32 ч; кр = 500 опер.; tr = 107 руб.; n = 1,4; R =1,36.
где: Титр – трудоемкость одноразового решения задачи автоматизировано.
где: Тпр – продолжительность разработки программы в мес; кл – количество человек, участвующих в разработке; Fм – месячный фонд времени работы; tr – среднечасовая тарифная ставка разработчика. Тпр=1 мес.; кл = 1 чел.; Fм = 80 час. (при норм. усл.); tr = 100 руб.;
где: Тм – время машинной реализации задачи; Сэвм – стоимость ЭВМ, программных продуктов и обучения должностных лиц; Fэвм – действительный фонд времени ЭВМ в течение года. Тм=0.015 час; Сэвм=15000 руб.; Fэвм=2880 час; Зк оц=(0.015 500 15000)/2880 ≈ 39 руб.
где: Зитр – заработная плата должностных лиц, обслуживающих ЭВМ; А – амортизация (A=0.12 Сэвм=1800 руб.); Зэл – затраты на электроэнергию.
где: Fгод – годовой фонд заработной платы должностных лиц, обслуживающих ЭВМ; Зитр=(216000/2880) 0.015 500 1.4 1.36 =1071 руб.
где: Кис – коэффициент использования энергоустановок по мощности; СУМэвм – суммарная установленная мощность ЭВМ; Цэл – стоимость одного кВт/ч энергии. Кис=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.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]) в отдельных случаях эксплуатация программы допускается при превышении указанного значения |
![]() |
||
НОВОСТИ | ![]() |
![]() |
||
ВХОД | ![]() |
|
Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое. |
||
При использовании материалов - ссылка на сайт обязательна. |