Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
55
Добавлен:
02.05.2014
Размер:
9.92 Кб
Скачать
//---------------------------------------------------------------------------


#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)
Соседние файлы в папке KG2