Автор работы: Пользователь скрыл имя, 18 Ноября 2015 в 21:48, лабораторная работа
Содержание экрана:
пространственный чертеж с изображением точки T, ее проекций на координатные плоскости T1, T2, T3 и ее проекций на координатные оси TX, TY, TZ, а также линий связи (с учетом выбранного типа проецирования и расположения точки камеры);
комплексный чертеж с изображением проекций точки T – T1, T2, T3, TX, TY, TZ, а также линий связи;
ползунковые переключатели для интерактивного изменения координат точки T и угла между осями Ox и Oy на пространственном чертеже.
Х_pict,Y_pict – начало координат
Angle_Y- угол наклона оси OY
XT, YT, ZT – трехмерные координаты точки Т
rasst - отступ от края рисунка
Перейдем к непосредственным вычислениям. Сначала определим координаты для отрисовки осей координат:
x1 = new PointF(X_pict * 2 - rasst, Y_pict);
x2 = new PointF(rasst, Y_pict);
z1 = new PointF(X_pict, Y_pict * 2 - rasst);
z2 = new PointF(X_pict, rasst);
y1 = new PointF(X_pict - Y_pict * cos_Y, Y_pict - Y_pict * sin_Y);
y2 = new PointF(X_pict + Y_pict * cos_Y, Y_pict + Y_pict * sin_Y);
Вычисления координат для отрисовки осей координат закончены. Теперь преступим к пересчету координат точки из трехмерной системы координат в экранную для пространственного чертежа.
x0 = X_pict - XT + YT * cos_Y - 2*otstup;
y0 = Y_pict - ZT + YT * sin_Y - 2*otstup;
k1 = X_pict - XT - 2*otstup;
k2 = Y_pict - ZT - 2*otstup;
k3 = x0 + XT;
k4 = y0 + ZT;
T = new PointF(x0 + otstup, y0 + otstup);
T1 = new PointF(x0 + otstup, k4 + otstup);
T2 = new PointF(k1 + otstup, k2 + otstup);
T3 = new PointF(k3 + otstup, y0 + otstup);
Tx = new PointF(k1 + otstup, Y_pict-otstup/2);
Ty = new PointF(k3 + otstup, k4 + otstup);
Tz = new PointF(X_pict-otstup/2, k2 + otstup);
Обозначим используемые переменные:
Х_pict,Y_pict – начало координат
Angle_Y- угол наклона оси OY
XT, YT, ZT – трехмерные координаты точки Т
x1 = new PointF(X_pict * 2 - rasst, Y_pict);
x2 = new PointF(rasst, Y_pict);
z1 = new PointF(X_pict, Y_pict * 2 - rasst);
z2 = new PointF(X_pict, rasst);
k1 = X_pict - XT - 2*otstup;
k2 = Y_pict - ZT - 2*otstup;
k3 = X_pict + YT - 2*otstup;
k4 = Y_pict + YT - 2*otstup;
Tx = new PointF(k1 + otstup, Y_pict);
Ty = new PointF(k3 + otstup, Y_pict);
Ty1 = new PointF(X_pict, k4 + otstup);
Tz = new PointF(X_pict, k2 + otstup);
T1 = new PointF(k1 + otstup, k4 + otstup);
T2 = new PointF(k1 + otstup, k2 + otstup);
T3 = new PointF(k3 + otstup, k2 + otstup);
3) Отрисовка
Для отрисовки линий будем использовать функцию DrawLine. Для отрисовки точек будем использовать функцию FillEllipse. Для отрисовки четверть окружности будем использовать функцию DrawArc.
Сначала нарисуем координатные оси и подпишем их:
DrawLine(Mypen, y1, y2);
DrawString("Y", drawFont, Brushes.Black, y2.X+rasst, y2.Y-rasst);
DrawLine(Mypen, z1, z2);
DrawString("Z", drawFont, Brushes.Black, z1.X-rasst, rasst);
DrawLine(Mypen, x1, x2);
DrawString("X", drawFont, Brushes.Black, rasst, x2.Y-rasst);
Затем нарисуем линии проекции:
DrawLine(Mypen, T, T2);
DrawLine(Mypen, T, T3);
DrawLine(Mypen, T, T1);
DrawLine(Mypen, T1, Tx);
DrawLine(Mypen, Tx, T2);
DrawLine(Mypen, T1, Ty);
DrawLine(Mypen, Ty, T3);
DrawLine(Mypen, T3, Tz);
DrawLine(Mypen, Tz, T2);
Теперь нарисуем точки и подпишем их:
//point T:
FillEllipse(Brushes.Red, x0, y0, R, R);
DrawString("T", drawFont, Brushes.Black, x0 + otstup, y0 + 2*otstup);
//point T1:
FillEllipse(Brushes.Green, x0, k4, R, R);
DrawString("T1", drawFont, Brushes.Black, x0 + otstup, k4 + 2*otstup);
//point T2:
FillEllipse(Brushes.Green, k1, k2, R, R);
DrawString("T2", drawFont, Brushes.Black, k1 - 7*otstup, k2 + 2*otstup);
//point T3:
FillEllipse(Brushes.Green, k3, y0, R, R);
DrawString("T3", drawFont, Brushes.Black, k3 + otstup, y0 + 2*otstup);
//point Tx:
FillEllipse(Brushes.Black, k1, Y_pict-2*otstup, R, R);
DrawString("Tx", drawFont, Brushes.Black, k1 + otstup, Y_pict+3*otstup);
//point Ty:
FillEllipse(Brushes.Black, k3, k4, R, R);
DrawString("Ty", drawFont, Brushes.Black, k3 + otstup, k4 + 3*otstup);
//point Tz:
FillEllipse(Brushes.Black, X_pict-2*radius, k2, R, R);
DrawString("Tz", drawFont, Brushes.Black, X_pict+otstup, k2 -3*otstup);
На этом отрисовка пространственного чертежа окончена.
Аналогично пространственному, сначала отрисуем координатные оси и подпишем их.
//Z:
DrawLine(Mypen, z1, z2);
DrawString("Z", drawFont, Brushes.Black, z1.X-rasst, rasst);
//X:
DrawLine(Mypen, x1, x2);
DrawString("X", drawFont, Brushes.Black, rasst, x2.Y-rasst);
//Y:
DrawString("Y", drawFont, Brushes.Black, z1.X+rasst, z1.Y-rasst);
DrawString("Y", drawFont, Brushes.Black, x1.X - rasst, x1.Y + rasst);
Рисуем линии проекции и четверть окружность.
DrawLine(Mypen, Ty, T3);
DrawLine(Mypen, T3, Tz);
DrawLine(Mypen, Tz, T2);
DrawLine(Mypen, T2, Tx);
DrawLine(Mypen, Tx, T1);
DrawLine(Mypen, T1, Ty1);
DrawArc(Mypen, X_pict - YT, Y_pict - YT, YT * 2, YT * 2, 0, 90);
DrawArc(Mypen, X_pict + YT, Y_pict + YT, -YT * 2, -YT * 2, 180, 90);
В последнюю очередь рисуем точки и подписываем их.
//T1:
DrawString("T1", drawFont, Brushes.Black, k1 + otstup, k4 + 2*otstup);
FillEllipse(Brushes.Green, k1-radius, k4, R, R);
//T2:
DrawString("T2", drawFont, Brushes.Black, k1 + otstup, k2 + 2*otstup);
FillEllipse(Brushes.Green, k1-radius, k2, R, R);
//T3:
DrawString("T3", drawFont, Brushes.Black, k3 + otstup, k2 + 2*otstup);
FillEllipse(Brushes.Green, k3-radius, k2, R, R);
//Tx:
DrawString("Tx", drawFont, Brushes.Black, k1 + otstup, Y_pict + 2*otstup);
FillEllipse(Brushes.Black, k1-radius, Y_pict-2*radius, R,R);
//Ty:
DrawString("Ty1", drawFont, Brushes.Black, k3 + otstup, Y_pict + 2*otstup);
DrawString("Ty2", drawFont, Brushes.Black, X_pict + otstup, k4 + 2*otstup);
FillEllipse(Brushes.Black, k3-radius, Y_pict-2*radius, R, R);
FillEllipse(Brushes.Black, X_pict-2*radius, k4-radius, R, R);
//Tz:
DrawString("Tz", drawFont, Brushes.Black, X_pict + otstup, k2+2*otstup);
FillEllipse(Brushes.Black, X_pict - 2*radius, k2 - radius, R, R);
Лабораторная работа реализована на языке C# в Microsoft Visual Studio Community 2015.
Использующиеся пространства имен:
Использованы стандартные компоненты платформы .Net Framework 4.0:
Схема классового взаимодействия:
Опишем заголовки классов.
Класс точка. Объект этого класса используется в основной форме приложения.
class MyPoint
{
float x;
float y;
float z;
public MyPoint(float x1, float y1, float z1);
public float getX();
public float getY();
public float getZ();
public void setPosition(float x1, float y1, float z1); //изменение координат точки
}
public partial class Form1 : Form
{
MyPoint point;
int otstup, radius, rasst, R;//отступы, радиусы
PointF x1, x2, y1, y2, z1, z2;//точки для отрисовки осей
PointF T, T1, T2, T3, Tx, Ty, Ty1, Tz;
float x0, y0;//координаты
float XT, YT, ZT;//координаты точки, задающиеся пользователем
float k1, k2, k3, k4;
float X_pict, Y_pict;//координаты середины pictureBox
double angle_Y;//угол наклона оси OY
public Form1();
//отрисовка точек на комплексном чертеже
private void draw_2d_point(PaintEventArgs e);
//координаты для отрисовки точек
private void point_coords(bool f);
//отрисовка точек на пространственном чертеже
private void draw_3d_point(PaintEventArgs e);
//изменение трекбаров
private void YtrackBar_Scroll(object sender, EventArgs e);
private void ZtrackBar_Scroll(object sender, EventArgs e);
private void XtrackBar_Scroll(object sender, EventArgs e);
private void Angle_trackBar_Scroll(object sender, EventArgs e);
//Изменение координат точки Т
private void change_XYZ();
//sin
private float sin_y(double angle);
//cos
private float cos_y(double angle);
//координаты для отрисовки осей
private void coords(bool is_3d);
//отрисовка осей
private void Draw_os(PaintEventArgs e, bool is_3d);
private void pictureBox2_Paint(object sender, PaintEventArgs e);
private void pictureBox1_Paint(object sender, PaintEventArgs e);
}
РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
После запуска программы на экране появится следующее окно:
На экране 2 чертежа и 4 ползунка. Левый чертеж – пространственный, правый – комплексный. При движении любого ползунка чертежи перерисовываются (при изменении угла комплексный чертеж не перерисовывается).
Выведены формулы для построения пространственного макета и комплексного чертежа точки в экранной системе координат. Разработана программа, выводящая на экран пространственный макет и комплексный чертеж точки, и позволяющая динамически изменять координаты точки и угол между осями Oy и Ox.