Курсы по программированию

Формула программиста

основатель — Волосатов Евгений Витольдович
Поздравляю с 1 сентября! Система начисления Байтов работает.

 22133

-- ES35

Теория ООП / Переезд метода Draw

  • На этом уроке мы начнём переносить функции для рисования фигур из основной программы в классы.
  • Дата отправки отчёта: 10 ноября 2019 г.
  • Задание выполнено: за 9 час. 38 мин.
  • Чему научился: В общем второй раз пытаюсь пройти этот курс и второй раз в этом месте у меня возникают проблемы с переносом Draw в класс.
    3 раза переписывал шаг за шагом - строго по видео, чтобы понять где я что-то делаю не так. Результат всегда один - перестает рисоваться фигура Circle.
    Если кто то поможет разобраться - будет здорово, код выложу в комментариях.
  • Что было сложным: При переносе Draw() из основной в программы в класс - перестает отображаться фигура. Проблему пытаюсь решить сам, но не откажусь от подсказки.
  • Оценка видео-уроку:
Отчёт от 22133 за Теория ООП / Переезд метода Draw


Отчёт от 22133 за Теория ООП / Переезд метода Draw




Оцени работу

 
Сохранить страницу:

21026. --
Діма
Діма
ответить
→  ES35  # Теория ООП / Переезд метода Draw / 2019-08-03 11:39

Ничего страшного, иногда я нахожу ошибку через час а то и два. Но если чего-то не понимаешь или тебе трудно, значит ты на верном пути :)


