Интерактивное увеличение 2D-графики в C # - PullRequest
0 голосов
/ 20 сентября 2011

Я создал программу, которая считывает значения напряжения и тока некоторых диодных кривых из файла XML и рисует их на экране (просто используя простую 2D-графику и некоторые простые команды, такие как DrawCurve и тому подобное).

Моя основная рамка изображения имеет размер 800 на 800 пикселей (ниже вы можете видеть уменьшенный скриншот). Теперь я хочу добавить функцию масштабирования, при которой при наведении курсора мыши на эту область изображения появляется всплывающий квадратик меньшего размера, и при перемещении мыши по этой области масштаб + увеличивается.

Понятия не имею, как к этому подойти. Конечно, я не спрашиваю полный рабочий код, но, пожалуйста, помогите мне все ближе и ближе!

Например, можно ли заставить работать масштабирование, не считывая данные кривой и не рисуя в реальном времени? или от этого нет выхода? Как я могу иметь поле для зависшего изображения, когда наведу курсор мыши на оригинальное изображение?

Спасибо!

enter image description here

Ответы [ 2 ]

2 голосов
/ 20 сентября 2011

Как правило, в случаях, когда перерисовка может занимать много времени, масштабирование обычно решается путем предоставления «быстрой, но уродливой» реализации наряду с «правильной, но медленной» реализацией.Во время активной операции масштабирования (скажем, когда пользователь нажал на ползунок, или до тех пор, пока не произойдет 50 мс с момента последнего изменения значения масштабирования), вы используете быстрый и уродливый режим, чтобы пользователь мог видеть предварительный просмотркаким будет окончательное изображение.Как только они отпустят ползунок масштабирования (или любой другой механизм, который вы предоставили), вы можете пересчитать изображение в деталях.Быстрая версия обычно рассчитывается на основе исходного изображения, с которым вы работаете.

В вашем случае вы можете просто взять исходное изображение, установить ограничительную рамку нового увеличенного изображения и масштабироватьсоответствующая часть исходного изображения вплоть до полного размера изображения.Если, скажем, прошло 100 мс без изменения масштаба, пересчитайте все изображение.

Примеры такого рода функций довольно широко распространены: большинство фрактальных генераторов используют именно эту технику, и даже не связанные с ней вещи, такие как Google StreetView (который предоставляет очень уродливо искаженную версию предыдущего изображения при перемещении, до тех пор, покафактическое изображение загружено).

2 голосов
/ 20 сентября 2011

Вы рассчитали, сколько времени займет DrawCurve?Возможно, это достаточно быстро, чтобы сделать в режиме реального времени.Не забывайте, что GDI будет обрезать примитивы рисования в области рисования.Вам просто нужно установить обтравочный прямоугольник при перемещении мыши.

Чтобы ускорить перерисовку, создайте изображение главного окна (то, которое вы вставили) в виде закадрового растрового изображения, и просто DrawImage внеэкранная версия окна в событиях рисования.Таким образом, вы уменьшаете влияние DrawCurve.

Наконец, чтобы получить хорошо выглядящие результаты, перегрузите OnPaintBackground (не могу точно вспомнить имя, но это что-то в этом роде), поэтому он ничего не делает (даже не вызывайте базовый класс) и выполняйте все свои рисования в методе OnPaint, используя объект BufferedGraphics.

Обновление

Ваша функция рисования может выглядеть следующим образомthis:

OnPaint (...)
{
  the_graphics_object.DrawImage (the background image);
  the_graphics_object.Clip = new Region (new Rectangle (coords relative to mouse position));
  the_graphics_object.TranslateTransform (drawing offset based on mouse position);
  RenderScene (the_graphics_object, scale_factor); // draws grid and curve, etc
  the_graphics_object.DrawRectangle (zoom view rectangle); // draw a frame around the zoomed view
}

Это создаст плавающее «окно» относительно положения мыши.

...