C# 基于鼠标滚轮的二维图像缩放中出现的白色面片

C# 基于鼠标滚轮的二维图像缩放中出现的白色面片,c#,plot,zooming,ilnumerics,C#,Plot,Zooming,Ilnumerics,我们目前正在PlotCube上使用缩放功能,该功能使用鼠标滚轮放大和缩小二维图像打印(TwoDMode=true)。我们还使用通过缩放选择矩形功能获得的缩放,同样由ILNumerics库提供。问题是,当我们使用鼠标滚轮将2D图像放大/缩放到足够大时,图像上开始出现白色斑块(我认为这与“视图剪裁”窗格有关)。当我们使用“缩放选择矩形”功能放大较大数量时,不会发生这种情况 这个问题有解决办法吗?或者我们必须自己实现鼠标滚轮缩放(通过捕捉鼠标滚轮事件并相应地更改限制) 下面是一些示例代码,将其弹出到基

我们目前正在PlotCube上使用缩放功能,该功能使用鼠标滚轮放大和缩小二维图像打印(TwoDMode=true)。我们还使用通过缩放选择矩形功能获得的缩放,同样由ILNumerics库提供。问题是,当我们使用鼠标滚轮将2D图像放大/缩放到足够大时,图像上开始出现白色斑块(我认为这与“视图剪裁”窗格有关)。当我们使用“缩放选择矩形”功能放大较大数量时,不会发生这种情况

这个问题有解决办法吗?或者我们必须自己实现鼠标滚轮缩放(通过捕捉鼠标滚轮事件并相应地更改限制)

下面是一些示例代码,将其弹出到基本应用程序(Windows窗体或WPF)中。ILPanel实例应称为ILPanel,并将其停靠到整个主窗口或父窗口内容。在窗口“loaded”事件期间调用方法“IlPanelOnLoad()

private void IlPanelOnLoad()
{
ilPanel.Scene=PlotImageTest();
var pc=ilPanel.Scene.First();
pc.DataScreenRect=新矩形F(0.15f、0.10f、0.80f、0.70f);
ilPanel.Scene.Configure();
ilPanel.Refresh();
}
专用ILScene PlotImageTest()
{
var scene=new ILScene();
//要显示的数据来自预定义的
//ILNumerics中包含的示例数据集
ILArray A=ILMath.tosingle(ILSpecialData.terrain[“0:240;0:240]”);
//我们获取最小值和最大值以获得严格限制
浮动最小值,最大值;
A.GetLimits(输出最小值、输出最大值);
//创建曲面
ILSurface=新的ILSurface(A);
surface.Wireframe.Visible=false;//用于快速渲染
surface.Markable=false;
//场景设置:在二维模式下添加plotcube。。。
var plotCube=scene.Add(新ILPlotCube(twoDMode:true){
//将曲面添加到打印立方体
儿童={
表面
},
//配置数据屏幕矩形。这将生成plotcube
//内容填充整个面板区域
DataScreenRect=新矩形F(0.13f、0.13f、0.74f、0.74f),
//将打印多维数据集限制配置为不显示边距
限制={
XMin=0,YMin=0,ZMin=min,
XMax=A.S[1]-1,YMax=A.S[0]-1,ZMax=max+1
}
});
返回场景;
}

