C# (графика). афинные преобразования

// ЕСЛИ КОМУ НАДО - ПИШИТЕ, КОД ПОДРОБНО ПРОКОММЕНТИРУЮ

ОКОННОЕ ПРИЛОЖЕНИЕ - на форме рисуется подобие координатных прямых, которые пересекаются строго по центру формы - там считаем начало координат (реализован переход из бумажных координат в экранные). задается прямая (две, три) и при вызове функции ротайт они поворачиваются на угол f относительно начала координат и перерисовываются на форме, сохраняя параллельность.
/
код рабочий, можно прямой сейчас вставлять (только надо поменять вот в этой строке: "namespace grafiks_task3" пространство имен на свое, ну и или создать текстбоксы либо стереть к конце кода методы с ними связанные + еще кнопку создать, либо ее код убрать)

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 grafiks_task3
{
    public partial class Form1 : Form
    {
        // static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
        private Graphics g;
        public double F;
        public Form1()
        {
            InitializeComponent();
            Paint += new PaintEventHandler(Form1_Paint);
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            g = this.CreateGraphics();
        }

        // отрисовка фона и координатных осей // для удобства, роли никакой не играет
        private void fon()
        {
            Pen p1 = new Pen(Color.Black);
            Brush b1 = new SolidBrush(Color.LightGray);
            Brush b2 = new SolidBrush(Color.Red);
            int H = Form1.ActiveForm.Size.Height;
            int W = Form1.ActiveForm.Size.Width;
            int c_x = W / 2;
            int c_y = H / 2;
            g.FillRectangle(b1, 0, 0, W, H); // фон
            g.FillRectangle(b2, c_x, c_y, 5, 5); // центр формы
            g.DrawLine(p1, c_x, 0, c_x, H); // координатные оси
            g.DrawLine(p1, 0, c_y, W, c_y);
        }

        // переход от бумажных координат к экранным для рисования на форме
        private int X(int x)
        {
            int H = Form1.ActiveForm.Size.Height;
            int W = Form1.ActiveForm.Size.Width;
            int c_x = W / 2;
            int c_y = H / 2;
            x = c_x + x;
            return x;
        }
        private int Y(int y)
        {
            int H = Form1.ActiveForm.Size.Height;
            int W = Form1.ActiveForm.Size.Width;
            int c_x = W / 2;
            int c_y = H / 2;
            y = c_y - y;
            return y;
        }

        //поворот прямой на угол f относительно начала координат
        private void rotate(int x1, int y1, int x2, int y2, double f)
        {
            Pen p1 = new Pen(Color.Black);
            double[,] mass = new double[2, 2];
            mass[0, 0] = x1;
            mass[0, 1] = y1;
            mass[1, 0] = x2;
            mass[1, 1] = y2;
            
            double[,] Mass = new double[2, 2];
            Mass[0, 0] = Math.Cos(f);
            Mass[0, 1] = Math.Sin(f);
            Mass[1, 0] = -Math.Sin(f);
            Mass[1, 1] = Math.Cos(f);

            double[,] mass3 = new double[2, 2]; //результат
            double sum = 0;
            for (int i = 0; i < 2; i++)  // умножение
            {
                for (int j = 0; j < 2; j++)
                {
                    for (int r = 0; r < 2; r++)
                    {
                        sum = sum + mass[i, r] * Mass[r, j];
                    }
                    mass3[i, j] = sum;
                    sum = 0;
                }
            }
            x1 = Convert.ToInt32(mass3[0, 0]);
            y1 = Convert.ToInt32(mass3[0, 1]);
            x2 = Convert.ToInt32(mass3[1, 0]);
            y2 = Convert.ToInt32(mass3[1, 1]);
            g.DrawLine(p1, X(x1), Y(y1), X(x2), Y(y2)); // отрисовка отрезка

    }

        // задание прямых и вызов функции поворота
        private void draw2() 
        {              
            fon(); 
            Pen p1 = new Pen(Color.Black);
            double f;
            f = 2;
            //f = F;
            //label1.Text = "f = " + f;             
            //задание точек отрезка
            int x1 = 50;
            int y1 = 0;
            int x2 = 500;
            int y2 = 150;
            g.DrawLine(p1, X(x1), Y(y1), X(x2), Y(y2)); // отрисовка отрезка1
            rotate(x1, y1, x2, y2, f); // поворот отрезка1


            int x3 = 100;
            int y3 = 0;
            int x4 = 510;
            int y4 = 130;
            g.DrawLine(p1, X(x3), Y(y3), X(x4), Y(y4)); // отрисовка отрезка2
            rotate(x3, y3, x4, y4, f); // поворот отрезка1
////////////////////////////////////////////////
        }

        private void Form1_Load(object sender, EventArgs e){
            // empty
        }
        private void button1_Click_1(object sender, EventArgs e) {
            //string S1 = textBox1.Text;
            //string S2 = textBox2.Text;
            //double a = 0, b = 0;
            //a = Convert.ToDouble(S1);
            //b = 0.1 * Convert.ToDouble(S2);
           // F = a + b;
            draw2();
        }

        private void button2_Click(object sender, EventArgs e){
            draw3();
        }

        private void label1_Click(object sender, EventArgs e) {
        }
        private void textBox1_TextChanged(object sender, EventArgs e)  {// целая часть угла
        }
        private void textBox2_TextChanged(object sender, EventArgs e)   { // дробная часть угла 
        }
    }/////////// the end
}

vedro-compota's picture

а что поворачиваешь-то?)

_____________
матфак вгу и остальная классика =)

baton's picture

отрезок, сир.
небольшую прямую, усеченную с двух сторон.