Провести параллельную линию - PullRequest
1 голос
/ 09 декабря 2011

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

У меня есть следующий код для возврата сгенерированной линии.У меня проблемы с углами фигуры.Какой-то пункт выходит за исходную строку.

Мой код:

PointF[] GetParrarel(PointF[] lst, double width, float distance)
{
    List<PointF> final = new List<PointF>();
    width = width + distance;

    for (int i = 0; i < lst.Length-1 ; i++)
    {
        int index = i;
        PointF current = lst[index];
        PointF next = lst[index + 1];
        double dx = next.X - current.X;
        double dy = next.Y - current.Y;
        PointF first = current;
        PointF second = next;
        if (dx > 0)
        {
            if (dy == 0)
            {
                first.Y += (float)width;
                second.Y += (float)width;
            }
            first.X += (float)width;
            second.X += (float)width;

        }
        else if (dx < 0)
        {
            if (dy == 0)
            {
                first.Y -= (float)width;
                second.Y -= (float)width;
            }
            first.X -= (float)width;
            second.X -= (float)width;                    
        }
        else //// X = 0 
        {
            if (dy > 0)
            {
                first.X -= (float)width;
                second.X -= (float)width;
            }
            else if (dy < 0)
            {
                first.X += (float)width;
                second.X += (float)width;                       
            }
            else
            {
                continue;
            }
        }
        final.Add(first);
        final.Add(second);
    }
    return final.ToArray();
}

1 Ответ

4 голосов
/ 11 декабря 2011

Я понял, как это сделать, но это сложно. Вот скриншот примера, который я сделал. Screenshot

Мне понадобилось три класса для этого.

  1. класс Line, который описывает бесконечную линию с использованием коэффициентов a, b, c для уравнения a*x+b*y+c=0. Конструктор берет два PointF и вычисляет коэффициенты. Линия имеет «центр», который является точкой, ближайшей к началу координат. Любая точка вдоль линии может быть описана как расстояние от «центра» вдоль направления линии.

  2. класс LineSeg, который описывает отрезок линии, определяя линию, а также начальное и конечное расстояние от центра линии (см. Выше).

  3. class PolyLine, который является просто набором LineSeg и может быть инициализирован списком PointF. Я добавил опцию для описания замкнутой ломаной линии, добавив отрезок к начальной точке в конце.

Смещение бесконечной линии вычисляется путем взятия точки на линии и ее перемещения в направлении, перпендикулярном линии, а затем расчета нового коэффициента c через эту точку в том же направлении (c -> c + offset*sqrt(a^2+b^2)). Результирующая бесконечная линия «обрезается» соседними линиями путем нахождения их точек пересечения.

Полностью объяснить сложно, но вы можете свободно изучать исходный код и задавать вопросы. Исходный код проекта доступен здесь .

ПРИМЕЧАНИЕ. Расстояние линии с уравнением a*x+b*y+c=0 до начала координат distance = c/sqrt(a^2+b^2). Таким образом, чтобы сместить линию, вам нужен новый c, в результате чего новое расстояние будет distance+offset

...