Построение многоугольников и многогранников, страница 11

convex(Pnt3 pt0, Pnt3 pt1, Pnt3 pt2, Pnt3 pt3);

}

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

Для создания проекта выполним действия:

1.  Запустим Borland C++ Builder с помощью меню Windows Пуск->Программы. Затем сохраним с помощью выбора опций File->Save As текущий файл Unit1.cpp в папку Convex3d.

2.  Перенесем на пустую форму Form1 со страницы Additional компонент Image, со страницы System — компонент Timer. Затем перенесем на форму Form1 со страницы Standart компонент Button.

3.  Щелкнув дважды курсором мыши на компоненте Button, наберем текст подпрограммы

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Timer1->Enabled=!Timer1->Enabled;

}

4.  Аналогично наберем текст подпрограммы обработки сообщений таймера.

5.  Наберем текст прграммы Unit1.cpp и запустим проект на компиляцию, сборку и выполнение, выбрав пункт Run главного меню.

Листинг 6.3. Построение трехмерной выпуклой оболочки

//--------------------------------------------------------------------------#include <vcl.h>

#pragma hdrstop

#include <math.h>

#include "Unit1.h"

#include <stdio.h>

//--------------------------------------------------------------------------#pragma package(smart_init)

#pragma resource "*.dfm"

#define radius 25

TForm1 *Form1;

Graphics::TBitmap *Bitmap;      // виртуальное графическое окно

int maxX, maxY;                 // размеры окна

float pxmax, pxmin, pymax, pymin;// максимальные и минимальные координаты

float xv, yv, zv, d, cosa, sina;

class Pnt3

{

float x, y, z;

public:

Pnt3(float x0, float y0, float z0):x(x0), y(y0), z(z0) {}

Pnt3() {}

Pnt3 operator&(Pnt3 q);

Pnt3 operator-(Pnt3 q);

Pnt3 operator+(Pnt3 q);

float operator*(Pnt3 q);

bool operator==(Pnt3 q)

{

return ((x==q.x)&&(y==q.y)&&(z==q.z));

}

friend Pnt3 operator*(float a, Pnt3 p);

friend float vol(Pnt3 p0, Pnt3 p1, Pnt3 p2, Pnt3 p3);

friend float px(Pnt3 p);

friend float py(Pnt3 p);

friend float pz(Pnt3 p);

friend float length(Pnt3 p);

};

Pnt3 Pnt3::operator&(Pnt3 q)

{

Pnt3 r(y*q.z-z*q.y, z*q.x-x*q.z, x*q.y-y*q.x); return r;

}

Pnt3 Pnt3::operator-(Pnt3 q)

{

Pnt3 r(x-q.x, y-q.y, z-q.z); return r;

}

Pnt3 Pnt3::operator+(Pnt3 q)

{

Pnt3 r(x+q.x, y+q.y, z+q.z); return r;

}

float Pnt3::operator*(Pnt3 q)

{

return x*q.x+y*q.y+z*q.z;

}

Pnt3 operator*(float a, Pnt3 p)

{

Pnt3 r(a*p.x, a*p.y, a*p.z); return r;

}

float vol(Pnt3 p0, Pnt3 p1, Pnt3 p2, Pnt3 p3)

{

return ( ((p1-p0)&(p2-p0))*(p3-p0));

}

float length(Pnt3 p)

{

return sqrt(p.x*p.x+p.y*p.y+p.z*p.z);

}

Pnt3 o(0,0,0), u(0,0,1), e1(1,0,0), e2(0,1,0), e3(0,0,1);

float px(Pnt3 p)

{

return d*((p.x-xv)*sina-(p.y-yv)*cosa)/

((p.x-xv)*cosa+(p.y-yv)*sina) ;

}

float py(Pnt3 p)

{

return  -d*(p.z-zv)/((p.x-xv)*cosa+(p.y-yv)*sina);

}

float pz(Pnt3 p)

{

return  d/((p.x-xv)*cosa+(p.y-yv)*sina);

}

int ex(Pnt3 p)

{

return (px(p) - pxmin) * (maxX + 1) / (pxmax - pxmin);

}

int ey(Pnt3 p)

{

return (pymax - py(p)) * (maxY + 1) / (pymax - pymin);

}

void fillpoly(int *x, int *y, int n, TColor cpen, TColor cbrush)

{

int i;

TColor savepen, savebrush;

TPoint *p= new TPoint [n];

for (i=0; i<n; i++)

{

p[i]= Point(x[i], y[i]);

}

savepen=Bitmap->Canvas->Pen->Color;

savebrush=Bitmap->Canvas->Brush->Color;

Bitmap->Canvas->Pen->Color=cpen;

Bitmap->Canvas->Brush->Color=cbrush;

Bitmap->Canvas->Polygon(p,n-1);

Bitmap->Canvas->Pen->Color=savepen;

Bitmap->Canvas->Brush->Color=savebrush;

}

void filltriangle(Pnt3 p0, Pnt3 p1, Pnt3 p2)

{

int xp[3], yp[3];

Pnt3 v(1,2,3);

float cosg = (  v *((p1-p0)&(p2-p0))  )/