Отчет по практике в вычислительном центре АМТИ

Автор работы: Пользователь скрыл имя, 15 Марта 2012 в 18:44, отчет по практике

Краткое описание

В работе изложен взгляд на проблему оптимизации работы сотрудников подразделения института “Библиотека АМТИ ”, сделана постановка задачи на разработку АСУ подразделения. Рассмотрены возможности проектирования трёхмерного изображения твердого тела, преобразования графических объектов в пространстве. Выполнены практические задания: трёхмерное изображение сложного твёрдого тела и его проекции в среде AutoCAD 2000; разработана программа в среде С++ Builder, выполняющая преобразования графических объектов пространстве, использующая объект имидж, Open GL, API функции. Реализован алгоритм удаления невидимых линий.

Содержание работы

Введение 5
1 AutoCAD 2000 – мощный инструмент проектирования трёхмерных объектов 6
2 Исследование работы подразделения «Библиотека АМТИ» 8
3 Программирование трёхмерных объектов в среде C++ Builder 10
4 Алгоритм преобразования объектов в пространстве 12
5 Алгоритмы удаления невидимых линий 13
6 Листинг программы 14
Заключение 33
Литература

Содержимое работы - 1 файл

Отчёт о прохождении практики.doc

— 194.50 Кб (Скачать файл)

       Form1->Image1->Canvas->Pen->Style=psSolid;

       Form1->Image1->Canvas->Pen->Width=3;

       }

       else {

    //иначе грань невидима устанавливаем пунктирную линию

       Form1->Image1->Canvas->Pen->Width=1;

       Form1->Image1->Canvas->Pen->Style=psDot;

       }

    //рисуем грань линиями от вершины к вершине

       Form1->Image1->Canvas->MoveTo(x0+x1,y0-y1);

       Form1->Image1->Canvas->LineTo(x0+x2,y0-y2);

       Form1->Image1->Canvas->LineTo(x0+x7,y0-y7);

       Form1->Image1->Canvas->LineTo(x0+x6,y0-y6);

       Form1->Image1->Canvas->LineTo(x0+x1,y0-y1);

 

     //вычисляем нормаль к грани и анализируем её направление

       Zn1=-(x10-x5)*(y4-y5)+(x4-x5)*(y10-y5);

      //если координата z нормали положительна - грань видима

       if (Zn1>0){

     // устанавлимаем жирный и спложной тип линии

       Form1->Image1->Canvas->Pen->Style=psSolid;

       Form1->Image1->Canvas->Pen->Width=3;

       }

       else {

     //иначе грань невидима устанавливаем пунктирную линию

       Form1->Image1->Canvas->Pen->Width=1;

       Form1->Image1->Canvas->Pen->Style=psDot;

       }

     //рисуем грань линиями от вершины к вершине

       Form1->Image1->Canvas->MoveTo(x0+x5,y0-y5);

       Form1->Image1->Canvas->LineTo(x0+x4,y0-y4);

       Form1->Image1->Canvas->LineTo(x0+x9,y0-y9);

       Form1->Image1->Canvas->LineTo(x0+x10,y0-y10);

       Form1->Image1->Canvas->LineTo(x0+x5,y0-y5);

  }

//процедура рисования многогранника средствами api