22133. --
ES35
ES35
ответить
# Теория ООП / Переезд метода Draw / 2019-11-10 21:49

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Geom1
{
    public struct Pixel
    {
        public int x, y;

        public Pixel(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public void Load()
        {

        }

        public int distance (Pixel pixel) //функция для нахождения расстояния от текущего пикселя до любого другого
        {
            return Convert.ToInt32(Math.Sqrt(
                (this.x - pixel.x) * (this.x - pixel.x) +
                (this.y - pixel.y) * (this.y - pixel.y))); //формула вычисления координаты второй точки (point)
        }
    }

    public partial class Form1 : Form
    {
        Bitmap bmp;
        Graphics graph;
        Pen pen;

        //Панда 1
        Shape[] panda1; // массив в который мы засунем все фигуры нужные для рисования не цветной панды

        //Панда 2 - с цветом
        Shape[] panda2; // массив в который мы засунем все фигуры нужные для рисования цветной панды
     
        Pixel A, B, C, D, E, F, H, G, I, J, L, M, N, O, P, K, Q, R, X1, X2, Z1, Z2, T, U, V, S, W; //создание обектов типа Pixel

        public Form1()
        {
            InitializeComponent();
            InitPanda1(); //функция для инициализации объекта (то есть создания) Панды 1
            InitPanda2(); //с цветом - функция для инициализации объекта (то есть создания) Панды 2
            Draw();//функция для рисования
        }

        private void InitPanda1()//функция для инициализации Панды (то есть её создания) 1
        {
            bmp = new Bitmap(pictureBox.Width, pictureBox.Height);
            graph = Graphics.FromImage(bmp);
            pen = new Pen(Color.Black);

            A = new Pixel(200, 180);
            B = new Pixel(200, 360);
            C = new Pixel(135, 95);
            D = new Pixel(260, 95);
            E = new Pixel(150, 110);
            F = new Pixel(275, 110);
            H = new Pixel(135, 140);
            G = new Pixel(230, 140);//верх правая внешняя оболочка глаза панды
            I = new Pixel(155, 155);
            J = new Pixel(163, 185);
            L = new Pixel(237, 155);
            M = new Pixel(245, 185);
            N = new Pixel(260, 200);//низ правая внешняя оболочка глаза панды
            O = new Pixel(200, 205);
            P = new Pixel(210, 205);
            K = new Pixel(170, 200);
            Q = new Pixel(200, 265);
            R = new Pixel(150, 270);
            X1 = new Pixel(128, 300);
            X2 = new Pixel(50, 335);
            Z1 = new Pixel(275, 300);
            Z2 = new Pixel(360, 335);
            T = new Pixel(110, 425);
            U = new Pixel(170, 465);
            V = new Pixel(235, 425);
            S = new Pixel(250, 425);
            W = new Pixel(295, 465);

            panda1 = new Shape[14]; //создадим массив из 14 элементов в котором будем хранить фигуры для панды
            // фигуры типа круг
            panda1[0] = new Circle(C, E); //левое ухо панды
            ((Circle)panda1[0]).SetGraphics(graph);
            ((Circle)panda1[0]).SetPen(pen);

            panda1[1] = new Circle(D, F); //правое ухо панды
            ((Circle)panda1[1]).SetGraphics(graph);
            ((Circle)panda1[1]).SetPen(pen);

            panda1[2] = new Circle(A, Q); //голова панды
            ((Circle)panda1[2]).SetGraphics(graph);
            ((Circle)panda1[2]).SetPen(pen);

            panda1[3] = new Circle(O, P); //нос панды
            ((Circle)panda1[3]).SetGraphics(graph);
            ((Circle)panda1[3]).SetPen(pen);

            panda1[4] = new Circle(B, Q); //туловище (внешний контур) панды
            ((Circle)panda1[4]).SetGraphics(graph);
            ((Circle)panda1[4]).SetPen(pen);

            //фигуры типа овал вписанный в прямоугольник
            panda1[5] = new CircleEllipse(H, K); //левая внешняя оболочка глаза панды
            panda1[6] = new CircleEllipse(I, J); //левая внутреняя оболочка глаза панды
            panda1[7] = new CircleEllipse(G, N); //правая внешняя оболочка глаза панды
            panda1[8] = new CircleEllipse(L, M); //правая внутреняя оболочка глаза панды
            panda1[9] = new CircleEllipse(R, S); //туловище (внутренний контур) панды
            //фигуры типа линия
            panda1[10] = new Line(X1, X2);//левая рука панды
            panda1[11] = new Line(Z1, Z2);//правая рука панды
            //фигуры типа прямоугольник
            panda1[12] = new Rectangle(T, U);//левая нога панды
            panda1[13] = new Rectangle(V, W);//правая нога панды
        }

        private void InitPanda2()//функция для инициализации Панды (то есть её создания) 1
        {
            bmp = new Bitmap(pictureBox.Width, pictureBox.Height);
            graph = Graphics.FromImage(bmp);
            pen = new Pen(Color.Black);

            int delta = 400; //переменная, спомощью которой мы сместим объект на указанное количество по оси Х вправо

            A = new Pixel(delta + 200, 180);
            B = new Pixel(delta + 200, 360);
            C = new Pixel(delta + 135, 95);
            D = new Pixel(delta + 260, 95);
            E = new Pixel(delta + 150, 110);
            F = new Pixel(delta + 275, 110);
            H = new Pixel(delta + 135, 140);
            G = new Pixel(delta + 230, 140);//верх правая внешняя оболочка глаза панды
            I = new Pixel(delta + 155, 155);
            J = new Pixel(delta + 163, 185);
            L = new Pixel(delta + 237, 155);
            M = new Pixel(delta + 245, 185);
            N = new Pixel(delta + 260, 200);//низ правая внешняя оболочка глаза панды
            O = new Pixel(delta + 200, 205);
            P = new Pixel(delta + 210, 205);
            K = new Pixel(delta + 170, 200);
            Q = new Pixel(delta + 200, 265);
            R = new Pixel(delta + 150, 270);
            X1 = new Pixel(delta + 128, 300);
            X2 = new Pixel(delta + 50, 335);
            Z1 = new Pixel(delta + 275, 300);
            Z2 = new Pixel(delta + 360, 335);
            T = new Pixel(delta + 110, 425);
            U = new Pixel(delta + 170, 465);
            V = new Pixel(delta + 235, 425);
            S = new Pixel(delta + 250, 425);
            W = new Pixel(delta + 295, 465);

            panda2 = new Shape[14]; //создадим массив из 14 элементов в котором будем хранить фигуры для цветной панды
            // фигуры типа цветной круг
            panda2[0] = new ColorCircle(C, E, Color.Black); //с цветом - левое ухо панды
            panda2[1] = new ColorCircle(D, F, Color.Black); //с цветом - правое ухо панды
            panda2[2] = new ColorCircle(A, Q, Color.Black); //с цветом - голова панды
            panda2[3] = new ColorCircle(O, P, Color.Black); //с цветом - нос панды
            panda2[4] = new ColorCircle(B, Q, Color.Black); //с цветом - туловище (внешний контур) панды
            // фигуры типа цветной овал вписанный в прямоугольник
            panda2[5] = new ColorCircleEllipse(H, K, Color.Blue); //с цветом - левая внешняя оболочка глаза панды
            panda2[6] = new ColorCircleEllipse(I, J, Color.Black); //с цветом - левая внутреняя оболочка глаза панды
            panda2[7] = new ColorCircleEllipse(G, N, Color.Blue); //с цветом - правая внешняя оболочка глаза панды
            panda2[8] = new ColorCircleEllipse(L, M, Color.Black); //с цветом - правая внутреняя оболочка глаза панды
            panda2[9] = new ColorCircleEllipse(R, S, Color.Yellow); //с цветом - туловище (внутренний контур) панды
            // фигуры типа цветная линия
            panda2[10] = new ColorLine(X1, X2, Color.Black);//с цветом - левая рука панды
            panda2[11] = new ColorLine(Z1, Z2, Color.Black);//с цветом - правая рука панды
            // фигуры типа цветной прямоугольник
            panda2[12] = new ColorRectangle(T, U, Color.Black);//с цветом - левая нога панды
            panda2[13] = new ColorRectangle(V, W, Color.Black);//с цветом - правая нога панды
        }

        private void Draw()
        {
            Draw(panda1); //Draw, которая рисует целый набор фигур - спрайт
            Draw(panda2); //Draw, которая рисует целый набор фигур - спрайт
            pictureBox.Image = bmp;
        }

        private void Draw(Shape [] shapes) //функция, которая перебирает все фигуры из которых состоит панда и рисует с помощью Draw(Shape shape)
                   
            /*  замена  этих циклов -
                    for (int i = 0; i < panda1.Length; i++) //цикл, который перебирает все фигуры содержащиеся в массиве panda1 и вызывает функцию Draw(Shape shape)
                        Draw(panda1[i]);

                    for (int i = 0; i<panda2.Length; i++) //цикл, который перебирает все фигуры содержащиеся в массиве panda2 и вызывает функцию Draw(Shape shape)
                        Draw(panda2[i]);
            */

        {
            for (int i = 0; i < shapes.Length; i++) //цикл, который перебирает все фигуры содержащиеся в переданном массиве.
                Draw(shapes[i]); // и вызывает функцию Draw(Shape shape)
        }

        private void Draw(Shape shape)//функция рисует фигуру, которая содержится в Shape
        {
            if (shape.GetType() == typeof(Line))            //если фигурa shape имеет тип Line
                Draw((Line)shape);              //рисуем предварительно посмотрев на переменную shape как на Line. То есть приводим ее к типу Line
            if (shape.GetType() == typeof(Rectangle))      //если фигура shape имеет тип Rectangle
                Draw((Rectangle)shape);        //смотрим на переменную shape как на Rectangle. То есть приводим ее к типу Rectangle
            if (shape.GetType() == typeof(Circle))          //если фигурa shape имеет тип Circle
                ((Circle)shape).Draw();            //смотрим на переменную shape как на Circle. То есть приводим ее к типу Circle
            if (shape.GetType() == typeof(CircleEllipse))  //если фигурa shape имеет тип CircleEllipse
                Draw((CircleEllipse)shape);    //смотрим на переменную shape как на CircleEllipse. То есть приводим ее к типу CircleEllipse

            if (shape.GetType() == typeof(ColorLine))            //если фигурa shape имеет тип ColorLine
                Draw((ColorLine)shape);              //рисуем предварительно посмотрев на переменную shape как на ColorLine. То есть приводим ее к типу ColorLine
            if (shape.GetType() == typeof(ColorRectangle))      //если фигура shape имеет тип ColorRectangle
                Draw((ColorRectangle)shape);        //смотрим на переменную shape как на ColorRectangle. То есть приводим ее к типу ColorRectangle
            if (shape.GetType() == typeof(ColorCircle))          //если фигурa shape имеет тип ColorCircle
                Draw((ColorCircle)shape);            //смотрим на переменную shape как на ColorCircle. То есть приводим ее к типу ColorCircle
            if (shape.GetType() == typeof(ColorCircleEllipse))  //если фигурa shape имеет тип ColorCircleEllipse
                Draw((ColorCircleEllipse)shape);    //смотрим на переменную shape как на ColorCircleEllipse. То есть приводим ее к типу ColorCircleEllipse
        }

        private void Draw (Rectangle rectangle)//функция рисует прямоугольник
        {
            graph.DrawRectangle(pen,
                rectangle.corner1.x, rectangle.corner1.y,
                rectangle.width, rectangle.heigth);
        }

        private void Draw(ColorRectangle rectangle)//функция рисует цветной прямоугольник
        {
            graph.DrawRectangle(rectangle.pen,
                rectangle.corner1.x, rectangle.corner1.y,
                rectangle.width, rectangle.heigth);
        }

        private void Draw (Line line)//функция рисует линию
        {
            graph.DrawLine(pen,
                line.begin.x, line.begin.y,
                line.ended.x, line.ended.y);
        }

        private void Draw (ColorLine line)//функция рисует цветную линию
        {
            graph.DrawLine(line.pen,
                line.begin.x, line.begin.y,
                line.ended.x, line.ended.y);

        }

        /*private void Draw(Circle circle)//функция рисует окружность
        {
            graph.DrawEllipse(pen,
                circle.corner.x, circle.corner.y,
                circle.width, circle.height);
        }*/

        private void Draw(ColorCircle circle)//функция рисует окружность
        {
            graph.DrawEllipse(circle.pen,
                circle.corner.x, circle.corner.y,
                circle.width, circle.height);
        }

        private void Draw(CircleEllipse circleEllipse) //функция рисует овал
        {
            graph.DrawEllipse(pen,
                circleEllipse.x1, circleEllipse.y1,
                circleEllipse.width, circleEllipse.height);
        }

        private void Draw(ColorCircleEllipse colorCircleEllipse) //функция рисует цветной овал
        {
            graph.DrawEllipse(colorCircleEllipse.pen,
                colorCircleEllipse.x1, colorCircleEllipse.y1,
                colorCircleEllipse.width, colorCircleEllipse.height);
        }


22133. --
ES35
ES35
ответить
# Теория ООП / Переезд метода Draw / 2019-11-10 21:50

class Circle : Shape  //Класс Circle будет наследоваться от класса Shape
    {
        public Pixel center; //координаты центра
        public Pixel corner; //"угол" который требуется для рисования окружности (правый нижний, наподобии прямоугольника)
        public int radius;
        public int width, height;

        protected Graphics graph;
        protected Pen pen;
       
        public Circle(int x, int y, int radius)    //передача в функцию координат 2 точек и размера радиуса для рисования окружности
            : this (new Pixel (x, y), radius)      //конструктор берет 2 точки и создает 1 пиксель, передается радиус без изменений
        {
           
        }

        public Circle()
        {

        }

        public void SetGraphics(Graphics graph)
        {
            this.graph = graph;
        }

        public void SetPen(Pen pen)
        {
            this.pen = pen;
        }

        public Circle(Pixel center, int radius) // center - центральная точка окружности. radius - цифра означающая размер радиуса
        {
            this.center = center;
            this.radius = radius;
            this.corner = new Pixel (
                this.center.x - this.radius,
                this.center.y - this.radius);
            this.width = this.height = this.radius * 2;
        }

        public Circle (Pixel center, Pixel point)  //функция для создания окружности по центральной точке и точке по которой она будет проходить
            : this(center, center.distance(point))  //берем пиксель center, затем снова берем пиксель center и у него вызываем метод distance (который мы написали)
                                                    //и находим расстояние до пикселя point
        {
        }

        public void Draw()
        {
            graph.DrawEllipse(pen,
                corner.x, corner.y,
                width, height);
        }

    }


17947. --
Dmitry Sinitsin
Dmitry Sinitsin
ответить
→  ES35  # Теория ООП / Переезд метода Draw / 2019-11-11 14:55

Юзинги не в области видимости неймспейса должны быть разве? Подозреваю, что она за пределами класса указываются, но внутри скобок неймспейса. Пишу по памяти, может ошибаюсь, но вроде бы здесь ошибка.


17947. --
Dmitry Sinitsin
Dmitry Sinitsin
ответить
→  ES35  # Теория ООП / Переезд метода Draw / 2019-11-11 15:01

using System;
  class Program
  {
      static void Main()
      {........
Вот пример - здесь юзинг не спрятан за скобками неймспейса, правда он тут и не обозначен. Но границы в виде фигурных скобок между юзингом и исполняемым классом нет, подозреваю здесь и проблема. Надо сначала указать неймспейс, открыть фигурную скобку а затем лишь юзинги прописывать. Вероятно так.


2146. --
Иван
Иван
ответить
→  ES35  # Теория ООП / Переезд метода Draw / 2019-11-11 23:18

У каждого чуть - чуть по-своему реализовано. Каждый добавлял что-то свое. Думаю, может помочь пошаговое прохождение программы. Так легче найти проблему, а также начинаешь лучше понимать, как работает программа. Чувствую, что проблема не в юзингах...


22133. --
ES35
ES35
ответить
→  Dmitry Sinitsin  # Теория ООП / Переезд метода Draw / 2019-11-16 11:08

Извиняюсь за долгое молчание (командировка).
Если я правильно понял про юзинги, то сейчас создал новый проект и там юзинги находятся в таком же порядке как и в программе с проблемой:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace experiment
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}


22133. --
ES35
ES35
ответить
→  Иван  # Теория ООП / Переезд метода Draw / 2019-11-16 11:11

Извиняюсь за долгое молчание (командировка).
Пробовал, сравнивал отработку кода до изменений приведших к тому что перестала отрисовываться фигура. И после изменений. Вроде как и там и там все переменные необходимые для рисования получают координаты, но после изменения кода они перестали рисоваться.
Буду дальше копать, но пока не понимаю как такое могло произойти.


22133. --
ES35
ES35
ответить
# Теория ООП / Переезд метода Draw / 2019-11-16 11:13

Черт ноги сломает в моем коде, сам его уже понять не могу...


22133. --
ES35
ES35
ответить
# Теория ООП / Переезд метода Draw / 2019-11-16 20:43

Всё, нашел ошибку. Если кому интересно, то она заключалась в том, что я забыл вынести в отдельную функцию Init() код инициализации графики и ручки.
"bmp = new Bitmap(pictureBox.Width, pictureBox.Height);
graph = Graphics.FromImage(bmp);
pen = new Pen(Color.Black);"


  • Отчёт оценивали:
    17425ser2018+1   18842Степан+1   791Валерий Жданов+1   22883Илья+1   6203Николай Миролюбов+1   17947Dmitry Sinitsin+1   22309Xa4_Xakum+1   23056Андрей Сальников0   2146Иван+1   21026Діма+1   7119Новопашин Владимир+1  

Начинаем практику по языку C#





Если вы пришли без приглашения -
введите тысяча двадцать четыре (цифрами).
Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

После заполнения формы ты будешь подписан на рассылку «C# Вебинары и Видеоуроки», у тебя появится доступ к видеоурокам и консольным задачам.

Несколько раз в неделю тебе будут приходить письма — приглашения на вебинары, информация об акциях и скидках, полезная информация по C#.

Ты в любой момент сможешь отписаться от рассылки.


Научился: Добавил в класс Circle метод Draw(). Добавил в класс Circle поля graph и pen. Создал инициализаторы этих полей SetGraphics() и SetPen(). Убрал из основной программы метод Draw (Circle circle). Изменил метод Draw(Shape shape) для вызова Circle.Draw().
Трудности: Уследить за модернизацией кода. Чуть отвлёкся и "накосячил". Минут двадцать искал ошибку.



Научился: Пытаемся освободить базовый класс от лишнего кода, распихивая его по соответствующим классам.
Трудности: Сложность только в новизне материала.
Все отлично.