Я желаю сделать то, что описано в этой теме:
http://www.allegro.cc/forums/print-thread/283220
Я пробовал различные методы, упомянутые здесь.
Сначала я попытался использовать метод, описанный Carrus85:
Просто возьмите соотношение двух гипонтенусов треугольника (не имеет значения, какой треугольник вы используете для другого, я предлагаю точку 1 и точку 2 в качестве расстояния, которое вы рассчитываете). Это даст вам процентное соотношение треугольника в углу от большего треугольника. Затем вы просто умножаете deltax на это значение, чтобы получить смещение по x-координате, и deltay на это значение, чтобы получить смещение по y-координате.
Но я не смог найти способ рассчитать, как далеко объект находится от края экрана.
Затем я попытался использовать лучевое литье (чего я никогда раньше не делал), предложенное 23yrold3yrold:
Запустите луч из центра экрана к объекту за пределами экрана. Вычислите, где на прямоугольнике пересекается луч. Там твои координаты.
Сначала я вычислил гипотенузу треугольника, образованную разницей в положениях x и y двух точек. Я использовал это, чтобы создать единичный вектор вдоль этой линии. Я перебирал этот вектор, пока координата x или y не исчезла с экрана. Затем два текущих значения x и y образуют x и y стрелки.
Вот код моего метода приведения лучей (написанный на C ++ и Allegro 5)
void renderArrows(Object* i)
{
float x1 = i->getX() + (i->getWidth() / 2);
float y1 = i->getY() + (i->getHeight() / 2);
float x2 = screenCentreX;
float y2 = ScreenCentreY;
float dx = x2 - x1;
float dy = y2 - y1;
float hypotSquared = (dx * dx) + (dy * dy);
float hypot = sqrt(hypotSquared);
float unitX = dx / hypot;
float unitY = dy / hypot;
float rayX = x2 - view->getViewportX();
float rayY = y2 - view->getViewportY();
float arrowX = 0;
float arrowY = 0;
bool posFound = false;
while(posFound == false)
{
rayX += unitX;
rayY += unitY;
if(rayX <= 0 ||
rayX >= screenWidth ||
rayY <= 0 ||
rayY >= screenHeight)
{
arrowX = rayX;
arrowY = rayY;
posFound = true;
}
}
al_draw_bitmap(sprite, arrowX - spriteWidth, arrowY - spriteHeight, 0);
}
Это было относительно успешно. Стрелки отображаются в правой нижней части экрана, когда объекты расположены над и слева от экрана, как если бы точки, в которых нарисованы стрелки, были повернуты на 180 градусов вокруг центра экрана.
Я предположил, что это было связано с тем, что, когда я вычислял гипотенузу треугольника, он всегда был бы положительным независимо от того, отрицательна ли разница в x или разность в y.
Размышляя об этом, приведение лучей не кажется хорошим способом решения проблемы (из-за того, что оно включает в себя использование sqrt () и большого цикла for).