void MyFapi(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int x5, int y5, int x6, int y6, int x7, int y7, int x8, int y8, int x9, int y9, int x10, int y10){

       //вычисляем координаты центра

       int x0=(Form1->Image1->Width)/2;

       int y0=(Form1->Image1->Height)/2;

       //вычисляем и анализируем координату z нормали

       float Zn1=-(x5-x1)*(y2-y1)+(x2-x1)*(y5-y1);

       if (Zn1>0){

       //если координата положительная рисуем грань, иначе не рисуем

       MoveToEx(Form1->Image2->Canvas->Handle,x0+x1,y0-y1,0);

       LineTo(Form1->Image2->Canvas->Handle,x0+x2,y0-y2);

       LineTo(Form1->Image2->Canvas->Handle,x0+x3,y0-y3);

       LineTo(Form1->Image2->Canvas->Handle,x0+x4,y0-y4);

       LineTo(Form1->Image2->Canvas->Handle,x0+x5,y0-y5);

       LineTo(Form1->Image2->Canvas->Handle,x0+x1,y0-y1); }

 

       //вычисляем и анализируем координату z нормали

       Zn1=-(x9-x8)*(y7-y8)+(x7-x8)*(y9-y8);

       if (Zn1>0){

       //если координата положительная рисуем грань, иначе не рисуем

       MoveToEx(Form1->Image2->Canvas->Handle,x0+x6,y0-y6,0);

       LineTo(Form1->Image2->Canvas->Handle,x0+x7,y0-y7);

       LineTo(Form1->Image2->Canvas->Handle,x0+x8,y0-y8);

       LineTo(Form1->Image2->Canvas->Handle,x0+x9,y0-y9);

       LineTo(Form1->Image2->Canvas->Handle,x0+x10,y0-y10);

       LineTo(Form1->Image2->Canvas->Handle,x0+x6,y0-y6); }

 

       //вычисляем и анализируем координату z нормали

       Zn1=-(x10-x6)*(y1-y6)+(x1-x6)*(y10-y6);

       if (Zn1>0){

       //если координата положительная рисуем грань, иначе не рисуем

       MoveToEx(Form1->Image2->Canvas->Handle,x0+x1,y0-y1,0);

       LineTo(Form1->Image2->Canvas->Handle,x0+x6,y0-y6);

       LineTo(Form1->Image2->Canvas->Handle,x0+x10,y0-y10);

       LineTo(Form1->Image2->Canvas->Handle,x0+x5,y0-y5);

       LineTo(Form1->Image2->Canvas->Handle,x0+x1,y0-y1); }

 

       //вычисляем и анализируем координату z нормали

       Zn1=-(x4-x3)*(y8-y3)+(x8-x3)*(y4-y3);

       if (Zn1>0){

       //если координата положительная рисуем грань, иначе не рисуем

       MoveToEx(Form1->Image2->Canvas->Handle,x0+x3,y0-y3,0);

       LineTo(Form1->Image2->Canvas->Handle,x0+x4,y0-y4);

       LineTo(Form1->Image2->Canvas->Handle,x0+x9,y0-y9);

       LineTo(Form1->Image2->Canvas->Handle,x0+x8,y0-y8);

       LineTo(Form1->Image2->Canvas->Handle,x0+x3,y0-y3); }

 

       //вычисляем и анализируем координату z нормали

       Zn1=-(x2-x7)*(y8-y7)+(x8-x7)*(y2-y7);

       if (Zn1>0){

       //если координата положительная рисуем грань, иначе не рисуем

       MoveToEx(Form1->Image2->Canvas->Handle,x0+x2,y0-y2,0);

       LineTo(Form1->Image2->Canvas->Handle,x0+x7,y0-y7);

       LineTo(Form1->Image2->Canvas->Handle,x0+x8,y0-y8);

       LineTo(Form1->Image2->Canvas->Handle,x0+x3,y0-y3);

       LineTo(Form1->Image2->Canvas->Handle,x0+x2,y0-y2);}

 

       //вычисляем и анализируем координату z нормали

       Zn1=-(x1-x6)*(y7-y6)+(x7-x6)*(y1-y6);

       if (Zn1>0){

       //если координата положительная рисуем грань, иначе не рисуем

       MoveToEx(Form1->Image2->Canvas->Handle,x0+x1,y0-y1,0);

       LineTo(Form1->Image2->Canvas->Handle,x0+x2,y0-y2);

       LineTo(Form1->Image2->Canvas->Handle,x0+x7,y0-y7);

       LineTo(Form1->Image2->Canvas->Handle,x0+x6,y0-y6);

       LineTo(Form1->Image2->Canvas->Handle,x0+x1,y0-y1);}

 

       //вычисляем и анализируем координату z нормали

       Zn1=-(x10-x5)*(y4-y5)+(x4-x5)*(y10-y5);

       if (Zn1>0){

       //если координата положительная рисуем грань, иначе не рисуем

       MoveToEx(Form1->Image2->Canvas->Handle,x0+x5,y0-y5,0);

       LineTo(Form1->Image2->Canvas->Handle,x0+x4,y0-y4);

       LineTo(Form1->Image2->Canvas->Handle,x0+x9,y0-y9);

       LineTo(Form1->Image2->Canvas->Handle,x0+x10,y0-y10);

       LineTo(Form1->Image2->Canvas->Handle,x0+x5,y0-y5); }

    }

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

 

float coord[3][11]; //координаты того же многогранника для OpenGL

 

//процедура рисования многоранника средствами OpenGL

