Я пытаюсь выяснить, есть ли у меня точки, которые делают, например, квадрат:
* *
* *
и скажем, я знаю центр этого квадрата. Я хочу формулу, которая сделает его для eample дважды его размером, но от центра
* *
* *
* *
* *
Поэтому новая форма является вдвое более большой и от центра полигона. Это должно работать на любую форму не просто квадраты.
Я больше ищу теорию позади него больше, чем реализация.
Если вы знаете центральную точку cp
и точку v
в многоугольнике, которую вы хотите масштабировать в масштабе
, то:
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
Это перевод -scale-translate шаблон может быть выполнен с векторами любой размерности.
Чтобы сделать то, что вы хотите, нужно выполнить три операции: перевести квадрат так, чтобы его центроид совпал с началом системы координат, масштабировать полученный квадрат, перевести его обратно.
Я не уверен, что есть чистый способ сделать это для всех типов объектов. Для относительно простых вы должны уметь найти «центр» как среднее значение всех значений X и Y отдельных точек. Чтобы удвоить размер, вы найдете длину и угол вектора от центра к точке. Удвойте длину вектора и сохраните тот же угол, чтобы получить новую точку.
Изменить: конечно, «вдвое больше» можно интерпретировать по-разному (например, удвоение периметра или удвоение площади). Это изменит множитель, использованный выше, но основной алгоритм останется по существу тем же.
Если вы хотите, чтобы фигура была вдвое больше, увеличьте расстояние до координат в sqrt (2)
раз дальше от центра.
Другими словами, допустим, ваша точка находится в (x, y)
, а центр - в (xcent, ycent)
. Ваша новая точка должна быть в
(xcent + sqrt(2)*(x - xcent), ycent + sqrt(2)*(y - ycent))
. Это масштабирует расстояния от новой «исходной точки», (xcent, ycent)
таким образом, чтобы площадь удвоилась. (Потому что sqrt (2) * sqrt (2) == 2)
.