ฉันต้องการทำสิ่งที่อธิบายไว้ในหัวข้อนี้:
http://www.allegro.cc/forums/print-thread/283220
ฉันได้ลองวิธีการต่าง ๆ ที่กล่าวถึงที่นี่
ก่อนอื่นฉันพยายามใช้วิธีที่อธิบายโดย Carrus85:
ลองหาอัตราส่วนของสามเหลี่ยมไฮโปเทนไนต์สามเหลี่ยมสองอัน (ไม่สำคัญว่าคุณจะใช้ triagle ตัวไหนสำหรับอันอื่นฉันขอแนะนำจุดที่ 1 และจุดที่ 2 ตามระยะทางที่คุณคำนวณ) นี่จะให้เปอร์เซ็นต์อัตราส่วนของสามเหลี่ยมที่มุมจากสามเหลี่ยมขนาดใหญ่ จากนั้นคุณก็คูณค่าลบด้วยค่านั้นเพื่อให้ได้ค่าพิกัด x พิกัดและเลื่อนตามค่านั้นเพื่อให้ได้ค่าชดเชยพิกัด 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 () และขนาดใหญ่สำหรับการวนรอบ)