void MyFogl() {

        glColor3f(200,0,0);  //Цвет грани

        glBegin(GL_POLYGON); //рисуем грань как закрашенный многоугольник

        glVertex3f(coord[0][0],coord[1][0],coord[2][0]);

        glVertex3f(coord[0][1],coord[1][1],coord[2][1]);

        glVertex3f(coord[0][2],coord[1][2],coord[2][2]);

        glVertex3f(coord[0][3],coord[1][3],coord[2][3]);

        glVertex3f(coord[0][4],coord[1][4],coord[2][4]);

        glVertex3f(coord[0][0],coord[1][0],coord[2][0]);

        glEnd();

 

        //Цвет грани

        glColor3f(0,200,0);

        //рисуем грань как закрашенный многоугольник

        glBegin(GL_POLYGON);

        glVertex3f(coord[0][5],coord[1][5],coord[2][5]);

        glVertex3f(coord[0][6],coord[1][6],coord[2][6]);

        glVertex3f(coord[0][7],coord[1][7],coord[2][7]);

        glVertex3f(coord[0][8],coord[1][8],coord[2][8]);

        glVertex3f(coord[0][9],coord[1][9],coord[2][9]);

        glVertex3f(coord[0][5],coord[1][5],coord[2][5]);

        glEnd();

 

        //Цвет грани

        glColor3f(0,0,200);

        //рисуем грань как закрашенный многоугольник

        glBegin(GL_POLYGON);

        glVertex3f(coord[0][2],coord[1][2],coord[2][2]);

        glVertex3f(coord[0][3],coord[1][3],coord[2][3]);

        glVertex3f(coord[0][8],coord[1][8],coord[2][8]);

        glVertex3f(coord[0][7],coord[1][7],coord[2][7]);

        glVertex3f(coord[0][2],coord[1][2],coord[2][2]);

        glEnd();

 

        //Цвет грани

        glColor3f(100,0,100);

        //рисуем грань как закрашенный многоугольник

        glBegin(GL_POLYGON);

        glVertex3f(coord[0][1],coord[1][1],coord[2][1]);

        glVertex3f(coord[0][6],coord[1][6],coord[2][6]);

        glVertex3f(coord[0][7],coord[1][7],coord[2][7]);

        glVertex3f(coord[0][2],coord[1][2],coord[2][2]);

        glVertex3f(coord[0][1],coord[1][1],coord[2][1]);

        glEnd();

 

        //Цвет грани

        glColor3f(150,0,50);

        //рисуем грань как закрашенный многоугольник

        glBegin(GL_POLYGON);

        glVertex3f(coord[0][1],coord[1][1],coord[2][1]);

        glVertex3f(coord[0][0],coord[1][0],coord[2][0]);

        glVertex3f(coord[0][5],coord[1][5],coord[2][5]);

        glVertex3f(coord[0][6],coord[1][6],coord[2][6]);

        glVertex3f(coord[0][1],coord[1][1],coord[2][1]);

        glEnd();

 

        //Цвет грани

        glColor3f(10,50,10);

        //рисуем грань как закрашенный многоугольник

        glBegin(GL_POLYGON);

        glVertex3f(coord[0][0],coord[1][0],coord[2][0]);

        glVertex3f(coord[0][5],coord[1][5],coord[2][5]);

        glVertex3f(coord[0][9],coord[1][9],coord[2][9]);

        glVertex3f(coord[0][4],coord[1][4],coord[2][4]);

        glVertex3f(coord[0][0],coord[1][0],coord[2][0]);

        glEnd();

 

        //Цвет грани

        glColor3f(0,100,20);

        //рисуем грань как закрашенный многоугольник

        glBegin(GL_POLYGON);

        glVertex3f(coord[0][4],coord[1][4],coord[2][4]);

        glVertex3f(coord[0][9],coord[1][9],coord[2][9]);

        glVertex3f(coord[0][8],coord[1][8],coord[2][8]);

        glVertex3f(coord[0][3],coord[1][3],coord[2][3]);

        glVertex3f(coord[0][4],coord[1][4],coord[2][4]);

        glEnd();

};

 

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

