Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > GDI + Как повернуть фигуру на Х - градусов


Автор: LectorSP 5.12.2006, 22:58
Помогите пожалуйста разобраться! 

У меня такой вопрос – есть произвольная фигура(например пятиконечная звезда) нарисованная с помощью GraphicsPach, как потом повернуть эту фигуру на определенное количество градусов относительно центра или любой другой точки.

Или хотя бы скажите где можно поподробнее почитать про классы GDI+

Автор: mr.DUDA 5.12.2006, 23:15
Берём пример http://forum.vingrad.ru/index.php?showtopic=123478&kw=%F1%F2%F0%E5%EB%EA%E0 и адаптируем под нашу задачу; вместо рисования линий Pen-ом, будет рисование полной фигуры GraphicsPath-ом, и центр GraphicsPath будет центром координат.

Автор: LectorSP 7.12.2006, 01:06
Принцип понятен!

Но я так понял, что сама матрици вращяеться относительно начала координат(верхний левый угол), а как сделать, что бы она вращалась относительно своего центра, а то у меня получаеться вот так
Код

void DrawArrow(Graphics gr, /*Point start,*/ float angle)
        {
            
            //float x1 = start.X, y1 = start.Y;

            

            // сохраняем старое состояние Graphics, чтобы потом его восстановить
            GraphicsState state = gr.Save();

            // трансформация: сдвиг к точке start и поворот на угол
            //gr.TranslateTransform(x1, y1);
            gr.RotateTransform(angle);
            
            using (Pen pen = new Pen(Color.Red, 2f))
            {
                GraphicsPath path;
                path = new GraphicsPath(new Point[]{
                                        new Point(150,150),
                                        new Point(150,350),
                                        new Point(350,350),
                                        new Point(350,150),
                                        new Point(150,150)
                                        
                                        }, new byte[]{
                                                    (byte)PathPointType.Start,
                                                    (byte)PathPointType.Line,
                                                    (byte)PathPointType.Line,
                                                    (byte)PathPointType.Line,
                                                    (byte)PathPointType.Line
                                                    
                                        });
                
                gr.DrawPath(pen, path);
            }

            // восстанавливаем старое состояние Graphics (убираем наши трансформации)\
            gr.Restore(state);
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            DrawArrow(e.Graphics, /*new Point(0,0),*/ -40); 
        } 

Автор: LectorSP 7.12.2006, 01:39
Все стало ясно как только взял в руки карандаш и листок бумаги.

Все получилось, огромное спасибо за совет!


        
Код

void DrawArrow(Graphics gr, Point start, float angle)
        {
            
            float x1 = start.X, y1 = start.Y;

            

            // сохраняем старое состояние Graphics, чтобы потом его восстановить
            GraphicsState state = gr.Save();

            // трансформация: сдвиг к точке start и поворот на угол
            gr.TranslateTransform(x1, y1);
            gr.RotateTransform(angle);
            
            using (Pen pen = new Pen(Color.Red, 2f))
            {
                GraphicsPath path;
                path = new GraphicsPath(new Point[]{
                                        new Point(-200,-200),
                                        new Point(200,-200),
                                        new Point(200,200),
                                        new Point(-200,200),
                                        new Point(-200,-200)
                                        
                                        }, new byte[]{
                                                    (byte)PathPointType.Start,
                                                    (byte)PathPointType.Line,
                                                    (byte)PathPointType.Line,
                                                    (byte)PathPointType.Line,
                                                    (byte)PathPointType.Line
                                                    
                                        });
                
                gr.DrawPath(pen, path);
            }
           
            // восстанавливаем старое состояние Graphics (убираем наши трансформации)\
            gr.Restore(state);
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            DrawArrow(e.Graphics, new Point(400,400), 25); 
        } 

Автор: HelgaZaharova 7.5.2008, 17:57
А кто-нибудь знает, как повернуть картинку в PictureBox на любой угол?
Код

Image imgTemp = (Image)pictureBox1.Image.Clone();      // Soxranim nash Image dlya risovaniya
   pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height); // <-- nado delat' esli kartinka v picture boxe men'she
                     // samogo picture box inache budet obrezano vse
   Graphics g = Graphics.FromImage(pictureBox1.Image);      
   g.Clear(pictureBox1.BackColor);
   float myAngle = 30.0F;
   g.RotateTransform(myAngle);            // Stavim nash transform
   g.DrawImage(imgTemp,new Point(0,0));         // I risuem nash starii image 
   g.ResetTransform();              // Ochischaem transform
   pictureBox1.Refresh();             // Pererisovivaem picture box
   imgTemp.Dispose();
   g.Dispose();



Вот это не очень как-то работает.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)