none
поворот рисунка RRS feed

Ответы

  • опять же, или по формулам геометрии (или инженерной графики),
    (обычно 2-й вариант в ВУЗах просят, формулы не помню)

    или использовать поворот в Graphics, на котором рисуете.
    Там есть метод RotateTransform(...).

    тут пример есть

    http://msdn.microsoft.com/ru-ru/library/6a1d65f4.aspx

    • Изменено INFEL8 18 декабря 2012 г. 13:21
    • Помечено в качестве ответа georgushek 26 декабря 2012 г. 18:24
    18 декабря 2012 г. 13:19
  • Формулы у Вас правильные вроде бы были приведены.
    Только почему-то переписали Вы их совсем в другом виде.
    Вы куда-то дели перемножение старых координат на косинус с синусом.
    Что, конечно, неправильно.
    В изначальном варианте оно же было.
    Верините, и будет правильно.

    // ПС.
    Эти формулы только для поворота относитльно точки (0;0)
    Если нужно относительно любой точки,
    то для двумерной системы будут такие формулы:
    (нашёл у себя в загажнике)
    x1 = x0+(x-x0)*cos(L)-(y-y0)*sin(L);
    y1 = y0+(x-x0)*sin(L)+(y-y0)*cos(L);
    Где
    x1, y1 - новые координаты
    x  , y  - старые координаты
    x0, y0 - координаты центра вращения
    L - угол в градусах, если правильно помню.

    Из них при подставлении 0 0 в x0 y0 получаются Ваши формулы,
    как частный случай.




    • Изменено INFEL8 21 декабря 2012 г. 8:21
    • Помечено в качестве ответа Abolmasov Dmitry 25 декабря 2012 г. 9:22
    • Снята пометка об ответе georgushek 25 декабря 2012 г. 10:05
    • Помечено в качестве ответа Abolmasov Dmitry 27 декабря 2012 г. 8:36
    21 декабря 2012 г. 8:16
  • Привет.

    Самый простой метод повернуть - это нарисовать весь график на Bitmap, а после этот Bitmap перевернуть:

            private void rotatePanel1_Paint(object sender, PaintEventArgs e)
            {
                Bitmap b = new Bitmap(rotatePanel1.Width, rotatePanel1.Height);
                Graphics g = Graphics.FromImage(b);
                
                g.DrawRectangle(new System.Drawing.Pen(new SolidBrush(Color.Black), 2f), 4f, 4f, 10f, 10f);
                g.DrawRectangle(new System.Drawing.Pen(new SolidBrush(Color.Azure), 2f), 14f, 14f, 30f, 30f);
                b.RotateFlip(RotateFlipType.Rotate90FlipNone);
                e.Graphics.DrawImage(b, new Point(0, 0));
            }
    Самый правильный метод, это наверное использование матриц трансформации, они подробно с примером рассмотрены здесь - Matrix Transformation of Images in C#, using .NET GDI+. Вместо изображение можно передавать тот же Bitmap, на котором будет ваш график.

    Для связи [mail]

    • Предложено в качестве ответа Abolmasov Dmitry 25 декабря 2012 г. 9:23
    • Помечено в качестве ответа georgushek 26 декабря 2012 г. 18:28
    25 декабря 2012 г. 9:19
  • Вот класс для поворота изображения на заданный угол (взят из проекта C# Image/PictureBox Rotations):

     /// <summary>
        /// Summary description for Utilities.
        /// </summary>
        public sealed class Utilities
        {
            private Utilities()
            {
            }
            /// <summary>
            /// Creates a new Image containing the same image only rotated
            /// </summary>
            /// <param name="image">The <see cref="System.Drawing.Image"/> to rotate</param>
            /// <param name="angle">The amount to rotate the image, clockwise, in degrees</param>
            /// <returns>A new <see cref="System.Drawing.Bitmap"/> of the same size rotated.</returns>
            /// <exception cref="System.ArgumentNullException">Thrown if <see cref="image"/> is null.</exception>
            public static Bitmap RotateImage(Image image, float angle)
            {
                return RotateImage(image, new PointF((float)image.Width / 2, (float)image.Height / 2), angle);
            }
            /// <summary>
            /// Creates a new Image containing the same image only rotated
            /// </summary>
            /// <param name="image">The <see cref="System.Drawing.Image"/> to rotate</param>
            /// <param name="offset">The position to rotate from.</param>
            /// <param name="angle">The amount to rotate the image, clockwise, in degrees</param>
            /// <returns>A new <see cref="System.Drawing.Bitmap"/> of the same size rotated.</returns>
            /// <exception cref="System.ArgumentNullException">Thrown if <see cref="image"/> is null.</exception>
            public static Bitmap RotateImage(Image image, PointF offset, float angle)
            {
                if (image == null)
                    throw new ArgumentNullException("image");
                //create a new empty bitmap to hold rotated image
                Bitmap rotatedBmp = new Bitmap(image.Width, image.Height);
                rotatedBmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);
                //make a graphics object from the empty bitmap
                Graphics g = Graphics.FromImage(rotatedBmp);
                //Put the rotation point in the center of the image
                g.TranslateTransform(offset.X, offset.Y);
                //rotate the image
                g.RotateTransform(angle);
                //move the image back
                g.TranslateTransform(-offset.X, -offset.Y);
                //draw passed in image onto graphics object
                g.DrawImage(image, new PointF(0, 0));
                return rotatedBmp;
            }
        }

    Теперь, как вам нужно его использовать, по нажатию кнопки:

                // промежуточное изображение, на котором будем рисовать график
                Bitmap image = new Bitmap(pictureBox1.Width,pictureBox1.Height);
                
                Graphics g = Graphics.FromImage(image);
                // рисуем график
                // тут прямоугольник только для примера, вставляйте свою кривую
                // g.DrawCurve(Pens.Red,points);
                g.DrawRectangle(new Pen(Brushes.Red), 0, 0, pictureBox1.Width-1, pictureBox1.Height-1);
                // освобождаем ресурсы
                g.Dispose();
                // выводим в pictureBox уже повернутое изображение
                pictureBox1.Image = Utilities.RotateImage(image, 90);
                // удаляем старое изображение
                image.Dispose();


    Для связи [mail]

    • Помечено в качестве ответа georgushek 25 декабря 2012 г. 13:32
    • Снята пометка об ответе georgushek 25 декабря 2012 г. 13:32
    • Помечено в качестве ответа georgushek 26 декабря 2012 г. 18:28
    25 декабря 2012 г. 13:25

