- •«Точка в 3d пространстве»
- •Оглавление
- •Содержательная и формальная постановка задачи
- •Краткие теоретические сведения
- •Структура решения (этапы решения и их взаимосвязь)
- •Обзор и анализ методов решения
- •Описание реализации применяемых методов
- •Руководство программиста
- •Руководство пользователя
- •Результаты
Описание реализации применяемых методов
Вычисления
Вычисления для пространственного чертежа
Преобразования из системы трехмерных координат точки в экранную систему координат для пространственного чертежа, вычисления координат точек и линий проекций.
Для описания точки введем структуру point2d, которая имеет два аргумента – экранные координаты х и у точки.
Для описание прямой введем структуру line, которая имеет четыре аргумента - экранные координаты х и у начальной и конечной точек.
Опишем эти структуры:
struct point2d {double x; double y;};
struct line {double x1; double y1; double x2; double y2};
Опишем константы:
x0 – координата Х центра системы координат
y0 – координата Y центра системы координат
indent – отступ от края рисунка
radius – радиус отрисовки точек
Опишем используемые переменные, в которые записываются результаты вычислений.
T - заданная точка (тип point2d)
T1, T2, T3 – проекции точки (тип point2d)
oz, ox, oy – координатные оси (тип line)
XoY1, XoY2, XoY3 - линии проекции на плоскость XoY
XoZ1, XoZ2, XoZ3 - линии проекции на плоскость XoZ
YoZ1, YoZ2, YoZ3 - линии проекции на плоскость YoZ
Перейдем к непосредственным вычислениям. Сначала определим координаты для отрисовки осей координат:
line oz, ox, oy;
oz.x1=x0;
oz.y1=y0*2-indent;
oz.x2=x0;
oz.y2=indent;
ox.x1=x0*2-indent;
ox.y1=y0;
ox.x2=indent;
ox.y2=y0;
oy.x1= x0-(x0-indent)*cos(angle*M_PI/180.0f);
oy.y1= y0-(y0- indent)*sin(angle*M_PI/180.0f);
oy.x2= x0+(x0- indent)*cos(angle*M_PI/180.0f);
oy.y2= y0+(y0- indent)*sin(angle*M_PI/180.0f);
Вычисления координат для отрисовки осей координат закончены. Теперь преступим к пересчету координат точки из трехмерной системы координат в экранную для пространственного чертежа, а также к вычислению координат для точек и линий проекций.
point2d T, T1, T2, T3
T.x= x0 - x + y*cos(angle*M_PI/180.0f);
T.y= x0 - z + y*sin(angle*M_PI/180.0f);
T1.x=T.x;
T1.y=T.y+z;
T2.x=T.x- y*cos(angle*M_PI/180.0f);
T2.y=T.y- y*sin(angle*M_PI/180.0f);
T3.x=T.x+x;
T3.y=T.y;
line XoY1, XoY2, XoY3;
line XoZ1, XoZ2, XoZ3;
line YoZ1, YoZ2, YoZ3;
XoY1.x1=T.x;
XoY1.y1=T.y;
XoY1.x2=T.x;
XoY1.y2=T.y+z;
XoY2.x1=T.x;
XoY2.y1=T.y+z;
XoY2.x2=x0-x;
XoY2.y2=y0;
XoY3.x1=T.x;
XoY3.y1=T.y+z;
XoY3.x2=T.x+x;
XoY3.y2=T.y+z;
XoZ1.x1=T.x;
XoZ1.y1=T.y;
XoZ1.x2=T.x- y*cos(angle*M_PI/180.0f);
XoZ1.y2=T.y-y* sin(angle*M_PI/180.0f);
XoZ2.x1=T.x-y*cos(angle*M_PI/180.0f);
XoZ2.y1=T.y-y* sin(angle*M_PI/180.0f);
XoZ2.x2=x0-x;
XoZ2.y2=y0;
XoZ3.x1=T.x- y*cos(angle*M_PI/180.0f);
XoZ3.y1= T.y-y* sin(angle*M_PI/180.0f);
XoZ3.x2=x0;
XoZ3.y2=y0-z;
YoZ1.x1=T.x;
YoZ1.y1=T.y;
YoZ1.x2=T.x+x;
YoZ1.y2=T.y;
YoZ2.x1=T.x+x;
YoZ2.y1=T.y;
YoZ2.x2=x0;
YoZ2.y2=y0-z;
YoZ3.x1=T.x+x;
YoZ3.y1=T.y;
YoZ3.x2=T.x+x;
YoZ3.y2=T.y+z;
Вычисления для пространственного чертежа завершены. Перейдем к следующему этапу.
Вычисление координат точек и линий проекций для комплексного чертежа.
Обозначим используемые переменные:
ZY, XY – координаты линий осей координат (тип line)
L1, L2, L3, L4, L5, L6, Arcp1, Arcp2 – координаты линий проекции (тип line)
T1, T2, T3 – координаты точек проекций (тип point2d)
Приступим к непосредственным вычислениям.
line ZY, XY;
ZY.x1=x0;
ZY.y1= indent;
ZY.x2=x0;
ZY.y2=y0*2-indent;
XY.x1= indent;
XY.y1=y0;
XY.x2=x0*2- indent;
XY.y2=y0;
point2d T1, T2, T3;
T1.x=x0-x;
T1.y=y0+y;
T2.x=x0-x;
T2.y=y0-z;
T3.x= x0+y;
T3.y=y0-z;
line L1, L2, L3, L4, L5, L6, Arcp1, Arcp2;
L1.x1=x0-x;
L1.y1=y0-z;
L1.x2=x0;
L1.y2=L1.y1;
L2.x1=x0-x;
L2.y1=y0-z;
L2.x2=L2.x1;
L2.y2=y0;
L3.x1=x0;
L3.y1=y0-z;
L3.x2=x0+y;
L3.y2=L3.y1;
L4.x1=x0+y;
L4.y1=y0-z;
L4.x2=L4.x1;
L4.y2=y0;
L5.x1=x0-x;
L5.y1=y0+y;
L5.x2=L5.x1;
L5.y2=y0;
L6.x1=x0-x;
L6.y1=y0+y;
L6.x2=x0;
L6.y2=L6.y1;
Arcp1.x1=x0-y;
Arcp1.y1=y0-y;
Arcp1.x2=x0+y;
Arcp1.y2=y0+y;
Arcp2.x1=x0;
Arcp2.y1=y0+y;
Arcp2.x2=x0+y;
Arcp2.y2=y0;
2) Отрисовка.
Для отрисовки линий будем использовать функции MoveTo и LineTo. Для отрисовки точек будем использовать функцию Ellipse. Для отрисовки четверть окружности будем использовать функцию Arc.
Отрисовка пространственного чертежа.
Сначала нарисуем координатные оси и подпишем их:
MoveTo (oz.x1, oz.y1);
LineTo (oz.x2, oz.y2);
MoveTo (oy.x1, oy.y1);
LineTo (oy.x2, oy.y2);
MoveTo (ox.x1, ox.y1);
LineTo (ox.x2, ox.y2);
TextOut(oz.x2+ indent, oz.y2, “Z”);
TextOut (ox.x2, ox.y2+ indent, “X”);
TextOut (oy.x2+ indent, oy.y2+ indent, “Y”);
Затем нарисуем линии проекции:
MoveTo(XoY1.x1, XoY1.y1);
LineTo(XoY1.x2, XoY1.y2);
MoveTo(XoY2.x1, XoY2.y1);
LineTo(XoY2.x2, XoY2.y2);
MoveTo(XoY3.x1, XoY3.y1);
LineTo(XoY3.x2, XoY3.y2);
MoveTo(XoZ1.x1, XoZ1.y1);
LineTo(XoZ1.x2, XoZ1.y2);
MoveTo(XoZ2.x1, XoZ2.y1);
LineTo(XoZ2.x2, XoZ2.y2);
MoveTo(XoZ3.x1, XoZ3.y1);
LineTo(XoZ3.x2, XoZ3.y2);
MoveTo(YoZ1.x1, YoZ1.y1);
LineTo(YoZ1.x2, YoZ1.y2);
MoveTo(YoZ2.x1, YoZ2.y1);
LineTo(YoZ2.x2, YoZ2.y2);
MoveTo(YoZ3.x1, YoZ3.y1);
LineTo(YoZ3.x2, YoZ3.y2);
Теперь нарисуем точки и подпишем их:
Ellipse(T.x-radius, T.y - radius, T.x + radius, T.y + radius);
Ellipse(T1.x- radius, T1.y - radius, T1.x + radius , T1.y + radius);
Ellipse(T2.x- radius, T2.y - radius, T2.x + radius, T2.y + radius);
Ellipse(T3.x- radius, T3.y - radius , T3.x + radius, T3.y + radius);
TextOut(T.x+indent, T.y-indent, “P”);
TextOut(T1.x+indent, T1.y-indent, “P1”);
TextOut(T2.x+indent, T2.y-indent, “P2”);
TextOut(T3.x+indent, T3.y-indent, “P3”);
На этом отрисовка пространственного чертежа окончена.
b) Отрисовка комплексного чертежа.
Аналогично пространственному, сначала отрисуем координатные оси и подпишем их.
MoveTo (ZY.x1, ZY.y1);
LineTO(ZY.x2, ZY.y2);
MoveTo (XY.x1, XY.y1);
LineTO(XY.x2, XY.y2);
TextOut(x0+indent, indent, “Z”);
TextOut(x0+5, ZY.y2, “Y”);
TextOut(indent, y0+indent, “X”);
TextOUT(XY.x2+indent, y0+indent, “Y”);
Рисуем линии проекции и четверть окружность.
MoveTo (L1.x1, L1.y1);
LineTo (L1.x2, L1.y2);
MoveTo (L2.x1, L2.y1);
LineTo (L2.x2, L2.y2);
MoveTo (L3.x1, L3.y1);
LineTo (L3.x2, L3.y2);
MoveTo (L4.x1, L4.y1);
LineTo (L4.x2, L4.y2);
MoveTo (L5.x1, L5.y1);
LineTo (L5.x2, L5.y2);
MoveTo (L6.x1, L6.y1);
LineTo (L6.x2, L6.y2);
Arc (Arcp1.x1, Arcp1.y1, Arcp1.x2, Arcp1.y2, Arcp2.x1, Arcp2.y1, Arcp2.x2, Arcp2.y2);
В последнюю очередь рисуем точки и подписываем их.
Ellipse (T1.x- radius, T1.y- radius , T1.x+ radius, T1.y+ radius);
Ellipse (T2.x- radius, T2.y- radius, T2.x+ radius, T2.y+ radius);
Ellipse (T3.x- radius, T3.y- radius, T3.x+ radius, T3.y+ radius);
TextOut(T1.x+indent, T1.y-indent, “P1”);
TextOut(T2.x+indent, T2.y-indent, “P2”);
TextOut(T3.x+indent, T3.y-indent, “P3”);