【问题标题】:Drawing a line connecting two rectangles画一条连接两个矩形的线
【发布时间】:2011-06-06 13:20:23
【问题描述】:

我正在 Swing/AWT 中制作自己的类图应用程序,但我停止了这个功能:

  • 我想在已经选择的类矩形和目标类矩形之间画一条线,但线有一个特点,即每当我移动其中一个矩形时,连接它们的线会按照直线方式弯曲移动矩形,我希望下图展示我想要实现的目标:

高度赞赏一般指南或示例代码

【问题讨论】:

  • 父类是否总是严格高于子类?或者它们也可以并排?

标签: java swing graphics awt


【解决方案1】:

我不懂 Java,但您可以按照以下步骤操作:

  • 找到矩形每行的中间(应该很容易,只需平均 x1+x2 和 y1+y2)
  • 使用毕达哥拉斯公式对您在上一步中获得的点确定最接近的边。
  • 从 xa,ya 开始绘制一条线(您在上述步骤中得到的第一个点),然后朝远离矩形的方向绘制。你应该知道这个方向,因为你可以知道这个点所在的线段。
  • 对 xb,yb 执行相同的操作(点在第二个矩形上)。如果线条方向相反,则应将它们绘制到 xa-xb 或 ya-yb 的中间(取决于您是水平绘制还是垂直绘制)。如果它们是垂直的(这是正确的词吗?)你应该把它们画到它们交叉的点,所以你画一条从 xa,ya 到 xa,yb 或 xa,ya 到 xb,ya 的线,这取决于你是否画了水平线或垂直线。
  • 应该额外检查矩形是否重叠。例如,您不应该在同一方向上画线。在您无法确定如何绘制这些直线的情况下,也许只在两点之间绘制一条对角线就足够了。

对于实现,您可以构建一个使用观察者模式的线类来监听它跟随的两个矩形,因此它可以在其中一个移动或调整大小时自行更新。

【讨论】:

  • 谢谢你的解释:)
【解决方案2】:

http://java-sl.com/connector.html 希望这会有所帮助。

【讨论】:

【解决方案3】:

尝试使用observer 模式。所有与移动对象连接的线都应通知对象的新位置并正确“弯曲”。当然,首先要实现一些连接两个对象的逻辑。

【讨论】:

    【解决方案4】:

    尝试创建一个名为“ConnectingLine”或类似名称的类。然后这个类将有几个段(这是直径中这些线部分的名称,这是当前我最喜欢的uml建模工具),它们将被一一计算。当然,你会有一个单独的类;)可能称为“LineSegment”。我认为这应该使您更容易执行执行此任务所需的数学计算。

    这也可以使分段“自动路由或不自动路由”变得容易 d(^_^)b

    【讨论】:

    • 另外,klark 关于如何在此处适当使用观察者模式的观察(没有双关语)非常好!