मैं इस विषय में वर्णित वर्णन करना चाहता हूं:
http://www.allegro.cc/forums/print-thread/283220
मैंने यहां बताए गए विभिन्न तरीकों का प्रयास किया है।
पहले मैंने Carrus85 द्वारा वर्णित विधि का उपयोग करने की कोशिश की:
बस दो त्रिभुज हाइपोन्टेन्यूज़ के अनुपात को लें (इससे कोई फर्क नहीं पड़ता कि आप दूसरे के लिए किस त्रिभुज का उपयोग करते हैं, मैं आपके द्वारा गणना की जाने वाली दूरी के रूप में बिंदु 1 और बिंदु 2 का सुझाव देता हूं)। यह आपको बड़े त्रिभुज से कोने में त्रिभुज का पहलू अनुपात प्रतिशत देगा। तब आप x- समन्वित ऑफ़सेट प्राप्त करने के लिए केवल उस मूल्य से डेल्टैक्स को गुणा करते हैं, और उस मान द्वारा y-निर्देशांक ऑफ़सेट प्राप्त करने के लिए deltay करते हैं।
लेकिन मुझे यह गणना करने का कोई तरीका नहीं मिला कि स्क्रीन के किनारे से ऑब्जेक्ट कितनी दूर है।
फिर मैंने 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 डिग्री घुमाया गया हो।
मैंने माना कि यह इस तथ्य के कारण था कि जब मैं त्रिभुज के कर्ण की गणना कर रहा था, तो यह हमेशा सकारात्मक होगा चाहे एक्स में अंतर या वाई में अंतर नकारात्मक हो या नहीं।
इसके बारे में सोचते हुए, रे कास्टिंग समस्या को हल करने के एक अच्छे तरीके की तरह नहीं लगती (इस तथ्य के कारण कि इसमें sqrt का उपयोग करना शामिल है) और (लूप के लिए एक बड़ा)।