缩放缩放因子

时间:2016-10-18 20:59:17

标签: c# math

我使用滚轮使用以下方法放大和缩小对象:

void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    lastMousePositionOnTarget = Mouse.GetPosition(grid);

    double max = 255;
    double min = .005;

    var deltaScale = Math.Max(Math.Log(scaleTransform.ScaleX), double.Epsilon);
    var delta = e.Delta > 0 ? Math.Max(e.Delta * deltaScale, .5) : Math.Min(e.Delta * deltaScale, -.5);
    double newScale = Math.Max(Math.Min((delta / 250d) + scaleTransform.ScaleX, max), min);

    scaleTransform.ScaleX = newScale;
    scaleTransform.ScaleY = newScale;

    System.Diagnostics.Debug.WriteLine(newScale);

    e.Handled = true;
}

我想让它在接近最大值时放大更慢,当数字接近最小值时更快。我目前有什么作品,但不是很好。我怎样才能解决这个问题呢?

3 个答案:

答案 0 :(得分:2)

假设我明白这一点,你希望你的deltaScale在放大时变大,但在缩小时变小。从而可以在近距离时快速变焦,在远处进行慢速变焦。

如果scaletransform.ScaleX因放大而变小,请尝试以下操作:

var deltaScale = Math.Max(K * 1/(scaleTransform.ScaleX), double.Epsilon);

其中K只是一些常见问题,直到感觉正确为止。

如果scaletransform.ScaleX因放大而变大,请尝试像日志一样的系数,其系数大于1:

var deltaScale = Math.Max(5*Math.Log(scaleTransform.ScaleX), double.Epsilon);

答案 1 :(得分:1)

首先,我不会使用值e.Delta进行计算(当然需要使用符号)。这个值不是很可靠 - 根据我的经验,它接近随机噪音。而是使用常量值或某些计数器,例如调用连续放大的次数以及调用连续放大的次数。

所以我的第一次尝试(具有恒定值)会看起来像这样。

void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    lastMousePositionOnTarget = Mouse.GetPosition(grid);

    double max = 255;
    double min = .005;

    var deltaScale = Math.Max(Math.Log(scaleTransform.ScaleX), double.Epsilon);
    var delta = e.Delta > 0 ? Math.Max(1 * deltaScale, .5) : Math.Min(1 * deltaScale, -.5);
    double newScale = Math.Max(Math.Min((delta / 250d) + scaleTransform.ScaleX, max), min);

    scaleTransform.ScaleX = newScale;
    scaleTransform.ScaleY = newScale;

    System.Diagnostics.Debug.WriteLine(newScale);

    e.Handled = true;
}

带计数器的版本看起来像这样。

private double counter=0;
private bool isZoomIn=true;
void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    lastMousePositionOnTarget = Mouse.GetPosition(grid);

    if( (e.Delta > 0 && isZoomIn) ||  (e.Delta < 0 && !isZoomIn))
               IncreaseCounter(counter);//is another one in a row
    else
               counter=1;

    isZoomIn = e.Delta > 0;//we set this flag for next time

    double max = 255;
    double min = .005;

    var deltaScale = Math.Max(Math.Log(scaleTransform.ScaleX), double.Epsilon);
    var delta = e.Delta > 0 ? Math.Max(counter * deltaScale, .5) : Math.Min(counter * deltaScale, -.5);
    double newScale = Math.Max(Math.Min((delta / 250d) + scaleTransform.ScaleX, max), min);

    scaleTransform.ScaleX = newScale;
    scaleTransform.ScaleY = newScale;

    System.Diagnostics.Debug.WriteLine(newScale);

    e.Handled = true;
}

请注意,我使用了伪函数IncreaceCounter而不仅仅是incrementaion,因为除了线性增加之外你可能还需要其他东西。

答案 2 :(得分:1)

这是我的最终答案,如果不是GEEF&amp ;;我就无法想出来。 Pawel非常感谢他们给予他们最好的拍摄。

void OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    double max = 255;
    double min = .005;
    double scaler = 4;

    var deltaScale = Math.Min(Math.Max(scaler * scaleTransform.ScaleX / max, min),1) * Math.Sign(e.Delta);
    double newScale = Math.Max(Math.Min(deltaScale + scaleTransform.ScaleX, max), min);

    scaleTransform.ScaleX = newScale;
    scaleTransform.ScaleY = newScale;

    e.Handled = true;
}

我使用当前比例与最大值的比率来获得斜率 - 并且不允许它快速(最大1)或太慢,min ==最小比例。工作正常。