复杂线条背后的逻辑

时间:2011-02-26 11:20:20

标签: c# algorithm

我想画一条从A点到B点的线。但是,如果B点在A点以下exactly,那么线本身应该是智能的,应画出一条直线。但是如果B点低于A且远离A水平远,则应以直角方式绘制一条直线。我希望你能得到我。如果您使用过任何UML工具,例如edraw Max或其他任何UML工具,您可能已经看过这些类型的行。知道怎么能实现这个目标吗?

提前致谢:)

4 个答案:

答案 0 :(得分:4)

以下是一些代码:

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 :(得分:1)

简单方法有什么问题?

// 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

答案 2 :(得分:1)

这是你的直角智力的意思吗?伪随之而来......

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
}

希望这有帮助。

答案 3 :(得分:0)

GDI + 这样的图形库会为你处理它,它会根据它的起点和终点绘制线条。

如果你想自己处理这个问题,你必须使用三角形数学来确定你的线的旋转角度。