Лаб 2_7-2_8 Иерархия классов и виртуальные функции
Написати Windows-проект на мові С# у Visual Studio 2008:
1. (+2 бала): Створіть діалогову Windows-форму і розмістить на неї графічне поле та декілька кнопок, як показано на рис. у прикладі з п. 3.1.
До проекту введіть базовий клас DotsPic та допоміжний клас G2p з наведеного у п. 3.1 прикладу. Від базового класу відповідно варіанту завдання створіть похідний клас другого рівню ієрархії, і на його базі – похідний клас третього рівню. При необхідності додайте нові елементи або модифікуйте наявні елементи базового класу.
2. (+3 бала): Побудовану ієрархію доповніть похідними класом четвертого рівня, що здійснює відображення елементів фігури різними кольорами, а також рух фігури і зміну її параметрів в процесі руху.
Точки розташовані на сторонах квадрату, на рівній відстані одна від одної, починаючи з лівого верхнього кута.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace lab10_oop
{
public partial class Form1 : Form
{
//************************************************************************************
struct G2p // Уровень 1
// Точка в 2-мерном Декартовом пространстве
// с действительными координатами
{
public double x, y; // координаты точки (мм)
public G2p(double x1, double y1) // Конструктор
{ x = x1; y = y1; }
public G2p Affine(double mx1, double my1, // масштабные коэффициенты.
double x01, double y01, // величина сдвига в мм.
double alpha1) // угол поворота в радианах.
// Новая точка, полученная в результате
// масштабирования, сдвига и поворота
{
double x2 = x * mx1;
double y2 = y * my1;
double xa = x2 * Math.Cos(alpha1) + y2 * Math.Sin(alpha1);
double ya = x2 * -Math.Sin(alpha1) + y2 * Math.Cos(alpha1);
return new G2p(xa + x01, ya + y01);
}
}
//****************************************************************************
class Dots1 // Уровень 1
// Базовая геометрическая фигура
// на основе массива опорных точек
{
protected int n = 0; // количество точек в фигуре
protected double[,] coord; // координаты точек (x,y) в мм.
public Dots1(int n1) // Конструктор с фигурой по умолчанию
{
n = n1;
coord = new double[n, 2];
Init();
}
public G2p this[int i] // Узнать/Задать координаты i-й точки
{
get
{
if (i >= 0 && i < n) return new G2p(coord[i, 0], coord[i, 1]);
else return new G2p(0, 0);
}
set
{
if (i >= 0 && i < n)
{
coord[i, 0] = value.x;
coord[i, 1] = value.y;
}
}
}
virtual public void Init()
// Инициализировать координаты точек в соответствии с фигурой
{
for (int i = 0; i < n; i++)
{ // в данном случае просто расположим точки на прямой 0,0 - n,n
coord[i, 0] = i;
coord[i, 1] = i;
}
}
virtual public void Draw(Graphics g1, Pen p1,
double mx1, double my1, double x01, double y01, double alpha1)
// Нарисовать фигуру в требуемом масштабе, со смещением и поворотом,
// на указанной поверхности заданным пером
{
G2p p;
for (int i = 0; i < n; i++)
{ // В данном случае рисуются только опорные точки
// в виде окружностей с диаметром = 10 и толщиной линии = 5
Pen p2 = (Pen)p1.Clone();
p2.Width = 5;
// Новая точка p получается путем аффинных преобразований
p = this[i].Affine(mx1, my1, x01, y01, alpha1);
g1.DrawEllipse(p2, (int)p.x - 5, (int)p.y - 5, 10, 10);
}
}
}
//************************************************************************************
class DotsPic : Dots1 // Уровень 2
// Набор отдельных точек
{
public DotsPic(int n1)
: base(n1)
{ }
public DotsPic(double[,] a)
: base(a.GetLength(0))
{ Init(a); }
virtual public void Init(double[,] a)
{ // заполнение массива точек по таблице (перегружена)
int n1 = a.GetLength(0);
n = Math.Min(n, n1);
for (int i = 0; i < n; i++)
{
coord[i, 0] = a[i, 0];
coord[i, 1] = a[i, 1];
}
}
}
//*********************************************************************************
public Pen pen1, pen2, pen3;
public Graphics graph1, graph2;
public Form1()
{
InitializeComponent();
graph1 = pictureBox1.CreateGraphics(); // новая поверхность на рисунке
graph2 = this.CreateGraphics(); // новая поверхность на форме
pen1 = new Pen(new SolidBrush(Color.Black));
pen1.Width = 2;
}
private void button1_Click(object sender, EventArgs e)
{
double[,] M = {
{ -45, -20 }, { -45, -15 }, { -45, -10 }, { -45, -5 }, { -45, 0 }, { -45, +5 }, { -45, +10 }, { -45, +15 }, { -45, +20 },
{+10, -20 }, { +10, -15 }, { +10, -10 }, { +10, -5 }, { +10, 0 }, { +10, +5 }, { +10, +10 }, { +10, +15 }, { +10, +20 },
{ -45, -20 },{ -40, -20 },{ -35, -20 },{ -30, -20 },{ -30, -20 },{ -25, -20 },{ -20, -20 },{ -15, -20 },{ -10, -20 },{ -5, -20 },{ 0, -20 },{ +5, -20 },
{ -45, +20 },{ -40, +20 },{ -35, +20 },{ -30, +20 },{ -30, +20 },{ -25, +20 },{ -20, +20 },{ -15, +20 },{ -10, +20 },{ -5, +20 },{ 0, +20 },{ +5, +20 },
};
// for (int i = -30; i < x; i = i + 10)
// {
// for (int j = -30; j < y; j = j + 10)
// {
// M[i, j] = j;
// }
// }
DotsPic L = new DotsPic(M);
// Отображается в масштабе 4 пикселя на 1 мм, снизу вверх,
// начиная с позиции 200,200 мм
// с поворотом на 0 градуса против час. стрелки
L.Draw(graph1, pen1, 4, -4, 200, 200,0);
}
}
}
Поиск по сайту: