Масштабирование векторов от центральной точки? - PullRequest
5 голосов
/ 06 мая 2010

Я пытаюсь выяснить, есть ли у меня точки, например, квадрат:

 *     *



 *     *

и, скажем, я знаю центр этого квадрата.Я хочу формулу, которая сделает для образца вдвое больше его размера, но от центра

 *               *

      *     *



      *     *

 *               *

Поэтому новая фигура в два раза больше и от центра многоугольника.Он должен работать для любой формы, а не только для квадратов.

Я ищу больше теорию, которая стоит за ней, чем реализацию.

Ответы [ 4 ]

8 голосов
/ 06 мая 2010

Если вам известна центральная точка cp и точка v в многоугольнике, которую вы хотите масштабировать на scale, то:

v2 = v - cp; // get a vector to v relative to the centerpoint
v2_scaled = v2 * scale; // scale the cp-relative-vector
v1_scaled = v2_scaled + cp; // translate the scaled vector back

Этот шаблон перевода-масштабирования-перевода можно выполнить для векторов любого измерения.

1 голос
/ 06 мая 2010

Если вы хотите, чтобы фигура была в два раза больше, масштабируйте расстояние координат в sqrt(2) раз дальше от центра.

Другими словами, допустим, ваша точка находится на (x, y), а центр - (xcent, ycent). Ваша новая точка должна быть на

(xcent + sqrt(2)*(x - xcent),  ycent + sqrt(2)*(y - ycent))

Это масштабирует расстояния от нового «источника», (xcent, ycent) таким образом, что площадь удваивается. (Потому что sqrt(2)*sqrt(2) == 2).

0 голосов
/ 06 мая 2010

Чтобы сделать то, что вы хотите, вам нужно выполнить три операции: перевести квадрат так, чтобы его центроид совпадал с началом системы координат, масштабировать полученный квадрат, перевести его обратно.

0 голосов
/ 06 мая 2010

Я не уверен, что есть чистый способ сделать это для всех типов объектов. Для относительно простых вы должны быть в состоянии найти «центр» как среднее всех значений X и Y отдельных точек. Чтобы удвоить размер, вы найдете длину и угол вектора от центра к точке. Удвойте длину вектора и сохраните тот же угол, чтобы получить новую точку.

Редактировать: конечно, «двойной размер» открыт для нескольких интерпретаций (например, удвоение периметра по сравнению с удвоением площади). Это изменит множитель, использованный выше, но основной алгоритм останется практически неизменным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...