Почему этот код рисует прямоугольник вместо L-формы? - PullRequest
2 голосов
/ 21 апреля 2019

Я не могу понять, что не так с этим кодом.

Я пытаюсь нарисовать фигуру L, используя двумерный массив. По какой-то причине код рисует большую рамку вместо формы L. Я прошел через код, и позиции (x, y) в порядке.
Я не уверен, что делаю неправильно.

private int[,] matrix = new int[3, 3] {
    { 0, 1, 0 },
    { 0, 1, 0 },
    { 0, 1, 1 }
};

private void aCanvas_Paint(object sender, PaintEventArgs e) {
    var gfx = e.Graphics;
    var brush = new SolidBrush(Color.Tomato);
    for (var x = 0; x <= matrix.GetLength(0) - 1; x++) 
        for (var y = 0; y <= matrix.GetLength(1) - 1; y++)
           if (matrix[x, y] != 0) {
               var rect = new Rectangle(x, y, 30, 30);
               gfx.FillRectangle(brush, rect);
           }
}

1 Ответ

2 голосов
/ 21 апреля 2019

Ваш текущий код рисует 4 прямоугольника одинакового размера (30, 30) в немного другом месте (от (0, 1) до (2, 2)), так как вы просто используете индексаторы массива в качестве координат Locaton.

Простое решение, использующее значение Rectangle.Size, которое вы сейчас показываете:

Увеличьте значения (X, Y) Rectangle.Location на смещение, определенное Rectagle Height и Width, умножив текущие (x, y) позиции в матрице на эти смещения:
(Обратите внимание, что индекс x используется для умножения смещения высоты; конечно, для y наоборот)

private int[,] matrix = new int[3, 3] {
    { 0, 1, 0 },
    { 0, 1, 0 },
    { 0, 1, 1 }
};

Size rectSize = new Size(30, 30);
private void panel2_Paint(object sender, PaintEventArgs e)
{
    int xPosition = 0;
    int yPosition = 0;
    using (var brush = new SolidBrush(Color.Tomato)) {
        for (var x = 0; x <= matrix.GetLength(0) - 1; x++)
        for (var y = 0; y <= matrix.GetLength(1) - 1; y++)
        {
            xPosition = y * rectSize.Width;
            yPosition = x * rectSize.Height;

            if (matrix[x, y] != 0) {
                var rect = new Rectangle(new Point(xPosition, yPosition), rectSize);
                e.Graphics.FillRectangle(brush, rect);
            }
        }
    }
}

enter image description here

С этой матрицей:

private int[,] matrix = new int[3, 3] {
    { 0, 1, 0 },
    { 0, 1, 0 },
    { 1, 1, 1 }
};

Вы получите это:

enter image description here

...