Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
1 / 1 / 3
Регистрация: 22.06.2013
Сообщений: 168
1

Вращение PictureBox

23.03.2016, 22:07. Показов 4869. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Пытаюсь реализовать одну вещь: есть пикчербокс с картинкой ручки переменного резистора. Если над пикчербоксом зажать левую кнопку мыши и отпустить мышь, то пикчербокс повернется на определенный угол(как реальный резистор короче говоря, ну или как в графических редакторах или ворде поворачивается картинка). Пытаюсь реализовать так, но ничего не происходит:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
 
namespace Проверка_зедграф
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        /// <summary>
/// Вычисление угла между отрезком и положительным направлением оси OX
/// </summary>
/// <param name="basePt">Начало отрезка</param>
/// <param name="pt">Конец отрезка</param>
/// <returns>Угол в градусах в диапазоне от 0° до 360°</returns>
public float GetAngle(PointF basePt, PointF pt) {
    /// Направляющий вектор отрезка
    PointF v = new PointF(pt.X - basePt.X, pt.Y - basePt.Y);
    /// Длина направляющего вектора
    float len = (float)Math.Sqrt(v.X * v.X + v.Y * v.Y);
    /// Нормированный направляющий вектор отрезка
    PointF v1 = new PointF(v.X / len, v.Y / len);
    /// Угол между положительным направлением оси OX (вектор (1;0)) 
    /// и нормированным направляющим вектором отрезка
    float alpha = (float)(Math.Acos(v1.X) * 180 / Math.PI);
    /// Поскольку арккосинус даёт угол в диапазоне от 0° до 180°,
    /// то выполняем приведение угла к диапазону [0°, 360°]
    if (basePt.Y < pt.Y)
        return alpha;
    else
        return 360 - alpha;
}
        int xnach, ynach;
        int xconech, yconech;
     
        Bitmap _bit;
        Image _img;
        
        void PictureBox1MouseUp(object sender, MouseEventArgs e)
        {//конечная точка курсора
           xconech=e.X;
            yconech=e.Y;
//поворот
        _img=pictureBox1.BackgroundImage;
            _bit = new Bitmap(_img); 
Graphics g = Graphics.FromImage(_bit);
//очищаю при последующих поворотах
g.Clear(Color.Transparent);
Matrix m = new Matrix();
float grad=GetAngle(new Point(xnach,ynach),new Point(xconech,yconech));
            m.RotateAt(grad, new Point(_bit.Width / 2, _bit.Height / 2), MatrixOrder.Prepend);
            m.Translate(_bit.Width / 2, _bit.Height / 2, MatrixOrder.Prepend);
            g.Transform = m;
     g.DrawImage(_img, _img.Width / 2 * (-1), _img.Height / 2 * (-1) - (_img.Size.Height - 49), _img.Width, _img.Height);
        }
 
        //начальная точка курсора
        void PictureBox1MouseDown(object sender, MouseEventArgs e)
        {
             if (e.Button == MouseButtons.Left)
            {
                xnach = e.X;
                ynach = e.Y;
            }
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2016, 22:07
Ответы с готовыми решениями:

Вращение PictureBox за курсором мыши
Здравствуйте. Есть следующая задача: Есть прямоугольный (ширина в два раза больше высоты)...

Вращение в трехмерном пространстве в picturebox
Доброго времени суток Есть PictureBox, в котором находится изображение. Нужно реализовать...

Прозрачный фон у картинки на элементе PictureBox непрозрачен для другого PictureBox
Здравствуйте! Проблема состоит в следующем! У меня есть картинка .png с прозрачным фоном. При...

Как с Form4 дать нужным PictureBox видимость, если PictureBox из Form6
Как с Form4 по нажатию кнопки дать нужным PictureBox видимость, если PictureBox из Form6?...

7
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
24.03.2016, 00:32 2
Tolyanych, может не сам Picturebox, а изображение на нем? Если так, то вот пример поворота изображения.
0
1 / 1 / 3
Регистрация: 22.06.2013
Сообщений: 168
24.03.2016, 07:49  [ТС] 3
Да я имел в виду именно картинку. Только как сделать поворот при зажатой левой мыши? Пытался применить Ваш пример, ничего не выходит
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
24.03.2016, 14:45 4
Tolyanych, в чем конкретно возникает проблема?
0
1 / 1 / 3
Регистрация: 22.06.2013
Сообщений: 168
24.03.2016, 15:12  [ТС] 5
Проблема в том, что я не знаю как это сделать. Когда зажимаешь левую кнопку мыши на пикчербоксе считываю координаты курсора, при отпускании левой кнопки считываю конечные координаты. Затем считается угол между двумя координатами, чтобы понять, на какой угол повернуть картинку. Это все работает, угол считается. Но не работает две вещи: 1) При отпускании кнопки картинка вообще не поворачивается; 2) Я не знаю, как сделать поворот картинки динамическим - чтобы не "нажал-отпустил-картинка повернулась" а она поворачивалась вслед за курсором мыши при нажатой левой клавише
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
24.03.2016, 16:33 6
Лучший ответ Сообщение было отмечено Tolyanych как решение

