2017-02-21 20 views
1

Я пробовал эту проблему за последние несколько дней, и я просто не могу придумать эффективное (не говоря уже об эффективном) решении.Масштабирование и поворот массива точек

У меня есть множество точек в массиве, представляющий собой путь мыши:

Points[0] = 20,50 
Points[Points.length-1] = 500,230 

Im пытается найти способ, чтобы повернуть массив точек (Path), так что первая точка начинается в точке x1, y1, а последняя точка заканчивается на x2, y2.

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

Любые идеи? Спасибо!

+1

Вы не собираетесь делать это эффективно, не изучая математику. Вы хотите вычислить матрицу _transform_, а затем применить это преобразование к каждой из рассматриваемых точек. Вам, вероятно, понадобится решить некоторую систему линейных уравнений, чтобы вычислить матрицу. Статья в Википедии дает вам представление об этом, но лучший учебник по компьютерной графике - лучшее место для начала. https://en.wikipedia.org/wiki/Transformation_matrix –

ответ

1

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

Вы можете достичь того, чего хотите, сначала переведя точки так, чтобы первая точка находилась в начале координат (потому что это точка, которую вы хотите вращать), затем применяя поворот, масштабирующее преобразование, а затем второй перевод, что первая точка находится в точке x1, y1.

Угол поворота может быть вычислена путем вычисления разности между углом между (x1, y1) - (x2, y2), а угол между исходными начальными и конечными точками:

double rotationAngle = atan2(y2-y1, x2-x1) - 
    atan2(Points[Points.length-1].y-Points[0].y, Points[Points.length-1].x-Points[0].x); 

Коэффициент масштабирования - расстояние между (x1, y1) - (x2, y2), деленное на расстояние между нетрансформированным начальным и конечным точками.

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

  • перевести на (-точках [0] .x, -точках [0] .y)
  • вращение rotationAngle
  • масштаба путем масштабирования фактор
  • перевести на (x1, y1)

порядок поворота и масштабирования можно поменять местами, это не имеет значения. См. Статью transformation matrices о том, как построить каждый.

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

+0

Отлично, именно то, что я искал. Спасибо! –