Логика за сложными линиями - PullRequest
       2

Логика за сложными линиями

5 голосов
/ 26 февраля 2011

Я хочу нарисовать линию из точки A в точку B. Однако сами линии должны быть разумными в том смысле, что если точка B находится на exactly ниже точки A, то должна быть проведена прямая линия.Но если точка B находится ниже А и немного далеко по горизонтали от А, то линия должна быть нарисована под прямым углом.Я надеюсь, что вы меня поймали.Если вы использовали какой-либо инструмент UML, например edraw Max или любой другой, вы могли видеть эти типы линий.Есть идеи, как этого добиться?

Заранее спасибо:)

Ответы [ 4 ]

4 голосов
/ 26 февраля 2011

Вот код:

void connectPoints(Point a, Point b)
{
    Point middlePoint1(a.x, (a.y + b.y)/2);
    Point middlePoint2(b.x, (a.y + b.y)/2);
    drawLine(a, middlePoint1);
    drawLine(middlePoint1, middlePoint2);
    drawLine(middlePoint2, b);
}

Чтобы уточнить, запрашивающему на самом деле нужны 3-сегментные выровненные по оси линии, которые выглядят как большинство соединений здесь: style

1 голос
/ 26 февраля 2011

Это то, что вы подразумеваете под прямым углом интеллекта? псевдо следует ...

Point pA(x,y);
Point pB(x,y);
if abs(pB.X-pA.X) < abs(pB.Y-pA.Y) // Going vertically or horizontal?
{
    DrawLine(pA.X, pA.Y, pA.X, pB.Y); //Long vertical
    DrawLine(pA.X, pB.Y, pB.X, pB.Y); //Short horizontal
}
else
{
    DrawLine(pA.X, pA.Y, pB.X, pA.Y); //Long horizontal
    DrawLine(pB.X, pA.Y, pB.X, pB.Y); //Short vertical
}

или для кривой линии (от макушки головы):

Point pA=(x,y);
Point pB=(x,y)
if abs(pB.X-pA.X) < abs(pB.Y-pA.Y) // Going vertically or horizontal?
{
    Point pHalfwayY = (pB.Y-pA.Y)/2 + pB.Y
    DrawLine(pA.X, pA.Y, pA.X, pHalfwayY ); //Long vertical 1st half
    DrawLine(pA.X, pHalfwayY , pB.X, pHalfwayY ); //Short horizontal
    DrawLine(pA.X, pHalfwayY , pA.X, pB.Y); //Long vertical 2nd half
}
else
{
    Point pHalfwayX = (pB.X-pA.X)/2 + pB.Y
    DrawLine(pA.X, pA.Y,pHalfwayX , pA.Y); //Long horizontal 1st Half
    DrawLine(pHalfwayX , pA.Y, pHalfwayX , pB.Y); // Short Vertical
    DrawLine(pHalfwayX , pA.Y, pA.X, pB.Y); //Long horizontal 2nd half
}

Надеюсь, это поможет.

1 голос
/ 26 февраля 2011

В чем проблема с простым подходом?

// pA, pB - points
DrawLine(pA.X, pA.Y, pA.X, pB.Y); // vertical line from A point down/up to B
DrawLine(pA.X, pB.Y, pB.X, pB.Y); // horizontal line to B
0 голосов
/ 26 февраля 2011

Графические библиотеки, такие как GDI + , будут обрабатывать это для вас и будут рисовать линии в соответствии с начальной и конечной точками.

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

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