【问题标题】:Algorithm for self-scaling ruler in plotter GUI component绘图仪 GUI 组件中的自缩放标尺算法
【发布时间】:2012-02-19 00:34:19
【问题描述】:

我正在使用 C#/WPF 设计(不是编程)医疗数据的数据系列查看器程序。有一个显示数据的主面板,具有常见的鼠标平移/缩放功能(左拖动平移、滚动水平缩放、双击垂直自动调整、右拖动选择)。

问题是:我需要在顶部/左侧带有标尺的垂直和水平网格,类似于在音频编辑(goldwave、audacity)、制图(gpsTrackmaker)和插图(photoshop、inkscape)程序中看到的那些。此外,这些标尺甚至可以在大多数绘图 API(Matlab、GNUPlot、Matplotlib)甚至办公程序(Excel、Calc)中进行配置。

除了始终与内容对齐和缩放外,主要要求是拥有一种“抗杂乱”算法,该算法仅以尽可能最大的粒度绘制刻度标签,而标签不会“碰撞”或相互隐藏。

下图显示了 Inkscape 上同一绘图的两个缩放级别。第一行显示每百个标签。第二行显示每个十年的标签。

问题是:“由于这(查看标尺的自动解析)似乎是许多程序中已解决的问题,我应该如何查找/可用的资源/教程是什么,以便我可以指定和实施这样的适合我需要的控件?”

如果有任何建议或示例,我将不胜感激,最好使用 C#,但也可以使用任何语言。

【问题讨论】:

    标签: algorithm scaling zooming rulers


    【解决方案1】:
    • W = 标尺的可见部分
    • X = W 表示的范围(左右)
    • w = 标签宽度

    n = W/w(可以显示的最大标签数)

    x = X*w/W(两个标签之间的最小范围)

    然后,您必须将 x 舍入为更大、更冷的值 1、2 或 5。

    例如

    • x=18.4 => x1=20
    • x=539 => x1=1000

    w1 = x1/X*W(标签宽度,或刻度之间的间距)

    n1 = W/w1(滴答数)

    【讨论】:

    • 为了完美工作,w 应该是 LARGEST 标签的宽度。我没有测试它,但我们最终使用的算法使用了这个概念。
    • 太棒了!超级惊人的答案!我们一直在尝试解决这个问题很长时间,但由于四舍五入而被奇怪的行为所抛弃。您能否也提一下它背后的理论数学概念的名称?例如:缩放属于仿射变换。这属于? @coffee_machine
    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    相关资源
    最近更新 更多