Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Лаб 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);

}

}

}

 

 

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.