Ich möchte das tun, was in diesem Thema beschrieben wird:
http://www.allegro.cc/forums/print-thread/283220
Ich habe eine Vielzahl der hier genannten Methoden ausprobiert.
Zuerst habe ich versucht, die von Carrus85 beschriebene Methode anzuwenden:
Nimm einfach das Verhältnis der beiden Dreieckshyponten (egal welches Dreieck du für das andere verwendest, ich schlage Punkt 1 und Punkt 2 als berechneten Abstand vor). Dadurch erhalten Sie das prozentuale Seitenverhältnis des Dreiecks in der Ecke zum größeren Dreieck. Dann multiplizieren Sie einfach Deltax mit diesem Wert, um den x-Koordinatenversatz zu erhalten, und Deltay mit diesem Wert, um den y-Koordinatenversatz zu erhalten.
Ich konnte jedoch nicht berechnen, wie weit das Objekt vom Bildschirmrand entfernt ist.
Ich habe dann versucht, Ray Casting zu verwenden (was ich noch nie zuvor gemacht habe), vorgeschlagen von 23yrold3yrold:
Feuern Sie einen Strahl von der Mitte des Bildschirms auf das Objekt außerhalb des Bildschirms. Berechnen Sie, wo sich der Strahl auf dem Rechteck schneidet. Da sind deine Koordinaten.
Ich habe zunächst die Hypotenuse des Dreiecks berechnet, die sich aus der Differenz der x- und y-Positionen der beiden Punkte ergibt. Ich habe dies verwendet, um einen Einheitsvektor entlang dieser Linie zu erstellen. Ich durchlief diesen Vektor, bis entweder die x-Koordinate oder die y-Koordinate nicht mehr auf dem Bildschirm zu sehen war. Die beiden aktuellen x- und y-Werte bilden dann das x und y des Pfeils.
Hier ist der Code für meine Ray Casting Methode (geschrieben in C ++ und 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);
}
Dies war relativ erfolgreich. Pfeile werden im unteren rechten Bereich des Bildschirms angezeigt, wenn sich Objekte über und links vom Bildschirm befinden, als ob die Stellen, an denen die Pfeile gezeichnet werden, um 180 Grad um die Mitte des Bildschirms gedreht worden wären.
Ich nahm an, dass dies auf die Tatsache zurückzuführen war, dass die Hypotenuse des Dreiecks bei der Berechnung immer positiv war, unabhängig davon, ob die Differenz in x oder die Differenz in y negativ ist oder nicht.
Wenn man darüber nachdenkt, scheint Ray Casting keine gute Möglichkeit zu sein, das Problem zu lösen (aufgrund der Tatsache, dass sqrt () und eine große for-Schleife verwendet werden).
quelle
arrow-length
mal vom Schnittvektor "et voila". Sie haben einen Ursprung und ein Ziel für Ihren Pfeil.x
y