__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{    //Оси координат

     int Ox=(Image1->Width)/2;

     int Oy=(Image1->Height)/2;

     int ax=Ox;

     int ay=0;

     int bx=Image1->Width;

     int by=Oy;

     //рисуем оси координат на Image1

     Form1->Image1->Canvas->Pen->Color=clBlack;

     Form1->Image1->Canvas->MoveTo(Ox,Oy);

     Form1->Image1->Canvas->LineTo(ax,ay);

     Image1->Canvas->TextOut(Image1->Canvas->PenPos.x,Image1->Canvas->PenPos.y,"Y");

     Form1->Image1->Canvas->MoveTo(Ox,Oy);

     Form1->Image1->Canvas->LineTo(bx,by);

     Image1->Canvas->TextOut(Image1->Canvas->PenPos.x-8,Image1->Canvas->PenPos.y,"X");

     Form1->Image1->Canvas->MoveTo(Ox,Oy);

     Image1->Canvas->TextOut(Image1->Canvas->PenPos.x,Image1->Canvas->PenPos.y-12,"Z");

     //рисуем оси координат на Image2

     Form1->Image2->Canvas->MoveTo(Ox,Oy);

     Form1->Image2->Canvas->LineTo(ax,ay);

     Image2->Canvas->TextOut(Image2->Canvas->PenPos.x,Image2->Canvas->PenPos.y,"Y");

     Form1->Image2->Canvas->MoveTo(Ox,Oy);

     Form1->Image2->Canvas->LineTo(bx,by);

     Image2->Canvas->TextOut(Image2->Canvas->PenPos.x-8,Image2->Canvas->PenPos.y,"X");

     Form1->Image2->Canvas->MoveTo(Ox,Oy);

     Image2->Canvas->TextOut(Image2->Canvas->PenPos.x,Image2->Canvas->PenPos.y-12,"Z");

}

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

void __fastcall TForm1::Button2Click(TObject *Sender)

