Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторные работы3 / KG2 / spatial
.cpp//---------------------------------------------------------------------------
#pragma hdrstop
#include "spatial.h"
Tspatial::Tspatial(TCanvas* tempc)
{
canva=tempc;
proection=ORT;
}
//---------------------------------------------------------------------------
void Tspatial::setParams(float oX, float oY, float temp_lengthos, float temp_alpha)
{
O.x=oX;
O.y=oY;
lengthOS=temp_lengthos;
alpha=temp_alpha;
}
void Tspatial::change()
{
changeAngle(Form1->TrackBar4->Position, Form1->TrackBar5->Position, Form1->TrackBar6->Position);
changePoint(Form1->TrackBar1->Position, Form1->TrackBar2->Position, Form1->TrackBar3->Position);
if (Form1->RadioButton1->Checked)
changeProection(ORT);
else if (Form1->RadioButton2->Checked)
changeProection(PERSPECT);
calculate();
draw();
}
void Tspatial::changeAngle (int x, int y, int z)
{
C.x = x;
C.y = y;
C.z = z;
if (sqrt(C.x*C.x + C.z*C.z))
angleY = acos((float)((float)C.z/(float)sqrt(C.x*C.x + C.z*C.z)));
//else if (C.x==0) angleY = 90/(float)((float)180.0f/(float)M_PI);
else angleY=0;
if (sqrt(C.x*C.x + C.y*C.y + C.z*C.z))
angleX = asin((float)((float)C.y/(float)sqrt(C.x*C.x + C.y*C.y + C.z*C.z)));
else
angleX = -90;
angleY = -angleY*(float)((float)180.0f/(float)M_PI);
angleX = angleX*(float)((float)180.0f/(float)M_PI);
}
void Tspatial::changePoint (int x, int y, int z)
{
P.x=(float)x;
P.y=(float)y;
P.z=(float)z;
}
void Tspatial::changeProection (char type)
{
proection=type;
}
void Tspatial::calculate()
{
if (C.x==0&&C.y==0&&C.z==0)
{
status=CAMERA_NULL;
return;
}
status=GOOD;
//Задаем коодинаты осей
//Ось Х
XBegin.x = lengthOS;
XBegin.y = 0;
XBegin.z = 0;
XEnd.x = -lengthOS;
XEnd.y = 0;
XEnd.z = 0;
//Ось Y
YBegin.x = 0;
YBegin.y = lengthOS;
YBegin.z = 0;
YEnd.x = 0;
YEnd.y = -lengthOS;
YEnd.z = 0;
//Ось Z
ZBegin.x = 0;
ZBegin.y = 0;
ZBegin.z = lengthOS;
ZEnd.x = 0;
ZEnd.y = 0;
ZEnd.z = -lengthOS;
//Проекции
P1.x = P.x;
P1.y = P.y;
P1.z = 0;
P2.x = P.x;
P2.y = 0;
P2.z = P.z;
P3.x = 0;
P3.y = P.y;
P3.z = P.z;
Px.x = P.x;
Px.y = 0;
Px.z = 0;
Py.x = 0;
Py.y = P.y;
Py.z = 0;
Pz.x = 0;
Pz.y = 0;
Pz.z = P.z;
//Поворот вокруг оси Х
//Задаем матрицу поворота
float a[4][4] = {{1, 0, 0, 0},
{0, cos(radian(angleX)), sin(radian(angleX)), 0},
{0, -sin(radian(angleX)), cos(radian(angleX)), 0},
{0, 0, 0, 1}};
TMatrix tempMatrix(4, 4, *a);
//Поворот вокруг оси У
float a2[4][4] = {{cos(radian(angleY)), 0, -sin(radian(angleY)), 0},
{0, 1, 0, 0},
{sin(radian(angleY)), 0, cos(radian(angleY)), 0},
{0, 0, 0, 1}};
TMatrix tempMatrix2(4, 4, *a2);
if (proection==ORT)
{
P = P*tempMatrix2*tempMatrix;
P1 = P1*tempMatrix2*tempMatrix;
P2 = P2*tempMatrix2*tempMatrix;
P3 = P3*tempMatrix2*tempMatrix;
Px = Px*tempMatrix2*tempMatrix;
Py = Py*tempMatrix2*tempMatrix;
Pz = Pz*tempMatrix2*tempMatrix;
}
else if(proection==PERSPECT)
{
//Проверим, не находится ли камера внутри
if (P.x>=C.x&&P.y>=C.y&&P.z>=C.z)
{
status=CAMERA_IN;
return;
}
float koren = sqrt(C.x*C.x + C.y*C.y +C.z*C.z);
if (koren == 0)
koren = 1;
//Матрица перспективы
float pers[4][4] = {{1, 0, 0, 0},
{0, 1, 0, 0},
{0, 0, 0, -(float)1/(float)koren},
{0, 0, 0, 1}};
TMatrix persMatrix(4, 4, *pers);
P = P*tempMatrix2*tempMatrix*persMatrix;
P1 = P1*tempMatrix2*tempMatrix*persMatrix;
P2 = P2*tempMatrix2*tempMatrix*persMatrix;
P3 = P3*tempMatrix2*tempMatrix*persMatrix;
Px = Px*tempMatrix2*tempMatrix*persMatrix;
Py = Py*tempMatrix2*tempMatrix*persMatrix;
Pz = Pz*tempMatrix2*tempMatrix*persMatrix;
// Проверим линии на выход за границы
if (ifLineOut())
{
status=LINE_OUT;
return;
}
}
XBegin = XBegin*tempMatrix2*tempMatrix;
XEnd = XEnd*tempMatrix2*tempMatrix;
YBegin = YBegin*tempMatrix2*tempMatrix;
YEnd = YEnd*tempMatrix2*tempMatrix;
ZBegin = ZBegin*tempMatrix2*tempMatrix;
ZEnd = ZEnd*tempMatrix2*tempMatrix;
}
void Tspatial::draw()
{
//Зачистим область
TRect r;
r.Left = 0;
r.Top = 0;
r.Right = O.x*2;
r.Bottom = O.y*2;
canva->FillRect(r);
if (status==CAMERA_IN)
{
canva->TextOutA(O.x-50, O.y, "Камера внутри объекта");
return;
}
if (status==LINE_OUT)
{
canva->TextOutA(O.x-80, O.y, "Линии рисунка за пределами области ");
return;
}
if (status==CAMERA_NULL)
{
canva->TextOutA(O.x-80, O.y, "Невозможно построить изображение");
return;
}
//Оси
//Х
canva->Pen->Width=1;
canva->Pen->Style=PS_SOLID;
canva->Pen->Color=clBlue;
canva->MoveTo(convert(XBegin).x, convert(XBegin).y);
canva->LineTo(O.x, O.y);
canva->Pen->Style=PS_DASH;
canva->LineTo(convert(XEnd).x, convert(XEnd).y);
//Y
canva->Pen->Style=PS_SOLID;
canva->Pen->Color=clGreen;
canva->MoveTo(convert(YBegin).x, convert(YBegin).y);
canva->LineTo(O.x, O.y);
canva->Pen->Style=PS_DASH;
canva->LineTo(convert(YEnd).x, convert(YEnd).y);
//Z
canva->Pen->Style=PS_SOLID;
canva->Pen->Color=clRed;
canva->MoveTo(convert(ZBegin).x, convert(ZBegin).y);
canva->LineTo(O.x, O.y);
canva->Pen->Style=PS_DASH;
canva->LineTo(convert(ZEnd).x, convert(ZEnd).y);
canva->Pen->Color=clBlack;
canva->Pen->Style=PS_SOLID;
//Подписываем оси
TextOut (canva->Handle, convert(XBegin).x-indentx, convert(XBegin).y-indenty, "X", 1);
TextOut (canva->Handle, convert(YBegin).x+indentx, convert(YBegin).y, "Y", 1);
TextOut (canva->Handle, convert(ZBegin).x+indentx, convert(ZBegin).y-indenty, "Z", 1);
//Линии проекции
canva->Pen->Width=2;
//Из P в P1
canva->MoveTo (convert(P).x, convert(P).y);
canva->LineTo (convert(P1).x, convert(P1).y);
//Из P в P2
canva->MoveTo (convert(P).x, convert(P).y);
canva->LineTo (convert(P2).x, convert(P2).y);
//Из P в P3
canva->MoveTo (convert(P).x, convert(P).y);
canva->LineTo (convert(P3).x, convert(P3).y);
//Из Px в P1
canva->MoveTo (convert(Px).x, convert(Px).y);
canva->LineTo (convert(P1).x, convert(P1).y);
//Из Px в P2
canva->MoveTo (convert(Px).x, convert(Px).y);
canva->LineTo (convert(P2).x, convert(P2).y);
//Из Py в P1
canva->MoveTo (convert(Py).x, convert(Py).y);
canva->LineTo (convert(P1).x, convert(P1).y);
//Из Py в P3
canva->MoveTo (convert(Py).x, convert(Py).y);
canva->LineTo (convert(P3).x, convert(P3).y);
//Из Pz в P2
canva->MoveTo (convert(Pz).x, convert(Pz).y);
canva->LineTo (convert(P2).x, convert(P2).y);
//Из Pz в P3
canva->MoveTo (convert(Pz).x, convert(Pz).y);
canva->LineTo (convert(P3).x, convert(P3).y);
// Из O в Px
canva->MoveTo (O.x, O.y);
canva->LineTo (convert(Px).x, convert(Px).y);
// Из O в Py
canva->MoveTo (O.x, O.y);
canva->LineTo (convert(Py).x, convert(Py).y);
// Из O в Pz
canva->MoveTo (O.x, O.y);
canva->LineTo (convert(Pz).x, convert(Pz).y);
//Точки
canva->Pen->Width=1;
canva->Brush->Color=clInactiveCaption;
canva->Ellipse(convert(P).x-radius, convert(P).y-radius, convert(P).x+radius, convert(P).y+radius);
canva->Ellipse(convert(P1).x-radius, convert(P1).y-radius, convert(P1).x+radius, convert(P1).y+radius);
canva->Ellipse(convert(P2).x-radius, convert(P2).y-radius, convert(P2).x+radius, convert(P2).y+radius);
canva->Ellipse(convert(P3).x-radius, convert(P3).y-radius, convert(P3).x+radius, convert(P3).y+radius);
canva->Ellipse(convert(Px).x-radius, convert(Px).y-radius, convert(Px).x+radius, convert(Px).y+radius);
canva->Ellipse(convert(Py).x-radius, convert(Py).y-radius, convert(Py).x+radius, convert(Py).y+radius);
canva->Ellipse(convert(Pz).x-radius, convert(Pz).y-radius, convert(Pz).x+radius, convert(Pz).y+radius);
canva->Brush->Color=clWhite;
//Подписываем точки
TextOut (canva->Handle, convert(P).x+indentx, convert(P).y-indenty, "P", 1);
TextOut (canva->Handle, convert(P1).x+indentx, convert(P1).y-indenty, "P1", 2);
TextOut (canva->Handle, convert(P2).x+indentx, convert(P2).y-indenty, "P2", 2);
TextOut (canva->Handle, convert(P3).x+indentx, convert(P3).y-indenty, "P3", 2);
TextOut (canva->Handle, convert(Px).x+indentx, convert(Px).y-indenty, "Px", 2);
TextOut (canva->Handle, convert(Py).x+indentx, convert(Py).y-indenty, "Py", 2);
TextOut (canva->Handle, convert(Pz).x+indentx, convert(Pz).y-indenty, "Pz", 2);
}
point2D Tspatial::convert(point3D point)
{
point2D tempPoint;
tempPoint.x = O.x + point.x;
tempPoint.y = O.y - point.y;
if (tempPoint.x-(int)tempPoint.x<0.5)
tempPoint.x=(int)tempPoint.x;
else
tempPoint.x=(int)tempPoint.x+1;
if (tempPoint.y-(int)tempPoint.y<0.5)
tempPoint.y=(int)tempPoint.y;
else
tempPoint.y=(int)tempPoint.y+1;
return tempPoint;
}
float Tspatial::radian(float alpha)
{
return (float)((float)alpha*M_PI/(float)180.0f);
}
bool Tspatial::ifLineOut()
{
if (convert(P).x<0 || convert(P).x > 2*O.x || convert(P).y<0||convert(P).y>O.y*2)
return true;
if (convert(P1).x<0||convert(P1).x>O.x*2||convert(P1).y<0||convert(P1).y>O.y*2)
return true;
if (convert(P2).x<0||convert(P2).x>O.x*2||convert(P2).y<0||convert(P2).y>O.y*2)
return true;
if (convert(P3).x<0||convert(P3).x>O.x*2||convert(P3).y<0||convert(P3).y>O.y*2)
return true;
if (convert(Px).x<0||convert(Px).x>O.x*2||convert(Px).y<0||convert(Px).y>O.y*2)
return true;
if (convert(Py).x<0||convert(Py).x>O.x*2||convert(Py).y<0||convert(Py).y>O.y*2)
return true;
if (convert(Pz).x<0||convert(Pz).x>O.x*2||convert(Pz).y<0 ||convert(Pz).y>O.y*2)
return true;
return false;
}
#pragma package(smart_init)