Сохранение объекта треугольника в списке и рисование снова - PullRequest
0 голосов
/ 12 сентября 2018

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

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

Класс формы

    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);
        }

Ответы [ 2 ]

0 голосов
/ 15 сентября 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);
        } 
0 голосов
/ 13 сентября 2018

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...