Реальные координаты для графика внутри видового экрана относительно координат мыши - PullRequest
0 голосов
/ 06 июня 2018

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

Здесь были добавлены две функции: панорамирование и масштабирование, что позволяет масштабировать преобразование и преобразовывать преобразование внутри события рисования, используядельта обновлена ​​для событий MouseDown и Move и OnMouseWheel для обновления преобразования масштаба.

Настоящая проблема возникла после попытки добавить функциональность для поддержки создания узла (графического элемента) внутри области просмотра в точное местоположение при увеличениибольше 1 (масштаб 100%).

Сценарий 1 -> Желтый прямоугольник был создан правильно и расположен точно в месте расположения указателя мыши, как показано на рисунке ниже (масштаб== 1).

Scenario 1

Сценарий 2 -> Желтый прямоугольник сильно смещен относительно положения мыши с масштабом области просмотраок.40%, как на изображении ниже (масштаб == 1,4).Круг, заполненный красным цветом, был нажат мышью (положение курсора остается неизменным, было сделано только увеличение).

Scenario 2

Сценарий теста -> Я пробовал много методов без успеха, прежде чем писать там, это один из них:

Test

Я действительно ценю любые входные данныедаже идеи, связанные с изменением подхода графа OXY (так как функции перевода используют относительные координаты).

1 Ответ

0 голосов
/ 07 июня 2018

Может быть, это поможет:

PointF ScaleUnscale(PointF p, float offX, float offY, float sX, float sY, bool scale)
{
    PointF pf = p;

    if (scale)
    {
        pf = new PointF( ( p.X  - offX )/ sX, (p.Y - offY)/ sY) ;
    }
    else
    {
        pf = new PointF( p.X * sX + offX, p.Y * sY + offY);
    }
    return pf;
}

Это масштабирует точку мыши до точки холста или обратно:

cPoints.Add(ScaleUnscale(e.Location, .., true));

Протестировано с переведенным и масштабированным графическим объектом:

g.TranslateTransform(offX, offY);
g.ScaleTransform(scaleX, scaleY);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...