1

我目前是一名学生,正在尝试设计一个 Visual C++ 应用程序,以允许我直观地插入一个有向图,以便使用该图的矩阵创建一个文本文件。此时,我创建了一个 onClick 事件来创建节点,并使用表单的 Paint 事件来绘制节点。我还插入了条件以避免节点重叠。

我目前正在创建节点之间的链接。我遇到的问题是连接两个节点的线穿过另一个节点。我认为编写一个算法来检测重叠并计算线需要弯曲多少以避免在这种情况下过于繁琐。

因此,我考虑创建一条可以由用户通过单击并向左或向右拖动来弯曲的线,但是我在查找有关如何执行此操作的任何教程时遇到了问题。因此,如果有人不得不在项目中引入这种拱形线,或者知道我可以在哪里找到有关这方面的一些信息,我将不胜感激。

提及:

  1. 请不要推荐任何花哨的图形库来执行此操作,因为我对为此程序安装 3rd 方的东西不感兴趣。我想插入代码的函数被命名为 form1_onPaint,所以我想严格遵守 C++ 标准库。
  2. 我知道我说过我有兴趣通过单击和拖动来拱起一条线,但是如果有人可以提出另一种可行的解决方案,例如检测 onPaint 事件中重叠的功能或任何其他可能用于解决此问题的功能,它会有很大帮助。
4

2 回答 2

1

一种可能的方法是允许用户抓住并拖动其中一条连接线的中点,这会将线分成两段(在末端连接)。这使事情变得简单,避免了处理复杂曲线的需要,而且实现起来也很简单。您可以花哨并允许对行进行额外的细分,因此最终可以将单行分解为任意数量的子行。

关于这样做需要什么的一些基本想法:

  • 线段和定义端点的各个点的表示。您可以为一端存储一个点,为每个中间分段断点存储一个点,为另一端存储一个最终点。

  • 一种跟踪光标位置的方法,这样当它接近一条线的中点时,您可以准备抓取并拖动该线以将其分割。“鼠标移动”事件将在其中发挥作用。不确定您使用的是哪个工具包,或者我会更具体地说明事件的名称 - 它可能是 onMouseMove。

  • 一种跟踪拖动操作的方法。这可能涉及“鼠标向下”、“鼠标移动”和“鼠标向上”。拖动时,您将更新相关分段断点的坐标。

不幸的是,我认为基本的绘图/窗口系统在尝试检测相互重叠的油漆方面没有多大用处。您可以自己完成,但我同意您的想法,即编写代码可能既棘手又乏味。

最终产品可能看起来像这样:


(来源:misterfoo.com

于 2008-10-18T21:34:13.763 回答
1

如果要绘制曲线,请查看 Windows GDI 功能PolyBezier()

创建一个包含四个点的数组:第一个点和最后一个点应该是端点,即您连接两个点的节点。两个中点应该相同,并且应该是曲线的“点”,即您用鼠标拖动的位置。

于 2008-10-19T10:16:00.340 回答