Масштабирование треугольника вверх или вниз с учетом его вершин и центральной точки - PullRequest
0 голосов
/ 11 октября 2018

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

Если у меня сохранены три вершины треугольника и центральная точка, как я могу масштабировать треугольник?Другими словами, как я могу манипулировать текущими вершинами, чтобы увеличить треугольник, не изменяя центральную точку?

Это была моя первая попытка масштабирования, где v1, v2 и v3 - вершинытреугольник, A, B и C - вершины треугольника после увеличения:

//distance from center to v1
double distance = center - v1;
distance = distance * 1.25;
Vector3d A = center + distance;

v1(0) = A(0);
v1(1) = A(1);


// v2
distance = center - center;
distance = distance * 1.25;
Vector3d B = center + distance;

v2(0) = B(0);
v2(1) = B(1);


// v3
distance = center - v3;
distance = distance * 1.25;
Vector3d C = center + distance;

v3(0) = C(0);
v3(1) = C(1);

edit: я использую библиотеку Eigen, поэтому v1 (0) означает x-координату вершины v1а v1 (1) означает y-координату вершины v1

1 Ответ

0 голосов
/ 11 октября 2018

Линия

double distance = center - v1;

определенно неверна.И center, и v1 являются точками.Это означает, что они имеют два или три компонента (в зависимости от того, работаете ли вы в 2D или 3D), и поэтому distance не может быть double (т.е. скалярным), а должно быть вектором.

Вот как я бы вычислил A (вычисление B и C будет аналогичным):

vector3d A;
for(std::size_t i = 0; i < 3; ++i)
  A(i) = center(i) + 1.25 * (V1(i) - center(i));

Часть V1(i) - center(i) представляет i -ю координатувектора (V1 - центр) .Правая сторона также обозначает «ходьбу в том же направлении от center, но в 1,25 раза дальше».

Несколько дополнительных примечаний

  • Из вашего образца это не такПонятно, работаете ли вы в 2D или 3D.С одной стороны, вы используете vector3d, с другой стороны вы, кажется, манипулируете только с x - и y -координатами.
  • Я неЯ не понимаю, почему вы использовали v1(0) = A(0); Из того, как я понимаю ваш вопрос, A уже является ответом.
  • Вместо копирования по существу идентичного кода три раза (один раз для A, один раз дляB и один раз для C) может быть полезно превратить его в функцию, которую можно вызывать три раза.

Удачи в вашей задаче!

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