{ //обработчик нажатия второй кнопки

//получаем значения координат вершин многогранника из полей ввода

XYZ[0][0]=StrToInt(Edit1->Text);

XYZ[1][0]=StrToInt(Edit2->Text);

XYZ[2][0]=StrToInt(Edit3->Text);

XYZ[0][1]=StrToInt(Edit4->Text);

XYZ[1][1]=StrToInt(Edit5->Text);

XYZ[2][1]=StrToInt(Edit6->Text);

XYZ[0][2]=StrToInt(Edit7->Text);

XYZ[1][2]=StrToInt(Edit8->Text);

XYZ[2][2]=StrToInt(Edit9->Text);

XYZ[0][3]=StrToInt(Edit10->Text);

XYZ[1][3]=StrToInt(Edit11->Text);

XYZ[2][3]=StrToInt(Edit12->Text);

XYZ[0][4]=StrToInt(Edit13->Text);

XYZ[1][4]=StrToInt(Edit14->Text);

XYZ[2][4]=StrToInt(Edit15->Text);

XYZ[0][5]=StrToInt(Edit16->Text);

XYZ[1][5]=StrToInt(Edit17->Text);

XYZ[2][5]=StrToInt(Edit18->Text);

XYZ[0][6]=StrToInt(Edit19->Text);

XYZ[1][6]=StrToInt(Edit20->Text);

XYZ[2][6]=StrToInt(Edit21->Text);

XYZ[0][7]=StrToInt(Edit22->Text);

XYZ[1][7]=StrToInt(Edit23->Text);

XYZ[2][7]=StrToInt(Edit24->Text);

XYZ[0][8]=StrToInt(Edit25->Text);

XYZ[1][8]=StrToInt(Edit26->Text);

XYZ[2][8]=StrToInt(Edit27->Text);

XYZ[0][9]=StrToInt(Edit28->Text);

XYZ[1][9]=StrToInt(Edit29->Text);

XYZ[2][9]=StrToInt(Edit30->Text);

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

 

//Рисуем непреобразованный многогранник средствами C++ Builder

//Цвет линий - чёрный

Form1->Image1->Canvas->Pen->Color=clBlack;

//Стиль линий - сплошная

Form1->Image1->Canvas->Pen->Style=psSolid;

//Толщина линий 1

Form1->Image1->Canvas->Pen->Width=1;

//Очистка Image1

Image1->Canvas->Rectangle(0,0, Image1->Width,Image1->Height);

//Рассичитываем координаты линий, обозначающих оси координат

int Ox=(Image1->Width)/2;

int Oy=(Image1->Height)/2;

int ax=Ox;

int ay=0;

int bx=Image1->Width;

int by=Oy;

//рисуем оси координат после очистки экрана

Form1->Image1->Canvas->MoveTo(Ox,Oy);

Form1->Image1->Canvas->LineTo(ax,ay);

Form1->Image1->Canvas->MoveTo(Ox,Oy);

Form1->Image1->Canvas->LineTo(bx,by);

Form1->Image1->Canvas->MoveTo(Ox,Oy);

//Вызов процедуры рисования многогранника средствами C++

MyF( XYZ[0][0],XYZ[1][0],XYZ[0][1],XYZ[1][1],XYZ[0][2],XYZ[1][2],XYZ[0][3],XYZ[1][3],XYZ[0][4],XYZ[1][4], XYZ[0][5],XYZ[1][5],XYZ[0][6],XYZ[1][6],XYZ[0][7],XYZ[1][7],XYZ[0][8],XYZ[1][8],XYZ[0][9],XYZ[1][9]);

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

 

//Рисуем непреобразованный многогранник средствами API

//очистка экрана

Rectangle(Form1->Image2->Canvas->Handle,0,0, Image2->Width,Image2->Height);

//Рассичитываем координаты линий, обозначающих оси координат

Ox=(Image2->Width)/2;

Oy=(Image2->Height)/2;

ax=Ox;

ay=0;

bx=Image2->Width;

by=Oy;

//рисуем оси координат после очистки экрана

Form1->Image2->Canvas->MoveTo(Ox,Oy);

Form1->Image2->Canvas->LineTo(ax,ay);

Image2->Canvas->TextOut(Image2->Canvas->PenPos.x,Image2->Canvas->PenPos.y,"Y");

Form1->Image2->Canvas->MoveTo(Ox,Oy);

Form1->Image2->Canvas->LineTo(bx,by);

Image2->Canvas->TextOut(Image2->Canvas->PenPos.x-8,Image2->Canvas->PenPos.y,"X");

Form1->Image2->Canvas->MoveTo(Ox,Oy);

Image2->Canvas->TextOut(Image2->Canvas->PenPos.x,Image2->Canvas->PenPos.y-12,"Z");

//Вызов процедуры рисования многогранника средствами API

MyFapi( XYZ[0][0],XYZ[1][0],XYZ[0][1],XYZ[1][1],XYZ[0][2],XYZ[1][2],XYZ[0][3],XYZ[1][3],XYZ[0][4],XYZ[1][4], XYZ[0][5],XYZ[1][5],XYZ[0][6],XYZ[1][6],XYZ[0][7],XYZ[1][7],XYZ[0][8],XYZ[1][8],XYZ[0][9],XYZ[1][9]);

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

 

//Рисование непреобразованного многогранника средствами OpenGL

//инициализируем массив координат, к-й будем использовать в OpenGL

for (int i=0; i<3; i++)

    for (int j=0; j<11; j++)

    coord[i][j]=XYZ[i][j];

//координаты многогранника для использования средств OpenGL делим на 300

for(int j=0;j<11;j++)

{

        coord[0][j]/=300;

        coord[1][j]/=300;

        coord[2][j]/=300;

       }

       //очищаем область рисования для OpenGL

        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

       //цвет линий

        glColor3f(200,200,200);

       //толщина линий

        glLineWidth(1.0f);

       //рисуем оси координат

        glBegin(GL_LINES);

        glVertex3f(0,0,0);

        glVertex3f(1,0,0);

        glEnd();

        glBegin(GL_LINES);

        glVertex3f(0,0,0);

        glVertex3f(0,1,0);

        glEnd();

        glBegin(GL_LINES);

        glVertex3f(0,0,0);

        glVertex3f(0,0,1);

        glEnd();

//рисуем многогранник средствами OpenGL

        MyFogl();

        glFinish();}

 

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

void __fastcall TForm1::Button1Click(TObject *Sender)

{

//если нажата первая кнопка получаем занчения сдвигов по осям и кооф. растяжения

dx=StrToInt(Edit31->Text);

dy=StrToInt(Edit32->Text);

dz=StrToInt(Edit33->Text);

k=StrToInt(Edit34->Text);

//запускаем процедуру пересчёта координат

Pereshot(dx,dy,dz,k);

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

 

//Рисование преобразованного многогранника средствами C++ Builder

//Цвет линий - чёрный

Form1->Image1->Canvas->Pen->Color=clBlack;

//Стиль линий - сплошная

Form1->Image1->Canvas->Pen->Style=psSolid;

Информация о работе Отчет по практике в вычислительном центре АМТИ