Решение

Tolyanych, так?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace WindowsFormsApplication68
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.DoubleBuffered = true;
        }
 
        public bool rotation;
        public Bitmap innerimage;
        public float GetAngle(PointF basePt, PointF pt)
        {
            var A = Math.Atan2(basePt.X - pt.X, basePt.Y - pt.Y) / Math.PI * 180;
            return -(float)((A < 0) ? A + 360 : A);
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            innerimage = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            using (Graphics g = Graphics.FromImage(innerimage))
            {
                g.Clear(Color.White);
                g.DrawRectangle(Pens.Red, 100, 100, 100, 100);
            }
            using (Graphics g = Graphics.FromImage(pictureBox1.Image))
            {
                g.DrawImage(innerimage, new Point(0, 0));
            }
        }
 
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (rotation)
            {
                Point pnt = new Point(150, 150); //центр квадрата, вокруг которого вращаем
                using (Graphics g = Graphics.FromImage(pictureBox1.Image))
                {
                    var angle = GetAngle(pnt, e.Location);
                    g.TranslateTransform(pnt.X, pnt.Y);
                    g.RotateTransform((float)angle);
                    g.TranslateTransform(-pnt.X, -pnt.Y);
                    g.DrawImage(innerimage, Point.Empty);
                    g.RotateTransform(-(float)angle);
                }
                pictureBox1.Invalidate();
            }
        }
 
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                rotation = true;
            }
        }
 
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                rotation = false;
            }
        }
    }
}
Вложения
Тип файла: rar WindowsFormsApplication68.rar (49.6 Кб, 71 просмотров)
2
1 / 1 / 3
Регистрация: 22.06.2013
Сообщений: 168
24.03.2016, 19:59  [ТС] 7
Да, это именно то что нужно, спасибо большое!
0
0 / 0 / 0
Регистрация: 28.02.2017
Сообщений: 9
28.02.2019, 12:52 8
Подскажите, как в данном примере вставить изображение во вращающийся прямоугольник?
0
28.02.2019, 12:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2019, 12:52
Помогаю со студенческими работами здесь

Клик по PictureBox: получение координат клика на PictureBox.Image
Собственно имею PictureBox, например размерами 500 на 500 и в нем есть картинка, например размерами...

Склеивание изображения нескольких picturebox в один picturebox
Здравствуй, такой вопрос возник на счет picturebox. Можно ли из 3-ех к примеру picturebox(в каждом...

Как расположить PictureBox над PictureBox
Пишу редакто блок-схем. Рабочая область - PictureBox. Как сделать так, что бы остальные...

Как задать плавное перемещение картинки в PictureBox (или перемещение самого PictureBox) из точки А в точку Б по прямой?
Необходимо задать плавное перемещение по прямой линии из &quot;А&quot; в &quot;Б&quot; по нажатию &quot;Button&quot;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru