C# получить все пиксельные координаты между 2 точками ошибки - PullRequest
1 голос
/ 22 апреля 2020

Итак, во-первых, у меня есть несколько координат X1, Y1, X2 и Y2. X1 / Y1 представляет начальные точки, X2 / Y2 - конечные точки, поэтому я рисую линию из них. Мне нужно хранить все пиксели / точки между этими 2 точками. У меня есть алгоритм, который, кажется, делает это, но есть некоторые ошибки. Я понятия не имею, почему только половина из них будет храниться в словаре.

Код (точка p1 => X1 и Y1, точка p2 => X2 и Y2):

public List<Point> GetPoints(Point p1, Point p2)
{
    List<Point> points = new List<Point>();

    // no slope (vertical line)
    if (p1.X == p2.X)
    {
        for (double y = p1.Y; y <= p2.Y; y++)
        {
            Point p = new Point(p1.X, (int)y);
            points.Add(p);
        }
    }
    else
    {
        // swap p1 and p2 if p2.X < p1.X
        if (p2.X < p1.X)
        {
            Point temp = p1;
            p1 = p2;
            p2 = temp;
        }

        double deltaX = p2.X - p1.X;
        double deltaY = p2.Y - p1.Y;
        double error = -1.0f;
        double deltaErr = Math.Abs(deltaY / deltaX);

        double y = p1.Y;
        for (double x = p1.X; x <= p2.X; x++)
        {
            Point p = new Point((int)x, (int)y);
            points.Add(p);

            error += deltaErr;

            while (error >= 0.0f)
            {
                y++;
                points.Add(new Point((int)x, (int)y));
                error -= 1.0f;
            }
        }

        if (points.Last() != p2)
        {
            int index = points.IndexOf(p2);
            points.RemoveRange(index + 1, points.Count - index - 1);
        }
    }

    return points;
}

Некоторое объяснение: в конце всей этой процедуры я получу список точек со всеми координатами между точками -> что хорошо. После этого я рисую эти точки, но, как вы можете видеть на картинке, только половина из них была сохранена (белые линии показывают сохраненные координаты между точками). Есть ли что-то, чего я не заметил в коде? Почему хранятся только те? Заранее спасибо!

(желтые круги - это отправные точки, а фиолетовые - это конечные точки)

Подробное описание здесь

1 Ответ

1 голос
/ 22 апреля 2020

У меня есть идея. Все сохраненные точки вашего успеха направлены из левого верхнего угла в нижний правый угол, а все не сохраненные точки направлены из левого нижнего угла в верхний правый. Так что проблема в направлении Y-координаты.

В первом сценарии координата Y изменяется от меньшего к большему значению, поэтому y++; приблизит нас к конечной точке, а последняя точка будет равна конечной точке, а points.Last() != p2 вернет false.

Во втором сценарии deltaY отрицателен, поэтому y++ отодвинет нас от конечной точки, а int index = points.IndexOf(p2); вернет -1, поскольку в коллекции нет конечной точки. Поэтому

points.RemoveRange(index + 1, points.Count - index - 1);
// points.RemoveRange(-1 + 1, points.Count - -1 - 1);
// points.RemoveRange(0, points.Count);

удалит все точки.

Вам необходимо рассчитать deltaYdirection с помощью var deltaYdirection = (int) Math.Sign(deltaY) и использовать y += deltaYdirection; вместо y++;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...