2015-04-22 1 views
2

В настоящее время мы используем функцию масштабирования на PlotCube, которая использует колесико мыши для увеличения и уменьшения изображения 2D-изображения (TwoDMode = true). Мы также используем масштаб, полученный с помощью функции прямоугольника выбора зума, снова предоставляемой библиотекой ILNumerics. Проблема заключается в том, что, когда мы увеличиваем/увеличиваем 2D-изображение с помощью колеса мыши, на изображении начинают появляться белые пятна (я думаю, что это связано с областью отсечения просмотра). Этого не происходит, когда мы увеличиваем масштаб с помощью большого количества, используя функциональность прямоугольника выбора зума.Белые патчи, появляющиеся в A MouseWheel, основанные на двумерных изображениях

Есть исправление для этой проблемы? или мы должны сами реализовать мышь для мыши (путем улавливания событий в колесиках мыши и соответственно изменения пределов).

Вот пример кода, вставьте его в основное приложение (Windows Forms или WPF). Экземпляр ILPanel следует называть iLPanel и присоединять его ко всему содержимому главного или родительского окна. Вызовите метод «IlPanelOnLoad()» во время «загруженного» события окна.

private void IlPanelOnLoad() 
{ 
    ilPanel.Scene = PlotImageTest(); 
    var pc = ilPanel.Scene.First<ILPlotCube>(); 
    pc.DataScreenRect = new RectangleF(0.15f, 0.10f, 0.80f, 0.70f); 

    ilPanel.Scene.Configure(); 
    ilPanel.Refresh(); 
} 

private ILScene PlotImageTest() 
{ 
    var scene = new ILScene(); 

    // the data to show comes from a predefined 
    // example dataset contained in ILNumerics 
    ILArray<float> A = ILMath.tosingle(ILSpecialData.terrain["0:240;0:240"]); 
    // we fetch to min and max values for tight limits 
    float min, max; 
    A.GetLimits(out min, out max); 

    // Create the surface 
    ILSurface surface = new ILSurface(A); 
    surface.Wireframe.Visible = false; // for fast rendering 
    surface.Markable = false; 

    // scene setup: add a plotcube in 2D mode... 
    var plotCube = scene.Add(new ILPlotCube(twoDMode: true) { 
     // add a surface to the plot cube 
     Children = { 
      surface 
     }, 
     // configure the datascreen rect. This makes the plotcube 
     // content fill the whole panel area 
     DataScreenRect = new RectangleF(0.13f, 0.13f, 0.74f, 0.74f), 
     // configure the plot cube limits to show no margins 
     Limits = { 
      XMin = 0, YMin = 0, ZMin = min, 
      XMax = A.S[1] - 1, YMax = A.S[0] - 1, ZMax = max + 1 
     } 
    }); 

    return scene; 
} 
+0

Вы можете представить наглядный пример? – user492238

+0

Я тоже изначально планировал, но StackOverflow не позволил мне, поскольку у меня недостаточно репутации. –

+0

Добавили пример кода. –

ответ

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 

Мы пикап MouseWheel событие PlotCube и обработать его сами. Чтобы остановить поведение по умолчанию, мы устанавливаем флаг «Отмена» мыши. Если вы используете метод «Обновление» ILLimits, чтобы получить масштабирование, вы получите текущее поведение, см. Метод «ApplyScaleFactorHasWhitePatches()». Я думаю, что это связано с тем, что масштабирование также масштабирует пределы по оси Z. Наше решение просто масштабирует пределы по осям X и Y. Возможно, в качестве исправления в исходном коде ILNumerics они могут проверить, установлен ли флаг 2D, а не масштабировать пределы оси Z, если это так.