Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторные работы3 / KG3 / spatial
.h//---------------------------------------------------------------------------
#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