На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Умное масштабирование

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 3 След.
RSS
Умное масштабирование, масштабирование участка над которым курсор мышки
 
Здравствуйте.
Стоит небольшая задача по умному масштабированию карты, чтобы при увеличении и уменьшении масштаба происходила работа с тем участком карты над которым установлен курсор мыши.
Я прошу прощения за возможно сумбурное объяснение, вообщем нужно чтобы масштабирование работало как в яндекс картах.
Сначала нашел функцию SetViewScale, но она просто увеличивает или уменьшает масштаб карты.
Затем пробовал с mapChangeViewScale примерно следующее:
Код
void MapViewWidget::wheelEvent(QWheelEvent* event)
{
    int numDegrees = event->delta() / 8;
    int numSteps = numDegrees / 15;

    if (event->orientation() == Qt::Vertical) {
        long int x=event->globalX();
        long int y=event->globalY();

        int valx=0, valy=0;
        d->mapView->GetMapLeftTop(&valx, &valy);
        QDMapPoint mapPoint;
        mapPoint.SetMapView(d->mapView);
        mapPoint.SetPlaceIn(PP_PICTURE);
        mapPoint.SetPoint(valx + y, valy + x);
        mapPoint.SetPlaceOut(PP_PLANE);

        x=mapPoint.VarMapPoint->GetX();
        y=mapPoint.VarMapPoint->GetY();

        if(numSteps>0) 
            mapChangeViewScale(d->mapView->GetMapHandle(),&x,&y,2);

        if(numSteps<0) 
            mapChangeViewScale(d->mapView->GetMapHandle(),&x,&y,0.5);

        d->mapView->Repaint();
    }
}

но я похоже совсем глуп и не выходит ничего.
Подскажите, пожалуйста, что не так я делаю?
Заранее спасибо!
 
Андрей, заренее извиняюсь за Паскаль НО поработав 3 вечера с С++ чуть не повесился...
Код
procedure TMainForm.ScreenMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var  fX, fY: Double;
begin
  with Screen.ScreenToClient(MousePos) do Origin.SetPoint(X+Screen.MapLeft,Y+Screen.MapTop);
  case Sign(WheelDelta)of
    -1: Screen.ScaleInPoint(Round(Screen.ViewScale*2), Origin);
    +1: Screen.ScaleInPoint(Round(Screen.ViewScale/2), Origin);
  end;
  Origin.GetPoint(fX, fY);
  Mouse.CursorPos := Screen.ClientToScreen(Point(Round(fX-Screen.MapLeft), Round(fY-Screen.MapTop)));
  Handled:= True;
end;

где:
Origin компонента типа TCompMapPoint
Screen компонента типа TMapScreen

P.S.... не знал что в С++ нет элементарного with do
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Спасибо большое за Ваш ответ.
Проблема в том, что я пишу под Linux и насколько я понял библиотеки PANAPI для Linux нет. А аналогов для ScreenToClient и ClientToScreen в mapapi я не смог найти.
 
1. Передать координаты мыши (центра масштабирования) в пикселах карты в функцию mapChangeViewScale.
2. После вызова mapChangeViewScale координаты x,y должны содержать координаты центра в новом масштабе.
3. Вычесть смещение мыши в окне из полученных координат, установить новое положение карты и обновить изображение окна.
Если мыши в окне нет, то вычесть половину ширины окна и половину высоты окна (для совмещения центра масштабирования с центром окна).
 
Цитата
Андрей Аксенов пишет:
Проблема в том, что я пишу под Linux
Ну в таком случае "звыняйте", Вам сюда http://www.gisweb.ru/forum/forum7/
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Цитата
Андрей Аксенов пишет:
не знал что в С++ нет элементарного with do
чему я несказанно рад, нахлебавшись с with при доделках чужих проектов!
Сорри за оффтоп :( .
 
Проблема решилась одним вызовом SetViewScaleInPoint у QDMapView.
В руководстве программиста "ГИС КОНСТРУКТОР для “QT-ДИЗАЙНЕР” версия 10" описана только функция SetViewScale.
И почему нельзя было описать вторую функцию, ума не приложу. Я понимаю конечно, что хороший программист сам должен поискать в классе, но тогда на кой черт это руководство.
Просто обидно потраченного времени.
Всем откликнувшимся искреннее спасибо за помощь!
Изменено: Андрей Аксенов - 13.12.2013 10:06:50
 
Руководство поправим.
 
Цитата
Александр Кружков пишет:
1. Передать координаты мыши (центра масштабирования) в пикселах карты в функцию mapChangeViewScale.

2. После вызова mapChangeViewScale координаты x,y должны содержать координаты центра в новом масштабе.

3. Вычесть смещение мыши в окне из полученных координат, установить новое положение карты и обновить изображение окна.

Если мыши в окне нет, то вычесть половину ширины окна и половину высоты окна (для совмещения центра масштабирования с центром окна).

Добрый день.
Все-таки SetViewScaleInPoint не то, что надо. В результате этого вызова перемещается курсор мыши в центр карты и дергается сама карта, а надо именно масштабирование без перемещения курсора мыши и чтобы масштабируемый объект оставался в той же части карты как и до масштабирования. Вообщем надо как на яндекс картах.

Еще раз прочитал Ваш ответ, Александр Кружков и возникли некоторые вопросы если можно. Я делаю так:

//1. Передать координаты мыши (центра масштабирования) в пикселах карты в функцию mapChangeViewScale.
Код
      long int x=QCursor::pos().x();
      long int y=QCursor::pos().y();

      int valx=0, valy=0;
      mapView->GetMapLeftTop(&valx, &valy);
      x+=valx;
      y+=valy;

      mapChangeViewScale(mapView->GetMapHandle(),&x,&y,2);


//2. После вызова mapChangeViewScale координаты x,y должны содержать координаты центра в новом масштабе.
//3. Вычесть смещение мыши в окне из полученных координат, установить новое положение карты и обновить изображение окна.
Код
      QPoint newMousePos = QCursor::pos();
      int diffX = mousePos.x() - x;
      int diffY = mousePos.y() - y;

У меня вопрос, нужное ли смещение я вычисляю выше?
И еще вопрос, по пункту установить новое положение карты? Что передавать в качестве нового положения карты
Код
      mapView->SetMapLeftTop(diffX, diffY);

Так или что-то другое?
Спасибо!
 
Вообще то вы поставили себе задачу - координаты мыши не менять. Тогда зачем новые координаты мыши?

От координат точки в пикселах в новом масщтабе х,у надо отнять положение мыши, где она была (как в пункте 1) и присвоить полученные значения
mapView->SetMapLeftTop
Страницы: 1 2 3 След.
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности