2016-08-15 2 views
0

Итак, я пытаюсь создать небольшой график, который я разрешу пользователю добавлять случайные строки и т. Д. В качестве учебного проекта. Самая неприятная часть - это выяснить, как получить масштабирование в/из для работы - у меня есть переменная ZoomScale, привязанная к колесу мыши, и она «работает», но я хотел бы иметь возможность маркировать ось в зависимости от того, насколько они масштабировать и вычислять измерения расстояния (метры, см и т. д., потому что у меня есть переменная MM на пиксель, поэтому мы должны уметь это вычислять), поэтому она должна быть более точной наукой, чем просто «она работает»,Расчет увеличения и извлечения

double X1 = ((actualline[i].X1 + actualWidth - VisibleXMax - VisibleXMin) * ZoomScale); //Calculate modified coordinates based on 
double X2 = ((actualline[i].X2 + actualWidth - VisibleXMax - VisibleXMin) * ZoomScale); // window width, window height, Visible X/Y, and Zoom. 
double Y1 = ((actualline[i].Y1 + actualHeight - VisibleYMax - VisibleYMin) * ZoomScale); 
double Y2 = ((actualline[i].Y2 + actualHeight - VisibleYMax - VisibleYMin) * ZoomScale); 

Вместо того, чтобы пытаться работать с этим давайте попробуем с помощью простого 1 одномерного уравнения и я могу повторно написать, что для й и у.

Так позволяет сказать, что мы имеем 5 единиц широкую линию в направлении х

. . . . . 

В настоящее время, занимающем весь наш экран (а окно на самом деле). От 0 до 5 полностью. Теперь пользователь прокручивается, чтобы увеличить в первые 3 единицы. Теперь эти 3 устройства должны заполнить все окно, так как пользователь будет масштабироваться. Он должен выглядеть следующим образом через окно

. . . 

Так originially линия была x1 = 0, x2 = 5. 0 до 5. А поскольку наше окно 5 единиц в ширину она заполняет окно. Теперь пользователь хочет видеть только единицы x1 = 0 до x2 = 3. От 0 до 3. Но мы хотим, чтобы эти юниты растягивались по всему окну, поэтому с помощью какого-то вычисления масштабирования (например, выше) мы хотим превратить 0,3 в 0,5, используя доступные переменные. Переменные являются:

Окно Ширина (5 единиц в данном случае)

Оригинальный X1 и X2 (0 и 5 в данном случае)

Видимый Х мин и макс (0 и 3 в этом случае)

И масштаб масштабирования, который равен 1 и увеличивается до 0,05 при каждом прокрутке вверх.

Любые предложения?

+0

@FirstStep OK звуки хорошо! Не спешите! – Fivestar

ответ

1

Вот как я делаю свое. Следуйте комментарии и дайте мне знать, если у вас есть какие-либо вопросы:

public void ZoomImage(int ScrollDelta) 
{ 

    OldUnitInPixels = UnitInPixels; // UnitInPixels is something similar to what you called mm/pixel - we need to keep the old one 

    if (ScrollDelta > 0) // this `if` means zoom in - the `else` means zoom out 
    { 
     if (ZoomLevel != 20) // to control my maximum zoom in (I want 20 zoom levels only) 
     { 
      ZoomLevel++; // increment zoom level 

      UnitInPixels += initialUnitInPixels; // I add certain value when I zoom in - for ex: initially it was 3 mm per pix, on zoom in it would be 4 mm per pixel 
      dotSize++; // I want some points to increase in size a little bit 
      lineSize += 0.1; // I want some liness to increase in size a little bit 


      // adjust all coord (points) 
      for (var i = 0; i < DisplayedCoords.Count; i++) 
      { 
       DisplayedCoords[i].X -= XCoordOffset; // remove value of what you called VisibleX from current x value - means go back to the very original coord - ex: actual value is (1,1) but I added (49, 49) for it so it looks (50,50) better on the screen. So I want to remove whatever I added which is (49,49) 
       DisplayedCoords[i].Y -= YCoordOffset; // remove value of what you called VisibleY from current Y value 

       DisplayedCoords[i].X /= OldUnitInPixels; // divide by old 
       DisplayedCoords[i].Y /= OldUnitInPixels; 

       DisplayedCoords[i].X *= UnitInPixels; // multiply by new 
       DisplayedCoords[i].Y *= UnitInPixels; 

       DisplayedCoords[i].X += XCoordOffset; // add back whatever we removed earlier. So it looks back again "better" 
       DisplayedCoords[i].Y += YCoordOffset; 
      } 
      DrawImage(); // draw 
     } 
    } 
    else 
    { 
     // else is super similar but instead of all the (++)s I do (--)s 
    } 
} 

Смотреть это работает: (увеличение/из/на позиции курсора мыши не была закончена)

enter image description here

+0

Как вы справляетесь с прокруткой? Я вижу, что в вашем коде он не смотрит на ширину/высоту окна. И в моей версии я сохраняю фактические значения в своей собственной коллекции, поэтому мне не нужно добавлять/sub смещение, так как у меня есть реальные значения, хранящиеся отдельно. – Fivestar

+0

Предполагаю, что вы имеете в виду Panning. Panning - это отличная функция, чем масштабирование. Это супер сложно, но вы можете дать ему шанс, если вам понравится. Код здесь просто «_Input: значение прокрутки мыши и вывод: разные scale_», в то время как Panning имеет «_Input: Click, скорость мыши, мышь StartPosition, мышь Текущее расположение и выход: разные View_» –

+0

Я вижу. В моем коде он обрабатывается видимыми x min и max - как и в случае, когда вы нажимаете на мышь, это изменяет эти значения, и именно там рисуются линии. Должна ли эта логика быть полностью отдельной? – Fivestar