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

#ifndef spatialH
#define spatialH
#include "kg2.h"
#include "matrix.h"
#include "graphics.hpp"
#include "math.h"
#include "complex.h"

/* варианты текущих состояний */
enum
{
	GOOD=1,
	CAMERA_IN,
	LINE_OUT,
	CAMERA_NULL
};

struct TKoef
{
  double a;
  double b;
  double c;
  double d;
};

enum TPlaneType
{
  tpPlane = 0, //плоскость
  tpLine, //линия
  tpPoint
};

enum TLineType
{
  tlLine = 0, //линия
  tlPoint //точка
};

class Tspatial
{

	private:
	/* Канва для отрисовки */
	TCanvas* canva;

	/* Координаты осей координат */
	point3D XBegin, XEnd, YBegin, YEnd, ZBegin, ZEnd;

	/* Координаты точки и камеры */
	//point3D P, C;

	//Координаты наблюдателя
	point3D Camera;
	point3D CameraReal;
	//Точки чертежа
	point3D T;
	point3D M;
	point3D N;
	point3D A;
	point3D B;
	point3D C;
	//Точки чертежа (координаты с трекбаров)
	//point3D TReal;
	point3D MReal;
	point3D NReal;
	point3D AReal;
	point3D BReal;
	point3D CReal;

	/* Координаты точек проекций */
	//point3D P1, P2, P3, Px, Py, Pz;

	/* Точка О - координаты центра */
	point2D O;

	/* Длина осей и угол между У и -Х */
	float lengthOS, alpha;

	/* Угол поворота вокруг OX */
	float angleX;
	float angleY;
	//float angleZ;

	/* Конвертируем точку для экранной системы координат */
	point2D convert(point3D);

	/* Переводим градусы в радианы */
	float radian(float alpha);

	/* тип проекции */
	char proection;

	/* текущее состояние: рисовать / камера внутри / выход за границы */
	char status;

	/* Проверка выхождения линий за пределы области отрисовки */
	bool ifLineOut();



	//Скалярное произведение точек прямой на коэф. плоскости
	float ScalM;
	float ScalN;

	//Нахождение коэффициентов плоскости
	void findK();

	//Коэффициенты плоскости
	TKoef planeKoef;

	float getT();

	//скалярное проеизвдение точки на коэф. плоскости
	float myltiplyPoint(point3D point, bool isCamera=false);

	//Нахождение точки пересечения
	void findCrossPoint();

	//Узнаем тип плоскости
	TPlaneType getPlaneType();

	//Узнаем тип прямой
	TLineType getLineType();

	//Погрешность
	double E;

	//Есть ли пересечение прямых
	bool isCrossLines;

	//Плоскость-точка на прямой
	bool isPlanePointOnLine;

	//Плоскость является фронталью
	bool isFrontal;


	public:
	/* Конструктор */
	Tspatial(TCanvas* tempc);

	/* Задаем базовые параметры */
	void setParams(float oX, float oY, float temp_lengthos, float temp_alpha);

	/* Вызываем все необходимые изменения */
	void change();

	/* Изменяем координаты камеры, подсчеты относительно угла поворота */
	void changeAngle (int x, int y, int z);

	/* Изменяем координаты точки */
	void changePoint (int x, int y, int z);

	/* Изменения типа проецирования */
	void changeProection (char type);

	/* Выполнение основных вычислений */
	void calculate();

	/* Отрисовка */
	void draw();

	//Изменение кординат точeк
	void setA(int valueX, int valueY, int valueZ);
	void setB(int valueX, int valueY, int valueZ);
	void setC(int valueX, int valueY, int valueZ);
	void setM(int valueX, int valueY, int valueZ);
	void setN(int valueX, int valueY, int valueZ);

	point3D getA();
	point3D getB();
	point3D getC();
	point3D getM();
	point3D getN();

	void SetE(int value);
};

//---------------------------------------------------------------------------
#endif
Соседние файлы в папке KG3