0.00
0 читателей, 6 топиков

Преобразования матрицы

GDI
Для преобразование матриц существует методы — Rotate, RotateAt, Scale, Shear, Translate.
Scale — предназначен для масштабирования матриц. Принимает аргументы, которые определяют коэффициент масштабирования.
Rotate и RotateAt — предназначены для вращения матрицы на определенный угол.
Shear — предназначен для сдвига матрицы. Принимает 2 параметра, которые определяют коэффициент сдвига по оси x и y.
Translate — выполняет перемещение, смещая по оси x и y.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private MatrixOperartions moperation = MatrixOperartions.Reset;
        Graphics g;
        public Form1()
        {
            InitializeComponent();
        }
        private void MatrixRotateAt()
        {
            g = this.CreateGraphics();
            g.FillRectangle(Brushes.Red, 50, 50, 150, 150);
            Matrix m = new Matrix();
            m.RotateAt(180.0F, new PointF(100.0F, 150.0F));
            g.Transform = m;
            g.FillRectangle(Brushes.Red, 50, 50, 150, 150);
        }
        private void MatrixShear()
        {
            g = this.CreateGraphics();
            g.FillRectangle(Brushes.Red, 50, 50, 150, 150);
            Matrix m = new Matrix();
            m.Shear(2,0);
            g.Transform = m;
            g.FillRectangle(Brushes.Red, 50, 50, 150, 150);
        }
        private void MatrixReset()
        {
            g = this.CreateGraphics();
            g.FillRectangle(Brushes.Red, 50, 50, 150, 150);
            Matrix m = new Matrix();
            m.Reset();
            g.Transform = m;
            g.FillRectangle(Brushes.Red, 50, 50, 150, 150);
        }
        private void MatrixScale()
        {
            g = this.CreateGraphics();
            g.FillRectangle(Brushes.Red, 50, 50, 150, 150);
            Matrix m = new Matrix();
            m.Scale(3, 2, MatrixOrder.Append);
            g.Transform = m;
            g.FillRectangle(Brushes.Red, 50, 50, 150, 150);
        }
        private void MatrixRotate()
        {
            g = this.CreateGraphics();
            g.FillRectangle(Brushes.Red, 50, 50, 150, 150);
            Matrix m = new Matrix();
            m.Rotate(20);
            g.Transform = m;
            g.FillRectangle(Brushes.Red, 50, 50, 150, 150);
        }
        private void MatrixTranslate()
        {
            g = this.CreateGraphics();
            g.FillRectangle(Brushes.Red,50,50,150,150);
            Matrix m = new Matrix();
            m.Translate(40.5f,60.1f);
            g.Transform = m;
            g.FillRectangle(Brushes.Red, 50, 50, 150, 150);
        }
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            g = e.Graphics;
            switch (moperation)
            {
                case MatrixOperartions.Reset:
                    MatrixReset();
                    break;
                case MatrixOperartions.Rotate:
                    MatrixRotate();
                    break;
                case MatrixOperartions.RotateAt:
                    MatrixRotateAt();
                    break;
                case MatrixOperartions.Translate:
                    MatrixTranslate();
                    break;
                case MatrixOperartions.Shear:
                    MatrixShear();
                    break;
                case MatrixOperartions.Scale:
                    MatrixScale();
                    break;
            }
        }
        public enum MatrixOperartions
        {
            Reset,
            Rotate,
            RotateAt,
            Scale,
            Shear,
            Translate
        }
        private void Form1_Click(object sender, EventArgs e)
        {
            moperation = MatrixOperartions.Translate;
            this.Invalidate();
        }
    }
}

Рисуем фигуры

GDI
//Треугольник

            Point[] masp = new Point[] { new Point(200, 200), new Point(300, 400), new Point(100, 400), new Point(200, 200) };
            e.Graphics.FillPolygon(redBrush, masp);

//Прямоугольник пустой
Rectangle myRectangle = new Rectangle(100, 50, 80, 40);
            g.DrawRectangle(myPen, myRectangle);


//Прямоугольник закрашенный
Rectangle myRectangle2 = new Rectangle(200, 50, 80, 40);
            g.FillRectangle(mySolidBrush, myRectangle2);


//Кружок
g.FillEllipse(mySolidBrush, 20, 50, 60, 40);


//Линии
Pen blackPen = new Pen(Color.Black, 3);
            Point point1 = new Point(200, 200);
            Point point2 = new Point(500, 200);
            e.Graphics.DrawLine(blackPen, point1, point2);

            Point point3 = new Point(200, 250);
            Point point4 = new Point(500, 250);
            e.Graphics.DrawLine(blackPen, point3, point4);

            Point point5 = new Point(200, 300);
            Point point6 = new Point(500, 300);
            e.Graphics.DrawLine(blackPen, point5, point6);
  • avatar
  • 0
  • 0

Рисуем треугольник

GDI
Задаем координаты сторон треугольника.

float[] x = { 100.78F, 50.12F, 200.99F };
float[] y = { 100.45F, 200.77F, 300.18F };

Рисуем сам треугольник.

grap.Graphics.DrawLine(Pens.Red, x[0], y[0], x[1], y[1]);
grap.Graphics.DrawLine(Pens.Red, x[1], y[1], x[2], y[2]);
grap.Graphics.DrawLine(Pens.Red, x[0], y[0], x[2], y[2]);

Передвижение элипса по форме

GDI
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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        Graphics _gr;
        BufferedGraphics _bufferedGraphics;
        BufferedGraphicsContext _bufferedGraphicsContext;

        Rectangle _rect = new Rectangle(0, 400, 50, 50);
        Pen _pen = new Pen(Color.Green, 3);

        public Form1()
        {

            InitializeComponent();
            Size = new Size(700, 600);
            StartPosition = FormStartPosition.CenterScreen;

            KeyDown += new KeyEventHandler(Form1_KeyDown);
            Paint += new PaintEventHandler(Form1_Paint);
            _bufferedGraphicsContext = BufferedGraphicsManager.Current;
            _bufferedGraphics = _bufferedGraphicsContext.Allocate(this.CreateGraphics(),
            new Rectangle(0, 0, this.Width, this.Height));

        }
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Left)
            {
                _rect.X -= 5;
            }
            if (e.KeyCode == Keys.Right)
            {
                _rect.X += 5;
            }
            if(e.KeyCode == Keys.Up)
            {
                _rect.Y -= 5;
            }
            if(e.KeyCode == Keys.Down)
            {
                _rect.Y += 5;
            }
            DrawToBuffer();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {       
            _gr = e.Graphics;
            DrawToBuffer();
        }
        private void DrawToBuffer()
        {
            _bufferedGraphics.Graphics.Clear(BackColor);
            _bufferedGraphics.Graphics.DrawEllipse(_pen, _rect);
            _bufferedGraphics.Render();
        }

    }
}

Добавление объекта по координатам

GDI
private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics gf = e.Graphics;
            Image Pers = new Bitmap(@"PlayerCar.png");
            Rectangle PersRec = new Rectangle(50, 300,50,85);
            gf.DrawImage(Pers, PersRec);
        }

Отрисовка заднего фона

GDI
private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics gf = e.Graphics;
            Rectangle rect = this.ClientRectangle;
            Image img = new Bitmap(@"D:\Users\05-04\Desktop\1.jpg");
            gf.DrawImage(img, rect);
            //Отрисовали с памяти изображение
            gf.Dispose();
        }