必须为我们自己的使用快速创建修复程序,如下所示:

    private void IlPanelOnLoad()
    {
        ...

        var plotCube = GetPlotCube();
        if (plotCube != null)
        {
            plotCube.MouseWheel += OnPlotCubeMouseWheelEvent;
        }
    }


    #region MouseWheel Zoom

    const float scaleFactor = 0.05f;  // 5% scaling, Adjust this to get faster/slower scaling
    const float WHEEL_DELTA = 120.0f; // One mouse wheel notch

    void OnPlotCubeMouseWheelEvent(object sender, ILMouseEventArgs mea)
    {
        if (mea.Clicks == 0) // Only when no buttons pressed at the same time
        {
            var plotCube = sender as ILPlotCube;
            if (plotCube != null)
            {
                // + or - a scaleFactor change per wheel mouse notch
                float zoomFactor = 1 - ((float)mea.Delta) / WHEEL_DELTA * scaleFactor;
                ILLimits ilLimits = plotCube.Limits;
                ApplyScaleFactor(zoomFactor, ilLimits);
                ilPanel.Refresh();
            }
        }
        mea.Cancel = true; // Stop mouse wheel event default behaviour
    }

    private void ApplyScaleFactor(float zoomFactor, ILLimits ilLimits)
    {
        // delta here is nothing to do with wheel mouse delta
        float delta = ilLimits.WidthF * zoomFactor / 2f;
        ilLimits.XMin = ilLimits.CenterF.X - delta;
        ilLimits.XMax = ilLimits.CenterF.X + delta;
        delta = ilLimits.HeightF * zoomFactor / 2f;
        ilLimits.YMin = ilLimits.CenterF.Y - delta;
        ilLimits.YMax = ilLimits.CenterF.Y + delta;
    }

    private void ApplyScaleFactorHasWhitePatches(float zoomFactor, ILLimits ilLimits)
    {
        ilLimits.Update(ilLimits.CenterF, zoomFactor);
    }

    #endregion MouseWheel Zoom

我们拾取PlotCube鼠标滚轮事件并自行处理。要停止默认行为,我们设置鼠标事件“取消”标志。如果使用ILLimits“Update”方法获得缩放,则将获得当前行为,请参阅“ApplyScaleFactorHasWhitePatches()”方法。我认为这是因为缩放也会缩放Z轴上的限制。我们的解决方案只是在X轴和Y轴上缩放限制。也许,作为ILNumerics源代码中的修复,他们可以检查是否设置了2D标志,如果设置了,则不缩放Z轴限制。

您能提供一个可视示例吗?我原本也打算,但是StackOverflow不允许我这样做,因为我没有足够的声誉。虽然我添加了一些示例代码。但必须删除示例代码,因为它是以plotcube而不是曲面图为例。添加了新的更准确的示例。更符合我们实际正在做的事情
    private void IlPanelOnLoad()
    {
        ...

        var plotCube = GetPlotCube();
        if (plotCube != null)
        {
            plotCube.MouseWheel += OnPlotCubeMouseWheelEvent;
        }
    }


    #region MouseWheel Zoom

    const float scaleFactor = 0.05f;  // 5% scaling, Adjust this to get faster/slower scaling
    const float WHEEL_DELTA = 120.0f; // One mouse wheel notch

    void OnPlotCubeMouseWheelEvent(object sender, ILMouseEventArgs mea)
    {
        if (mea.Clicks == 0) // Only when no buttons pressed at the same time
        {
            var plotCube = sender as ILPlotCube;
            if (plotCube != null)
            {
                // + or - a scaleFactor change per wheel mouse notch
                float zoomFactor = 1 - ((float)mea.Delta) / WHEEL_DELTA * scaleFactor;
                ILLimits ilLimits = plotCube.Limits;
                ApplyScaleFactor(zoomFactor, ilLimits);
                ilPanel.Refresh();
            }
        }
        mea.Cancel = true; // Stop mouse wheel event default behaviour
    }

    private void ApplyScaleFactor(float zoomFactor, ILLimits ilLimits)
    {
        // delta here is nothing to do with wheel mouse delta
        float delta = ilLimits.WidthF * zoomFactor / 2f;
        ilLimits.XMin = ilLimits.CenterF.X - delta;
        ilLimits.XMax = ilLimits.CenterF.X + delta;
        delta = ilLimits.HeightF * zoomFactor / 2f;
        ilLimits.YMin = ilLimits.CenterF.Y - delta;
        ilLimits.YMax = ilLimits.CenterF.Y + delta;
    }

    private void ApplyScaleFactorHasWhitePatches(float zoomFactor, ILLimits ilLimits)
    {
        ilLimits.Update(ilLimits.CenterF, zoomFactor);
    }

    #endregion MouseWheel Zoom