【问题标题】:What algorithm should I use to zoom a graph or map smoothly?我应该使用什么算法来平滑缩放图形或地图?
【发布时间】:2011-05-01 08:54:02
【问题描述】:

我有一个由函数生成的图表,它会根据函数的值自动放大和缩小。我已经有了绘图工具,我可以以高分辨率显示任何 x,y,width,height。

我试着捕捉到正确的位置:

x = target_x
y = target_y
width = target_width
height = target_height

但它太紧张了。很难分辨放大/缩小的部分。

我也试过这样做:

orig_x = x //ditto for y, width, height, etc
for i=1 to 10
    x = i/10*new_x + i/10*orig_x
    wait 25ms

比较顺利,但是第一步还是太跳跃了。如果 orig_x 是 10 而 new_x 是 100 万,那么第一次跳跃太大了,接近 1,000,000%。然而,最后一次跳跃只有 10%。几何级数甚至更好,但如果我必须在缩放中间切换方向,步骤会很跳跃。

用什么效果最好?

【问题讨论】:

    标签: algorithm language-agnostic zooming scaling graphing


    【解决方案1】:

    我可以试试

    xDiff = new_x - orig_x
    stepCount = 10
    
    for i=1 to stepCount
        x = orig_x + i/stepCount * xDiff
        wait 25ms
    

    【讨论】:

    • 此算法创建的缩放将在不同的环境中运行不同的时间。
    • 这和我写的一模一样。
    • @tafa 因为不同的环境会在不同的时间内执行非等待操作。如果系统在渲染的中途消耗了后台进程的周期,结果仍然是第一部分比缩放动画的最后一部分花费的时间更短。然而,从帧到帧的变化将是一致的。如果 OP 想要基于时间的平滑运动(他的指标未说明),那么动画需要根据经过的时间和动画长度来计算下一帧的位置。
    • 考虑到 OP 正在使用在每一步缩放原始图像的绘图工具,处理使用的算法可能需要不同的时间,具体取决于缩放到的分辨率。无论使用哪种缩放步进方法,如果不考虑经过的时间和动画持续时间,它会根据渲染发生的时间而产生不同程度的跳跃。
    • 如果开发人员假设每一帧渲染时间正好是 1/30 秒,并且在每一帧后暂停这么长时间,你能想象玩电子游戏会是什么样子吗?
    【解决方案2】:

    您想为每一步缩放/移动最后一个窗口的固定百分比。这意味着您的缩放将是一个指数曲线,并且您的转变将与您的缩放相关联。以下内容应该是一种改进:

    width_ratio = new_width / old_width
    width_ratio_log = log(width_ratio)
    
    x_diff = new_x - old_x
    x_factor = x_diff / (width_ratio - 1)
    -- warning: need to handle width_ratio near 1 the old way!
    
    for i=1 to steps
        width_factor = exp(width_ratio_log * i / steps)
        width = old_width * width_factor
        x = old_x + x_factor * (width_factor - 1)
    
        -- similarly for y and height...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 2011-05-22
      相关资源
      最近更新 更多