Задать вопрос

Как узнать координаты точек (вершин)?

Здравствуйте, подскажите как найти координаты двух точек объекта?
1d38e6fc06574d4baab2b6dcae8bce66.png
Нужно найти точки отмеченные оранжевым цветом, т.е. центр "верха" (переда) объекта и центр его "низа" (зада).
Об объекте известно:
  1. координаты центра (c)
  2. угол поворота (a)
  3. "ширина" и "высота"
  4. координаты верхнего левого угла объекта без учета его поворота они же координаты клетки, в которой расположен объект. Но это, мне кажется, в вычислениях не пригодится.

Я понимаю, что это через косинус и синус делается, но не могу понять на что перемножить нужно ко/синус угла поворота =)
  • Вопрос задан
  • 2372 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 2
Угол а берите положительным, по часовой стрелке. То есть вместо показанного на рисунке угла в -45 градусов берите 360-45. Если заранее известно, что угол задается в пределах (-360; 360), то можно просто брать угол 360+а. Хотя на самом деле важен только нижний предел, да и можно написать приведение величины к этому пределу.

Координата переда относительно центра такова: (cos a * h/2; sin a * h/2). Для перевода в абсолютные координаты не забывайте к относительным прибавлять координаты центра.

Координату зада можно считать либо аналогично, взяв угол 180+a, либо взяв координаты, обратные координатам перевода. В абсолютным координатах, соответственно, достаточно из координат центра вычесть координаты переда, так как перед и зад симметричны относительно центра.

Так как работать необходимо с линией, проходящей через центр вдоль объекта, ширина и координаты углов в решении не нужны. h/2 — расстояние от центра до одной из искомых точек.
Ответ написан
@wxmaper Автор вопроса
Включил мозг и разобрался =) грубо говоря, найти эти точки можно так:
// псевдокод
frontPoint.x = cos ( body->rotation * PI / 180 ) * body->centerX() + body->width() / 2;
frontPoint.y = sin ( body->rotation * PI / 180 ) * body->centerY() + body->height() / 2;
rearPoint.x = cos ( body->rotation * PI / 180 ) * body->centerX() - body->width() / 2;
rearPoint.y = sin ( body->rotation * PI / 180 ) * body->centerY() - body->height() / 2;


Если учесть все "опасные" углы, то получится так:
// реализация на Qt
qint16 angle = qRound(body->rotation());
qint16 newFrontY, newRearY, newFrontX, newRearX;

if(angle == 0 || qAbs(angle) == 180) {
    newFrontY = qFloor((newY - body->height()/2.1) / mCellSize);
    newRearY =  qFloor((newY + body->height()/2.1) / mCellSize);
}
else {
    newFrontY = qAbs(qSin(angle * PI_DIFF_180) * newY - body->height()/2.1) / mCellSize;
    newRearY = qAbs(qSin(angle * PI_DIFF_180) * newY + body->height()/2.1) / mCellSize;
}

if(qAbs(angle) == 90 || qAbs(angle) == 270) {
    newFrontX = qFloor((newX - body->width()/2.1) / mCellSize);
    newRearX = qFloor((newX + body->width()/2.1) / mCellSize);
}
else {
    newFrontX = qAbs(qCos(angle * PI_DIFF_180) * newX - body->width()/2.1) / mCellSize;
    newRearX = qAbs(qCos(angle * PI_DIFF_180) * newX + body->width()/2.1) / mCellSize;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы