我想从点A画一条线到点B。但是这条线本身应该是智能的,如果点B恰好在点A正下方,则应绘制一条直线。但如果点B在A下面并且水平方向上离A有一定距离,则应以直角方式绘制一条线。希望你能理解我的意思。如果你使用过任何UML工具,如edraw Max或其他工具,你可能已经见过这些类型的线条。有什么办法可以实现这个功能吗?谢谢!
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);
}
直接的方法有什么问题吗?
// 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
这是你所说的直角智能吗?伪代码随之而来...
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
}
像GDI+这样的图形库会为您处理这个问题,并根据起点和终点绘制线条。
如果您想自己处理这个问题,您需要使用三角函数来确定线条的旋转角度。