我需要显示一个包含数千个节点的图形,以便用户可以滚动和缩放来查看它。节点需要表现得像无量纲点,而边需要表现得像一维线。也就是说,放大时,代表节点的圆圈距离更远,但每个圆圈的大小保持不变,连接它们的线会变长但不会变粗。如果可能,缩放应该是“连续的”和“无限的”。
使用什么 API 和算法来解决这个问题?(例如在 CAD 或 GIS 应用程序中)
使用 GDI+,我无法获得接近可接受的性能。我的实现可能很幼稚,但是,我仍然猜想我需要 OpenGL 或 DirectX。
您需要将线和可见点的绘制与代表点的位置的缩放分开。这样,当场景被缩放时,您实际上只是缩放您的位置,然后使用相同的线和可见点方法进行渲染,而不管缩放级别如何。
上次我查看时,Direct3D 不会为您提供任何开箱即用的东西来执行此操作。您需要自己实现线和点原语。更重要的是,您需要对向量和矩阵有深入的了解才能在 Direct3D 中执行所需的转换。没怎么用过OpenGL。
GDI+ 可能会很慢,但您实际上可以通过非常小心地仅显示当前可见的点来获得不错的性能。如果我处于你的位置,我肯定会花更多的时间来提高你的渲染算法的性能并坚持使用 GDI+ 更长时间。
此外,将您的场景完全渲染到内存中的位图(大小与可见窗口相同),然后简单地一次性渲染此位图,将比单独将每个点和线单独渲染到可见窗口上提供更好的性能。
我相信ROOT提供了所有要求的功能,尽管它是一个大包并且需要学习很多东西......
ZedGraph将完成您所描述的大部分工作(以固定大小显示线和点、缩放等)。我建议您查看 codeproject 教程,看看它的功能是否适合您的需求。我发现它易于实现,高度灵活,.dll 大约 300k。
希望这会有所帮助,安德鲁
我最近发布了一个用于加速 3d 绘图的 Java 库(http://code.google.com/p/jzy3d/)。
有一个 3d 散点图示例,其中 3d 点是无量纲的。添加连接网络节点的所有线路应该是小菜一碟。
有可用的工具可以用鼠标缩放/缩放 3d 场景,所以也许你几乎无事可做。
问候,马丁