Сохранение объекта треугольника в списке и повторная краска

Я пытаюсь сохранить треугольник, который я нарисовал, и нарисовать снова, пока предыдущий треугольник все еще существует. Я сделал это в прямоугольнике, квадрате, круге и эллипсе, и это сработало. Я не знаю, почему этого не будет в Треугольнике. Что-то не так в коде?

Вот как я рисую и "сохраняю (не работает)"

Класс формы

    public void DrawTriangle(Color c, int stroke,PointF[] tpoints, float w, Graphics g)
    {
        this.width = w;
        this.strokeThickness = stroke;
        this.tPoints = tpoints;
        g.InterpolationMode = InterpolationMode.High;
        g.SmoothingMode = SmoothingMode.AntiAlias;
        g.DrawPolygon(new Pen(c, stroke), tpoints);
    }

Форма 1

    public void DrawTriangle()
    {
        tC = Color.Red;
        strokeTriangle = trackBar_Stroke.Value;
        tW = Convert.ToInt32((Convert.ToInt32(tbox_Width.Text) * 96) / 25.4);
        tH = (Convert.ToInt32((tW * (Math.Sqrt(3))) / 2));
        tX = (pictureBox_Canvass.Width - tW) / 2;
        tY = ((pictureBox_Canvass.Width - (tH)) / 2) + tH;

        float angle = 0;
        t_Points[0].X = tX;
        t_Points[0].Y = tY;
        t_Points[1].X = (float)(tX + tW * Math.Cos(angle));
        t_Points[1].Y = (float)(tY + tW * Math.Sin(angle));
        t_Points[2].X = (float)(tX + tW * Math.Cos(angle - Math.PI / 3));
        t_Points[2].Y = (float)(tY + tW * Math.Sin(angle - Math.PI / 3));
    }
    public void AcceptTriangle()
    {
        Shape shape = new Shape();
        tC = Color.Gray;
        shape.strokeThickness = strokeTriangle;
        shape.width = tW;
        shape.x = tX;
        shape.y = tY;
        shape.tPoints = t_Points;
        s._triangle.Add(shape);
    }

 s.DrawTriangle(tC, strokeTriangle,t_Points, tX, tY, tW, e.Graphics);

Вот как я повторяю это.

public List<Shape> _triangle = new List<Shape>();
foreach(Shape shapes3 in s._triangle)
        {
            shapes3.DrawTriangle(shapes3.color, shapes3.strokeThickness, shapes3.tPoints, shapes3.width, e.Graphics);
        }

person TerribleDog    schedule 12.09.2018    source источник
comment
Как вы сделали это для Rectangle и почему вы не можете использовать то же решение для Triangle? В чем проблема в коде, которым вы поделились?   -  person Reza Aghaei    schedule 12.09.2018
comment
Я сказал вам, что Не работает не является полезным описанием проблемы, когда только вчера задал точно такой же вопрос. - Вы смотрели на данные, чтобы проверить, являются ли они треугольниками? Может быть, вы все время перезаписываете один и тот же массив? Мы этого не видим!! Для проверки замените this.tPoints = tpoints; на this.tPoints = tpoints.ToArray(); !   -  person TaW    schedule 12.09.2018
comment
@TaW, но это действительно мой вопрос, этот процесс, который я пытаюсь использовать с треугольником - сохранение его объекта и повторение его, работает с другими фигурами. Я не знаю, что я делаю неправильно здесь. Пожалуйста, потерпите меня.   -  person TerribleDog    schedule 13.09.2018
comment
Вы пробовали мое предложение? Также: Что происходит? Ничего такого? Ошибки? (Какие?) Сбои? Неправильные результаты? (Который?)   -  person TaW    schedule 13.09.2018
comment
Ничего не произошло. @TaW   -  person TerribleDog    schedule 13.09.2018
comment
Я только что задал два вопроса, а вы ответили только на один. Довольно невежливо, имхо.   -  person TaW    schedule 13.09.2018
comment
Ничего не происходит, поэтому нечего ответить на вторую часть. ржунимагу   -  person TerribleDog    schedule 13.09.2018
comment
Я дал вам фрагмент кода в моем 1-м комментарии. Вы его тестировали??? Также: Вы использовали отладчик для проверки данных при сохранении и перерисовке??   -  person TaW    schedule 13.09.2018
comment
Конечно, Он пробовал. Как, черт возьми, я бы знал, если бы это не сработало, если бы я этого не сделал. И да   -  person TerribleDog    schedule 13.09.2018


Ответы (2)


В двух точках вашего кода вы пишете назначение массива следующим образом:

this.tPoints = tpoints;

.. и это:

shape.tPoints = t_Points;

Распространенной ошибкой является предположение, что это создает массив с данными. Это не так. Все, что он делает, это делает переменную массива указывающей на массив, который был там раньше.

Данные не дублируются. Поэтому, когда вы перезаписываете данные или очищаете их, «новый» массив теперь указывает на измененные или очищенные данные.

Таким образом, все ваши объекты имеют очень одинаковые точки.

Для исправления создайте фактические копии данных!

Самый простой способ — добавить вызов ToArray() следующим образом:

this.tPoints = tpoints.ToArray();

.. и это:

shape.tPoints = t_Points.ToArray();

Повторить:

int[] p1 = new int[2] { 23, 42 };   // Now we have one array.
int[] p2 = new int[2] { 3, 2 };    // Now we have two arrays.
p2 = p1;                 //  Now we have only one array again.
p2[1]=1234;             // Now p1[1] is 1234
person TaW    schedule 13.09.2018

Принятие треугольника (сохранение в список)

var triangle = new Shape
                {
                    strokeThickness = strokeTriangle,
                    color = tC,
                    tPoints = t_Points.ToArray(),
                    x=tX,
                    y=tY,
                    width = tW,
                };
                s._triangle.Add(triangle);

Итерация по списку

foreach(Shape shapes3 in s._triangle)
        {
            shapes3.DrawTriangle(shapes3.color, shapes3.strokeThickness,shapes3.tPoints.ToArray(), shapes3.x, shapes3.y, shapes3.width, e.Graphics);
        } 
person TerribleDog    schedule 15.09.2018