Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 我应该使用什么算法来平滑地缩放图形或地图?_Algorithm_Language Agnostic_Zooming_Scaling_Graphing - Fatal编程技术网

Algorithm 我应该使用什么算法来平滑地缩放图形或地图?

Algorithm 我应该使用什么算法来平滑地缩放图形或地图?,algorithm,language-agnostic,zooming,scaling,graphing,Algorithm,Language Agnostic,Zooming,Scaling,Graphing,我有一个由函数生成的图形,它根据函数的值自动放大和缩小。我已经有了绘图工具,我可以以高分辨率显示任何x、y、宽度和高度 我试着抓住正确的位置: 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

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

我试着抓住正确的位置:

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万,则第一次跳跃太大,接近1000000%。然而,最后一次跳跃仅为10%。几何级数甚至更好,但如果我必须在缩放中切换方向,则步骤会跳跃

使用什么效果最好?

我可以试试

xDiff = new_x - orig_x
stepCount = 10

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

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

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...

此算法创建的缩放将在不同的环境中以不同的时间量运行。这与我写的内容相同。@tafa,因为不同的环境将在不同的时间量中执行非等待操作。如果系统在渲染过程的中途耗尽背景过程中的循环,结果仍然是第一部分所用的时间比缩放动画的最后一部分所用的时间要短。然而,帧与帧之间的变化是一致的。如果OP希望基于时间(其度量未说明)平滑运动,则动画需要基于经过的时间和动画长度计算下一帧位置。考虑到OP使用的是在每一步缩放原始图像的绘图工具,该进程使用的算法很可能需要不同的时间,这取决于要缩放到的分辨率。无论使用何种缩放步进方法,如果不考虑经过的时间和动画持续时间,根据渲染时间的不同,它会有不同程度的跳跃。如果开发人员假设每帧渲染只需1/30秒,并且在每帧之后暂停那么长时间,你能想象玩视频游戏会是什么样子吗?