Изменение размера прямоугольника из разных источников - PullRequest
1 голос
/ 22 декабря 2009

У меня есть прямоугольник, в котором была информация о topx, topy, width и height.

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

В настоящее время я работаю над Eclipse GEF & SWT. В GEF предполагается, что все операции с прямоугольниками начинаются с верхнего левого угла, а масштабирование / изменение размера осуществляется с левого верхнего угла. Но я хочу сделать масштабирование / изменение размера от центра.

Например: мой прямоугольник имеет такую ​​информацию, как {100,100,50,50}. Если я сделаю масштабирование 1,5 в обоих x & y из верхнего левого угла, я получу результирующий прямоугольник как {100 100 100 100} (первые два x, y и остальные ширина, высота).

Спасибо J

Ответы [ 2 ]

0 голосов
/ 11 августа 2016

, если прямоугольник определяется как

topx, topy, widht, height

коэффициент масштабирования

factor

исходные координаты

ox, oy

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

topx   = ox + ( topx - ox ) * factor;
topy   = oy + ( topy - oy ) * factor;
width  = width  * factor;
height = height * factor;
0 голосов
/ 22 декабря 2009

Мое определение масштаба отличается от вашего, потому что, если я масштабирую на 1,5 от левого верхнего угла, мой результирующий прямоугольник будет {100, 100, 75, 75} -> источник останется прежним, а размер каждой стороны умножится по шкале.

Используя эти определения, если (x, y) - верхние левые координаты прямоугольника, масштабирующиеся от центра и сохраняющие исходную константу: {x, y, ширина, высота} -> {x + ширина * (1 - масштаб) / 2, y + высота * (1 - масштаб) / 2, ширина * масштаб, высота * масштаб}

Я предлагаю шкалу> 0, хотя результат определяется для нулевых и отрицательных значений.


Пример работы: масштаб {100, 100, 50, 50} на 1,5 от центра.

x: 100 -> 100 + 50 * (1 - 1.5)/2 = 100 + 50 * (-0.5)/2 = 100 - 50/4 = 87.5
y: 100 -> 100 + 50 * (1 - 1.5)/2 = 100 + 50 * (-0.5)/2 = 100 - 50/4 = 87.5
width:  50 -> 50 * 1.5 = 75
height: 50 -> 50 * 1.5 = 75

Результат: {100, 100, 50, 50} -> {87,5, 87,5, 75, 75}

...