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)) )/
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.