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

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2012, 02:18   #1
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
Сообщение 2D Афинные преобразования.

Здравствуйте, написал программу, которая вращает и масштабирует параллелограмм, программа компилируется без ошибок, и в принципе работает,но только в оконной системе координат. А при переходе в другую систему уже работает не корректно, помогите пожалуйста разобраться.
Вот код:
Код:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
         
        public static PointF[] point_Poly_Calculate = new PointF[4];
        public static float var_Scale;
        public static Brush brush_BackGr = new SolidBrush(Color.Black);
        public static Pen pen_Poly = new Pen(Color.Blue, 3);
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            point_Poly_Calculate[0].X = -40F;
            point_Poly_Calculate[0].Y = -40F;
            point_Poly_Calculate[1].X = 60F;
            point_Poly_Calculate[1].Y = -40F;
            point_Poly_Calculate[2].X = 40F;
            point_Poly_Calculate[2].Y = 40F;
            point_Poly_Calculate[3].X = -60F;
            point_Poly_Calculate[3].Y = 40F;
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        { 
            e.Graphics.Clip = new Region(new Rectangle(10, 10, ClientSize.Width - 20, ClientSize.Height - 50));
            e.Graphics.FillRectangle(brush_BackGr, new Rectangle(10, 10, ClientSize.Width - 20, ClientSize.Height - 50));
            e.Graphics.DrawLine(pen_Poly, new PointF(point_Poly_Calculate[0].X + 270, point_Poly_Calculate[0].Y + 175),
                new PointF(point_Poly_Calculate[1].X + 270, point_Poly_Calculate[1].Y + 175));
            e.Graphics.DrawLine(pen_Poly, new PointF(point_Poly_Calculate[1].X + 270, point_Poly_Calculate[1].Y + 175), 
                new PointF(point_Poly_Calculate[2].X + 270, point_Poly_Calculate[2].Y + 175));
            e.Graphics.DrawLine(pen_Poly, new PointF(point_Poly_Calculate[2].X + 270, point_Poly_Calculate[2].Y + 175), 
                new PointF(point_Poly_Calculate[3].X + 270, point_Poly_Calculate[3].Y + 175));
            e.Graphics.DrawLine(pen_Poly, new PointF(point_Poly_Calculate[3].X + 270, point_Poly_Calculate[3].Y + 175),
                new PointF(point_Poly_Calculate[0].X + 270, point_Poly_Calculate[0].Y + 175));
        }

        private void button_Scale_Click(object sender, EventArgs e)
        {

            for (int i = 0; i <= 3; i++)
            {
                point_Poly_Calculate[i].X = (point_Poly_Calculate[i].X * var_Scale);
                point_Poly_Calculate[i].Y = (point_Poly_Calculate[i].Y * var_Scale);
            }
            Invalidate(); 
        }

        private void button_Rotate_Click(object sender, EventArgs e)
        {
            for (int i = 0; i <= 3; i++)
            {
                point_Poly_Calculate[i].X = point_Poly_Calculate[i].X - point_Poly_Calculate[i].Y * (float)(Math.Sin(0.1));
                point_Poly_Calculate[i].Y = point_Poly_Calculate[i].Y * (float)(Math.Sin(0.1)) + point_Poly_Calculate[i].Y;  
            }
            Invalidate();
        }

        private void button_Reset_Click(object sender, EventArgs e)
        {
            point_Poly_Calculate[0].X = -40F;
            point_Poly_Calculate[0].Y = -40F;
            point_Poly_Calculate[1].X = 60F;
            point_Poly_Calculate[1].Y = -40F;
            point_Poly_Calculate[2].X = 40F;
            point_Poly_Calculate[2].Y = 40F;
            point_Poly_Calculate[3].X = -60F;
            point_Poly_Calculate[3].Y = 40F;
            Invalidate();
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            Invalidate();
        }
    }
}
Alek-de-Mik вне форума Ответить с цитированием
Старый 08.09.2012, 19:21   #2
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

Одну проблему решил, появилась вторая, подскажите как сделать обработку отжатия одной из клавиш, т.е. я хочу сделать движение по диагонали, и для этого я сделал обработчик вот такой:
Код:
 Keys keys = Control.ModifierKeys;

                 if(e.KeyCode == Keys.Up)
                   Offset.Y = Offset.Y - 1F;
                  
                 if(keys == Keys.Up)
                 {
                     if(e.KeyCode == Keys.Right){
                          while (true){
                              if (Не знаю что поставить сюда)
                                  break;
                              else
                                  Offset.Y = Offset.Y - 1.5F;
                                  Offset.X = Offset.X + 1.5F;
                          }
                     }
                 }
Как мне определить, была ли отжата одна из клавиш?
Alek-de-Mik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
2D преобразования syrga Общие вопросы Delphi 1 14.05.2012 23:50
Преобразования строк Atheist92 Паскаль, Turbo Pascal, PascalABC.NET 1 24.05.2011 13:21
явные преобразования breate Общие вопросы C/C++ 2 17.12.2009 00:45
Графические преобразования(Афинные, Проэкционные, Эвклидовые) Rio309 Помощь студентам 1 03.10.2009 20:03