Рисование связи или пути между двумя линиями с помощью c # - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь нарисовать путь между двумя линиями, как показано ниже.

wanted graph

Я использовал следующий код для этого

        Pen usedpen= new Pen(Color.Black, 2);
        //Point[] p = {
        //    new Point(518,10),
        //    new Point(518,20),
        //    new Point(518-85,15)
        //};
        GraphicsPath path = new GraphicsPath();

        path.StartFigure();
        path.AddLine(new Point(518, 10), new Point(433, 10));
        path.AddLine(new Point(518, 40), new Point(433, 40));
        path.AddLine(new Point(433,10), new Point(433,40));
        //usedpen.LineJoin = LineJoin.Round;
        e.Graphics.DrawPath(usedpen, path);

Но после использования этого кода рисуется следующий рисунок:

Result

Любая помощь
Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

По умолчанию всякий раз, когда вы добавляете фигуру, скажем, что Линия к GraphicPath, ее начальная точка будет связана с конечной точкой последней фигуры.Поэтому порядок имеет значение!

Способ предотвратить это - использовать StartFigure всякий раз, когда вы хотите нарисовать неподключенных линий:

Начинает новую фигуру, не закрывая текущую фигуру.Все последующие точки, добавленные к пути, добавляются к этой новой фигуре.

    Pen usedpen= new Pen(Color.Black, 2);
    //Point[] p = {
    //    new Point(518,10),
    //    new Point(518,20),
    //    new Point(518-85,15)
    //};
    GraphicsPath path = new GraphicsPath();

    path.StartFigure();
    path.AddLine(new Point(518, 10), new Point(433, 10));
    path.StartFigure();   // <---
    path.AddLine(new Point(518, 40), new Point(433, 40));
    path.StartFigure();   // <---
    path.AddLine(new Point(433,10), new Point(433,40));
    //usedpen.LineJoin = LineJoin.Round;
    e.Graphics.DrawPath(usedpen, path);

enter image description here

Конечно, ваша проблема в основном была неправильной порядок или рисование линий, поэтому другой ответ правильный.

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

0 голосов
/ 26 апреля 2018

Аналогичный метод, использующий GraphicsPath.AddLines () (который также удаляет созданный объект).

GraphicsPath.StartFigure () неиспользуется, так как это единственная фигура нарисована.Если в GraphicsPath добавлено больше точек, .StartFigure() создаст новый подпуть, не связывая ранее существующие.

Подпути можно анализировать для проверки типа содержащихся фигур, используя GraphicsPathIterator .

using (GraphicsPath path = new GraphicsPath())
{
    Point[] points = new Point[] {
        new Point(518, 10), new Point(433, 10),
        new Point(433, 40), new Point(433, 40),
        new Point(433, 40), new Point(518, 40)
    };

    path.AddLines(points);
    e.Graphics.DrawPath(new Pen(Color.Black, 2), path);

    //Add a new figure
    path.StartFigure();
    path.AddEllipse(new Rectangle(450, 40, 50, 50));
    e.Graphics.DrawPath(new Pen(Color.Black, 2), path);
};
0 голосов
/ 25 апреля 2018

О, вы используете событие onPaint, поэтому проблема в том, что вы рисуете путь, который означает, что точка переместится от конца первой строки к началу следующей.

Послепервая строка

path.AddLine(new Point(518, 10), new Point(433, 10));

Теперь точка находится на (433, 10)

Теперь следующая строка говорит, что переход от (518, 40) к (433, 40))

Теперь то, что на самом деле происходит, это линия, проведенная из (433, 10) в (518, 40), потому что это путь, который она продолжает рисовать.

 GraphicsPath path = new GraphicsPath();
 path.StartFigure();
 path.AddLine(new Point(518, 10), new Point(433, 10));
 path.AddLine(new Point(433, 10), new Point(433, 40));
 path.AddLine(new Point(433, 40), new Point(518, 40));
 usedpen.LineJoin = LineJoin.Round;
...