Bu konuda açıklananları yapmak istiyorum:
http://www.allegro.cc/forums/print-thread/283220
Burada bahsedilen çeşitli yöntemleri denedim.
İlk önce Carrus85 tarafından açıklanan yöntemi kullanmaya çalıştım:
Sadece iki üçgen hipontenüs oranını alın (diğeri için hangi üçgeni kullandığınız önemli değil, hesapladığınız mesafe olarak nokta 1 ve nokta 2'yi öneriyorum). Bu, köşedeki üçgenin daha büyük üçgenden en boy oranını verecektir. Ardından, x koordinat ofsetini elde etmek için deltax'ı bu değerle çarpar ve y-koordinat ofsetini elde etmek için deltay'ı bu değerle çarparsınız.
Ancak nesnenin ekranın kenarından ne kadar uzakta olduğunu hesaplamanın bir yolunu bulamadım.
Sonra 23yrold3yrold tarafından önerilen (daha önce hiç yapmadım) ışın döküm kullanarak çalıştı:
Ekranın ortasından ekran nesnesine bir ışın verin. Işının dikdörtgen üzerinde nerede kesiştiğini hesaplayın. İşte koordinatlarınız.
İlk önce iki noktanın x ve y konumlarındaki farkın oluşturduğu üçgenin hipotenüsünü hesapladım. Bunu, bu çizgi boyunca bir birim vektörü oluşturmak için kullandım. X koordinatı veya y koordinatı ekranın dışına çıkıncaya kadar bu vektörde dolaştım. Geçerli iki x ve y değeri, okun x ve y değerlerini oluşturur.
İşte ışın döküm yöntemimin kodu (C ++ ve Allegro 5 ile yazılmış)
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);
}
Bu nispeten başarılıydı. Nesneler ekranın üstünde ve solundayken, okların çizildiği yerlerin yerleri ekranın ortasına 180 derece döndürülmüş gibi oklar ekranın sağ alt bölümünde görüntülenir.
Bunun üçgenin hipotenüsünü hesaplarken, x'deki farkın veya y'deki farkın negatif olup olmadığına bakılmaksızın her zaman pozitif olacağı gerçeğinden kaynaklandığını varsaydım.
Bunu düşünmek, ışın dökümü problemi çözmek için iyi bir yol gibi görünmüyor (sqrt () ve döngü için büyük bir kullanımı içermesi nedeniyle).