Все ответы

  • опять же, или по формулам геометрии (или инженерной графики),
    (обычно 2-й вариант в ВУЗах просят, формулы не помню)

    или использовать поворот в Graphics, на котором рисуете.
    Там есть метод RotateTransform(...).

    тут пример есть

    http://msdn.microsoft.com/ru-ru/library/6a1d65f4.aspx

    • Изменено INFEL8 18 декабря 2012 г. 13:21
    • Помечено в качестве ответа georgushek 26 декабря 2012 г. 18:24
    18 декабря 2012 г. 13:19
  • e.Graphics.RotateTransform(90.0F); почему–то остается также, ну стоит зменить хотябы на 5°, он это делает и множит кол. картинок
    • Помечено в качестве ответа georgushek 18 декабря 2012 г. 15:40
    • Снята пометка об ответе georgushek 18 декабря 2012 г. 15:42
    18 декабря 2012 г. 14:09
  • А из–за этой строчки это не может быть e.Graphics.DrawLines(Pens.Red, points);
    18 декабря 2012 г. 14:23
  • Лучше переносом
    18 декабря 2012 г. 15:46
  • если Вы рисуете не только в Paint методе да ещё не на том объекте Graphics, который в аргументы приходит,
    то там может быть всякое.

    Так же, возможно Вы скопировали из примера строку
    e.Graphics.RotateTransform(30.0F);

    и при том рисуете на этом объекте Graphics
    using (Graphics g = this.CreateGraphics())
    • Изменено INFEL8 18 декабря 2012 г. 15:52
    • Помечено в качестве ответа georgushek 18 декабря 2012 г. 17:16
    • Снята пометка об ответе georgushek 18 декабря 2012 г. 17:16
    18 декабря 2012 г. 15:51
  • Мне нужно создать этот класс отдельно?
    18 декабря 2012 г. 17:21
  • Не знаю зачем у Вас вообще идёт создание экземпляра класса Graphics.
    для начала хоть так сделайте:
    вместо строки
    using (Graphics g = this.CreateGraphics())
    (полностью вместо неё, вместе с using)
    напишите
    Graphics g = e.Graphics;

    а там будет виднее
    19 декабря 2012 г. 5:09
  • сделал, теперь он пишит . Недопустимый параметр Application.Run(new Form1();
    19 декабря 2012 г. 6:20
  • ну Вам виднее от чего и где ошибка.
    без проекта и кода сложно говорить

    19 декабря 2012 г. 8:59
  • print void pictureBox1_Paint(object sender, PaintEventArgs e)

    {

    using (Graphics g = this.CreateGraphics())

    using (Font f = new Font ("Arial", 6, FontStyle.Regular))

    {

    for (int x = - 850; x< this.Height; x+= +200)

    {

    g.DrawLine(Pens.Black, x,0,x, this.Width);


    g.DrawString(x.Tostring(), f, Brushes,Black,x,0);

    }

    дальше опять идет цикл,только для горизонтали


    { if(point !=null)

    e.Graphics.DrawCurve(Pens.Red, points);

    e.Graphics.RotateTransform(90.0F);

    • Изменено georgushek 19 декабря 2012 г. 10:22
    19 декабря 2012 г. 10:02
  • ну тут не сделано, что я сказал 2-мя сообщениями ранее.
    а от чего ошибка опять не ясно.
    Проект выложите пож-та.
    Поправлять не буду наверное, просто на ошибку гляну.

    // ПС.
    // опять мы тут развели кашу-малашу. ну что поделаешь.. , так получается.
    19 декабря 2012 г. 10:38
  • Я исправил, просто я здесь это не написал
    19 декабря 2012 г. 10:56
  • georgushek вам уже делали замечание, что не стоит писать несколько сообщений подряд. Хотите что то добавить отредактируйте предыдущее сообщение, а добавляйте если это ответ на чье то сообщение.

    Темы с вашим участием жутко не удобно читать, а значит это снижает круг лиц способных вам помочь.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    19 декабря 2012 г. 11:30
    Отвечающий

    • Изменено georgushek 19 декабря 2012 г. 12:05
    19 декабря 2012 г. 12:03
  • на снимке ни чего не поменяно., наверное старый снимок.

    ещё раз попрошу,
    выложите проект.
    ZIP архив сделайте, и выложите куда-нибудь, если там нет ни чего секретного.

    Да и не обычно, что это всё в ворде, так удобнее?


    • Изменено INFEL8 19 декабря 2012 г. 12:12 очепятка
    19 декабря 2012 г. 12:10
  • на снимке ни чего не поменяно., наверное старый снимок.

    ещё раз попрошу,
    выложите проект.
    ZIP архив сделайте, и выложите куда-нибудь, если там нет ни чего секретного.

    Да и не обычно, что это всё в ворде, так удобнее?


    нет не старое, я просто все вернул назад

    А Zip здесь можно вставить

    я с планшета пишу
    • Изменено georgushek 19 декабря 2012 г. 12:57
    19 декабря 2012 г. 12:21
  • Вот там на снимке есть строчка using( Graphics=this.CreateGraphics())

    я ее заменил на using(Graphics=e.Graphics)

    А у меня там задаются параметры координатной сетки
    • Изменено georgushek 19 декабря 2012 г. 13:52
    19 декабря 2012 г. 13:36
  • может еще у кого–нибудь есть решения этой проблемы

    Может вместо e.Graphics.RotateTransformate(90.0.F) нужно писать e.Graphics.TranslateTransformate(90.0F, 0.0F), это вроде перенос

    • Изменено georgushek 19 декабря 2012 г. 18:12
    19 декабря 2012 г. 13:58
  • Пробуйте.
    Но думается, что перенос в повороте не поможет.

    Я не знаю, может быть как-то можно нарисовать часть (сетку) на .
    Потом нарисовать график на Graphics, и повернуть этот экземпляр Graphics, на котором рисовал.

    А Graphics с сеткой не трогать.

    Может можно как-то.
    Пробовать надо.

    Да и, как я в 1-м ответе предлагал - можно всё формулами сделать.
    Там вроде бы не сложно.
    Найти только формулу поворота точки на какой-то угол.
    Центр поворота там наверное указывается в формуле (координаты), сама точка (опять же координаты), и угол, ну или углы, если для трёхмерного дела формула.

    20 декабря 2012 г. 9:24
  • я понимаю, что  график не влезает в координатную сетку, потому что RotateTerminal поварачивает, но такое ощющение, что он не может его развернуть в заданном диапозоне
    Я выяснил,что можно использовать ScaleTransform для масштабированния, только как это работает пока не очень пому, потому что как я понял нужно задать еденицы масштабирования
    • Изменено georgushek 20 декабря 2012 г. 11:48
    20 декабря 2012 г. 11:09
  • есть еще система уравнений  X=ax+by

                            Y=cx+dy

    где а=cos, b=sin, c=sin, d=cos(угла фи), только как теперь это задать программно?
    • Изменено georgushek 20 декабря 2012 г. 15:27
    20 декабря 2012 г. 15:22
  • ну так так и пишите, если это подходящие формулы.
    Косинус и синус есть в Math.
    http://msdn.microsoft.com/ru-ru/library/xaz41263.aspx
    Статические методы там так называются.

    Ну или сами посчитаете, если не найдёте.
    Поделить одно на другое вот и синус с косинусом.
    • Изменено INFEL8 20 декабря 2012 г. 18:04
    20 декабря 2012 г. 18:03
  • Так?

    double a = -90;

    double b =-90;

    double c=-90;

    double Cosa= Math.Cos(a);

    double Sinb=Math.Sin(b);

    double Sinc=Math.Sin(c);

    double Cosd=Math.Cos(d);

    x= a+b;

    y=c+d;

    Напишите как правильно, пожалуйста
    • Изменено georgushek 21 декабря 2012 г. 7:50
    21 декабря 2012 г. 7:04
  • Формулы у Вас правильные вроде бы были приведены.
    Только почему-то переписали Вы их совсем в другом виде.
    Вы куда-то дели перемножение старых координат на косинус с синусом.
    Что, конечно, неправильно.
    В изначальном варианте оно же было.
    Верините, и будет правильно.

    // ПС.
    Эти формулы только для поворота относитльно точки (0;0)
    Если нужно относительно любой точки,
    то для двумерной системы будут такие формулы:
    (нашёл у себя в загажнике)
    x1 = x0+(x-x0)*cos(L)-(y-y0)*sin(L);
    y1 = y0+(x-x0)*sin(L)+(y-y0)*cos(L);
    Где
    x1, y1 - новые координаты
    x  , y  - старые координаты
    x0, y0 - координаты центра вращения
    L - угол в градусах, если правильно помню.

    Из них при подставлении 0 0 в x0 y0 получаются Ваши формулы,
    как частный случай.




    • Изменено INFEL8 21 декабря 2012 г. 8:21
    • Помечено в качестве ответа Abolmasov Dmitry 25 декабря 2012 г. 9:22
    • Снята пометка об ответе georgushek 25 декабря 2012 г. 10:05
    • Помечено в качестве ответа Abolmasov Dmitry 27 декабря 2012 г. 8:36
    21 декабря 2012 г. 8:16
  • То есть мне нужно взять ваши формулы?
    21 декабря 2012 г. 8:59
  • Если нужно вращать относительно не 0 0.
    А если от 0 0, то и Ваши подойдут.
    21 декабря 2012 г. 9:03
  • Почему может не работать?

    var x= double.Parse(values[1], CultureInfo.InvariantCulture);

    var y =double.Parse(values[2],CultureInfo.InvariantCulture);

    double x0=...;

    double x1=...;

    double y0=...;

    double y1=...;

    double L =...;

    double CosL = Math.Cos(L);

    double SinL = Math.Sin(L);

    и дальше две формулы , которые вы мне написали

    21 декабря 2012 г. 9:54
  • Мне кажется, что нужно x1,y1 перевести в PointF

    Я убрал x0,y0, но это не помагло. Перед первой скобкой

    • Изменено georgushek 21 декабря 2012 г. 11:26
    21 декабря 2012 г. 10:59
  • Да Вам там вроде бы оставалось просто подставить эти х1 и у1 в создание точки,
    которую в список добавляете

    и всё.

    А сами х1 и у1 это координаты,
    их в PointF перевести не получится, так как это просто разные вещи.

    Но можно в PointF экземпляр подставить х1 и у1 в качестве координат.

    • Изменено INFEL8 21 декабря 2012 г. 12:42
    21 декабря 2012 г. 12:41
  • То– есть это как–то так?

    PointF point2 = new PointF();

    pointList.Add(point2):

    Как мне сделать чтобы координаты x1,y1принемали значения ?
    • Изменено georgushek 24 декабря 2012 г. 9:08
    24 декабря 2012 г. 6:52
  • а в чём проблема?
    не понятно.

    надо менять координаты точкам при чтении из файла - меняйте.
    не надо - не меняйте.

    Надо менять по методу - делайте изменение имеющихся точек в методе.
    (пусть даже этот метод вызывается из обработчика нажатия на кнопку)
    А в чём проблема то?

    24 декабря 2012 г. 11:25
  • x1= (x-x0)*CosL-(y-y0)*SinL;

    y1=(x-x0)*SinL+(y-y0)*CosL;

    Там ноль задается в x1,y1

    Я так понял что я должен ввести pointCenter.X, pointCenter.Y, правильно, только куда?

    • Изменено georgushek 24 декабря 2012 г. 12:22
    24 декабря 2012 г. 12:14
  • это ввести потом, после поворота все преобразования делайте в нужной вам системе отсчёта

    потом уже на экранное переводите


    • Изменено INFEL8 24 декабря 2012 г. 12:51 пробел добавил
    24 декабря 2012 г. 12:28
  • разшифруйте, что вы написали
    У меня сейчас записываются знач в x1,y1,а куда потом я должен их переносить

    Численные значения она подсчитывает, как теперь мне сделать из этих координат  новые точки
    • Изменено georgushek 24 декабря 2012 г. 12:56
    24 декабря 2012 г. 12:37
  • вот у вас есть начальные значения х и у (в обычной системе координат),

    Вам нужно это повернуть на сколько-то градусов относительно какой-то точки в какой-то системе координат.
    если в той же, то и делайте сначала поворот теми формулами
    а потом пересчитывайте это в экранные координаты

    остальное уже делали в прошлый раз

    24 декабря 2012 г. 12:53
  • Возникает проблем не совместимости типов

    PointF point1 = new PointF((float)x+pointCenter.X, (float)-y+pointCenter.Y);

    PointF point2 = new PointF ((float)x+x1,(float)-y+y1);

    x1,y1-double, Cos -раб только под double
    • Изменено georgushek 24 декабря 2012 г. 13:15
    24 декабря 2012 г. 13:11
  • Вот что получается!

    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.Windows.Forms;
    using System.IO;
    using System.Drawing.Printing;
    using System.Globalization;



    namespace Visualizaciya_puskov
    {
        public partial class Рис : Form
        {     //положение линии на плоскости
            PointF _prev = new PointF( -180, +90);
            PointF[] points;
           
            public Рис()
            {
                InitializeComponent();
            }
            
             private void button1_Click(object sender, EventArgs e)
            { 

                PointF newPoint = new PointF(float.Parse(tbX.Text), float.Parse(tbY.Text));
                Graphics gr = Graphics.FromHwnd(pictureBox1.Handle);
                gr.DrawLine(new Pen(Color.Black), _prev, newPoint);
                _prev = newPoint;
              
            }

            private void button2_Click(object sender, EventArgs e)
            {
                Close();
            }
                 
           private void pictureBox1_Paint(object sender, PaintEventArgs e)
            {
                using (Graphics g = this.CreateGraphics())

                using (Font f = new Font("Arial", 6, FontStyle.Regular))
                




                     
                       
                            
                {
                    for (int x =0; x < this.Height; x +=600)
                    {

                        g.DrawLine(Pens.Black, x, 0, x, this.Width); 
                        g.DrawString(x.ToString(), f, Brushes.Black, x, 0);
                     

                    }
                    

                    for (int y =-200; y < this.Width; y +=100) 
                    {
                        g.DrawLine(Pens.Black, 0, y, this.Height, y); 
                        g.DrawString(y.ToString(), f, Brushes.Black, 0, y);
                  
                        {
                            if (points != null)

                                e.Graphics.DrawCurve(Pens.Red, points); 
                                //e.Graphics.TranslateTransform(10.0F, 0.0F);
                               // e.Graphics.RotateTransform(-70.0F); 
                               e.Graphics.ScaleTransform(1.0F, 1.0F); 

                         
                        
                    } 
                    }
               

                   }
            }
             
           public void button4_Click(object sender, EventArgs e)
            {
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    Name = openFileDialog1.FileName;
                    textBox1.Clear();
                    textBox1.Text = File.ReadAllText(Name);
                   
                }

                {
                    var curves = File.ReadAllLines(@"C:\К1.txt");
                    var pointList = new List<PointF>();
                   
                    var firstline = false;
                     

                   foreach (var curve in curves)
                   {
                       if (!firstline)
                      {
                           firstline = true;
                          continue;
                        }
                     
                               
                             var values = curve.Split(new char[]{' '},
                             StringSplitOptions.RemoveEmptyEntries);
                            
                             var x = double.Parse(values[1], CultureInfo.InvariantCulture);
                             var y = double.Parse(values[2], CultureInfo.InvariantCulture);
                             double x0 = 200;
                             double x1 = 0;
                             double y0 = 200;
                             double y1 = 0;

                             double CosL = Math.Cos(180);
                             double SinL = Math.Sin(90);
                             x1 = (x - x0) * CosL - (y - y0) * SinL;
                             y1 = (x - x0) * SinL + (y - y0) * CosL;
                         
                             PointF pointCenter = new PointF(pictureBox1.Width / 2, pictureBox1.Height / 2);
                              

                             PointF point1 = new PointF((float)x + pointCenter.X, (float)-y + pointCenter.Y);
                             PointF point2 = new PointF((float)x+x1, (float)-y+y1);
                             pointList.Add(point1);
                             pointList.Add(point2);
                             
                           
                     //  Status TranslateTransform(REAL dx, REAL dy, MatrixOrder orderer);
                                      
                      }

                   points = pointList.ToArray();
                   pictureBox1.Refresh();
                    }
               

                }
        
             
        
         
                    private void button3_Click(object sender, EventArgs e)
            {
                   CaptureScreen();
                printDocument1.Print();   
           
            }
          
            Bitmap memoryImage;
            private void CaptureScreen()
            {
                Graphics myGraphics = this.CreateGraphics();
                Size s = this.Size;
                memoryImage = new Bitmap(s.Width, s.Height, myGraphics);
                Graphics memoryGraphics = Graphics.FromImage(memoryImage);
                memoryGraphics.CopyFromScreen(this.Location.X,this.Location.Y, -25, 0, s);
            }


            private void printDocument1_PrintPage_1(object sender, PrintPageEventArgs e)
            {
               e.Graphics.DrawImage(memoryImage, -25, 0);
            }

            }
                             
             
        }

      


    • Изменено georgushek 24 декабря 2012 г. 18:06
    24 декабря 2012 г. 17:49
  • в коде ерунда написана.
    как-будто не понимаете что пишете.

    Вроде бы всё сказано было чего и куда даже.

    Поправьте чтобы смысл хоть был написанного и заработает хоть как-то.

    ПС. вставьте в блок кода, там кнопка есть в редакторе сообщения которое отправляете.
    2-я справа.
    так хоть поцветастее будет.

    24 декабря 2012 г. 18:36
  • хоть как– то она уже работатет

    Вместо того чтоы подшучивать лучше сказали что не так и подправили!

    А если внимательно посмотрите, то увидите , что вычисления написаны в кнопке Button4

    И кстати, если бы вы были более внимательны, то увидели бы, если убрать строчку

    PointF point2 = new PointF((floate)x+x1, (float)-y+y1);Все работает, только перевернуто, а так работает от

    верхнего угла и сразу нолько следов этой линии, но только если убрать из скобок условие т.к. оно не правильно

    • Изменено georgushek 25 декабря 2012 г. 8:27
    25 декабря 2012 г. 8:13
  • Привет.

    Самый простой метод повернуть - это нарисовать весь график на Bitmap, а после этот Bitmap перевернуть:

            private void rotatePanel1_Paint(object sender, PaintEventArgs e)
            {
                Bitmap b = new Bitmap(rotatePanel1.Width, rotatePanel1.Height);
                Graphics g = Graphics.FromImage(b);
                
                g.DrawRectangle(new System.Drawing.Pen(new SolidBrush(Color.Black), 2f), 4f, 4f, 10f, 10f);
                g.DrawRectangle(new System.Drawing.Pen(new SolidBrush(Color.Azure), 2f), 14f, 14f, 30f, 30f);
                b.RotateFlip(RotateFlipType.Rotate90FlipNone);
                e.Graphics.DrawImage(b, new Point(0, 0));
            }
    Самый правильный метод, это наверное использование матриц трансформации, они подробно с примером рассмотрены здесь - Matrix Transformation of Images in C#, using .NET GDI+. Вместо изображение можно передавать тот же Bitmap, на котором будет ваш график.

    Для связи [mail]

    • Предложено в качестве ответа Abolmasov Dmitry 25 декабря 2012 г. 9:23
    • Помечено в качестве ответа georgushek 26 декабря 2012 г. 18:28
    25 декабря 2012 г. 9:19
    • Извините, а как повирнуть Bitmap? Как задается RotatePanel1?
    25 декабря 2012 г. 9:58
  • RotatePanel - это там где вы рисуете, pictureBox или просто Panel.

    Bitmap - создается в коде и поворачивается там же.


    Для связи [mail]

    25 декабря 2012 г. 10:29
  • А почему он может выдавать ошибку  на e.Graphics.Image(b, new Point(0,0)); System.EventArgs не содержит определения для Graphics
    Я понял почему
    • Изменено georgushek 25 декабря 2012 г. 11:24
    25 декабря 2012 г. 11:01
  • Потому что вы рисуете не в методе OnPaint значит, у меня это обработчик Paint, если рисуете по кнопке, то получайте объект Graphics как делали, вместо e.Graphics

    Для связи [mail]

    25 декабря 2012 г. 11:24
  • мне нужно наверное взять, только две строчки из вашего примера, я не понял зачем там рисуется 2 квадрата?  У меня кривая которая рисуется из файла, код высше
    • Изменено georgushek 25 декабря 2012 г. 11:52
    25 декабря 2012 г. 11:48
  • Рисуйте вместо квадратов свою кривую из файла, у меня к сожалению нет ни файла, ни метода его считывания. Решение проблемы вам уже расжевали, что нужно выполнять переворот либо самостоятельно, либо из того, что предлагает Фреймворк. Решения описаны, вам осталось их только правильно применив, поняв самому как это работает. Нужно немного приложить усилий.

    Для связи [mail]

    25 декабря 2012 г. 12:01
  • e.Graphics.RotateTransform(90.0F);-поворачивает

    е.Graphics.DrawCurve(Pens.Red,points)-рисуется кривая красного цвета

    Как это можно совместить чтобы получилось то–что я хочу

    25 декабря 2012 г. 12:58
  • Вот класс для поворота изображения на заданный угол (взят из проекта C# Image/PictureBox Rotations):

     /// <summary>
        /// Summary description for Utilities.
        /// </summary>
        public sealed class Utilities
        {
            private Utilities()
            {
            }
            /// <summary>
            /// Creates a new Image containing the same image only rotated
            /// </summary>
            /// <param name="image">The <see cref="System.Drawing.Image"/> to rotate</param>
            /// <param name="angle">The amount to rotate the image, clockwise, in degrees</param>
            /// <returns>A new <see cref="System.Drawing.Bitmap"/> of the same size rotated.</returns>
            /// <exception cref="System.ArgumentNullException">Thrown if <see cref="image"/> is null.</exception>
            public static Bitmap RotateImage(Image image, float angle)
            {
                return RotateImage(image, new PointF((float)image.Width / 2, (float)image.Height / 2), angle);
            }
            /// <summary>
            /// Creates a new Image containing the same image only rotated
            /// </summary>
            /// <param name="image">The <see cref="System.Drawing.Image"/> to rotate</param>
            /// <param name="offset">The position to rotate from.</param>
            /// <param name="angle">The amount to rotate the image, clockwise, in degrees</param>
            /// <returns>A new <see cref="System.Drawing.Bitmap"/> of the same size rotated.</returns>
            /// <exception cref="System.ArgumentNullException">Thrown if <see cref="image"/> is null.</exception>
            public static Bitmap RotateImage(Image image, PointF offset, float angle)
            {
                if (image == null)
                    throw new ArgumentNullException("image");
                //create a new empty bitmap to hold rotated image
                Bitmap rotatedBmp = new Bitmap(image.Width, image.Height);
                rotatedBmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);
                //make a graphics object from the empty bitmap
                Graphics g = Graphics.FromImage(rotatedBmp);
                //Put the rotation point in the center of the image
                g.TranslateTransform(offset.X, offset.Y);
                //rotate the image
                g.RotateTransform(angle);
                //move the image back
                g.TranslateTransform(-offset.X, -offset.Y);
                //draw passed in image onto graphics object
                g.DrawImage(image, new PointF(0, 0));
                return rotatedBmp;
            }
        }

    Теперь, как вам нужно его использовать, по нажатию кнопки:

                // промежуточное изображение, на котором будем рисовать график
                Bitmap image = new Bitmap(pictureBox1.Width,pictureBox1.Height);
                
                Graphics g = Graphics.FromImage(image);
                // рисуем график
                // тут прямоугольник только для примера, вставляйте свою кривую
                // g.DrawCurve(Pens.Red,points);
                g.DrawRectangle(new Pen(Brushes.Red), 0, 0, pictureBox1.Width-1, pictureBox1.Height-1);
                // освобождаем ресурсы
                g.Dispose();
                // выводим в pictureBox уже повернутое изображение
                pictureBox1.Image = Utilities.RotateImage(image, 90);
                // удаляем старое изображение
                image.Dispose();


    Для связи [mail]

    • Помечено в качестве ответа georgushek 25 декабря 2012 г. 13:32
    • Снята пометка об ответе georgushek 25 декабря 2012 г. 13:32
    • Помечено в качестве ответа georgushek 26 декабря 2012 г. 18:28
    25 декабря 2012 г. 13:25
  • Теперь в строчке g.DrawCurve(new Pen(Brushes.Red),0,0, pictureBox1.Width-1, pictureBox1.Height-1);

    Пишет ошибку Наиболее подходящий перегрузочный метод для System.Drawing.Graphics.DrawCurve(System.Drawing.Pen, System.Drawing.PointF[],int,int,float) имеет несколько недопустимых аргументов. Что это может вызывать?

    25 декабря 2012 г. 15:16
  • Зачем вы бездумно переименовали метод DrawRectangle в DrawCurve?

    Для связи [mail]

    25 декабря 2012 г. 15:17
  • Я сначала подумал что это не нужно записывать, но потом в процессе выполнения, начало появляться сообщение

    g.DrawCurve(Pens.Red, points); ArgumentNullException не обработано Значение не может быть неопределенным. Имя параметра points

    25 декабря 2012 г. 15:25
  • points - это ваши точки. Вы уже рисовали же линию, вот и возьмите те же исходные точки. ArgumentNullException означает что у вас points = null. Ищите ошибку, постарайтесь сначала сами разобраться в таких базовых вещах


    Для связи [mail]

    25 декабря 2012 г. 15:34
  • у меня стоит if (points != null)

    e.Graphics.DrawCurve(Pens.Red,points);

    25 декабря 2012 г. 15:43
  • У меня там сетка рисуется еще! Вот как идет запись:

    if (points != null)

    e.Draphics.DrawCurve(Pens.Red,points);

    Bitmap image = new Bitmap(pictureBox1.Width,pictureBox1.Height);

    Graphics g = Graphics.FromImage(image);

    g.DrawCurve(Pens.Red,points);

    g.Dispose();

    pictureBox1.Image= Utilities.RotateImage(image, 90);

    image.Dispose();

    • Изменено georgushek 26 декабря 2012 г. 6:07
    26 декабря 2012 г. 5:23
  • С формулами то получилось сделать?

    Вроде бы очень даже рабочий вариант.
    Возможностей многовато конечно (можно вращать и двигать как угодно вообще любую точку из всего, включая любую точку сетки), но рабочий вариант же.
    Должно получиться.
    26 декабря 2012 г. 6:05
  • Он пишет сообщение ArgumentNullException Значение не может быть неопределенным.Имя параметра: points, ссылается на k.DrawCurve(Pens.Red, points);

    Что это может быть?

    • Изменено georgushek 26 декабря 2012 г. 6:54
    26 декабря 2012 г. 6:18
  • я написал вместо  g.DrawCurve(Pen.Red, points);  g.DrawCurve(new Pen(Brushes.Red),0,0,pictureBox1.Width-1,pictureBox1.Height-1); Но теперь он говорит что наиболее подходящий перегруженный метод для System.Drawing.Graphics.DrawCurve(System.Drawing.Pen,System.Drawing.PointF[],int,int,float) имеет несколько недопустимых аргументов

    Аргумент 2: преобразование типа из int в System.Drawing.PointF[] невозможно

    26 декабря 2012 г. 8:33
  • Привет.

    Может вы остановитесь писать каждый шаг на форум, сядите и немного приведете свой код в порядок? Если компилятор вам пишет что нет такого метода, значит его нет и вы делаете что-то не так. Читайте какие есть методы, какие параметры они принимают, что вообще метод делает - это все описано в документации. Поставьте курсор на метод и нажмите F1.

    Пока вы сами не определите чего хотите - вам никто не поможет.


    Для связи [mail]

    26 декабря 2012 г. 8:39
  • У меня нет интернета, пишу я с планшета!

    Добавил points  вместо 0,0,  теперь пишит недостаточно памяти OutOfMemoryException не обработано

    g.DrawImage(image, new PointF(o,o));

    • Изменено georgushek 26 декабря 2012 г. 11:11
    26 декабря 2012 г. 11:05