Как повернуть список строк вдоль оси? - PullRequest
3 голосов
/ 14 сентября 2010

У меня есть список строк, которые я рисую на оси. Я хочу вращать струны (опять же, они должны оставаться на одной горизонтальной оси при вращении). Я пытаюсь использовать следующий код:

namespace DrawString
{
    struct StringData
    {
        public string StringName;
        public int X;
        public int Y;
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Font mFont = new Font("Arial", 10.0f, FontStyle.Bold);
        List<StringData> data = new List<StringData> { new StringData() { StringName = "Label1", X = 10, Y = 30 },
                                                     new StringData() { StringName = "Label2", X = 130, Y = 30 }};

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            foreach (var str in data)
            {
                e.Graphics.RotateTransform(30);
                e.Graphics.DrawString(str.StringName, mFont, new SolidBrush(Color.Black), new Point(str.X, str.Y));
                e.Graphics.ResetTransform();
            }
        }
    }
}

Но это не работает, так как Графика вращается для обеих строк одновременно, в результате чего одна строка оказывается выше другой. Как я могу повернуть их по отдельности, используя центр строки в качестве оси вращения?

Ответы [ 2 ]

1 голос
/ 14 сентября 2010

Похоже, вы описываете что-то вроде этого:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    foreach (var str in data)
    {
        e.Graphics.TranslateTransform(str.X, str.Y);
        e.Graphics.RotateTransform(30);
        e.Graphics.DrawString(str.StringName, mFont, new SolidBrush(Color.Black), new Point(0, 0));
        e.Graphics.ResetTransform();
    }
}

Этот фрагмент сначала переводит, затем вращает, рисует строку в преобразованном источнике, а затем сбрасывает. Обе строки вращаются под одним и тем же углом на одной оси X, но происходят из разных точек.

0 голосов
/ 14 сентября 2010

А как же

        private void Form1_Paint(object sender, PaintEventArgs e) 
        { 
            e.Graphics.RotateTransform(30);
            foreach (var str in data) 
            { 
                e.Graphics.DrawString(str.StringName, mFont, new SolidBrush(Color.Black), new Point(str.X, str.Y)); 
            }
            e.Graphics.ResetTransform();  
        } 

Повернув плоскость, вы нарисуете строки в позиции

...