त्वरित प्रश्न। मैं मूल रूप से ऐसे कार्यक्रम पर काम कर रहा हूं जहां हमारे पास ग्रिड में एक इकाई क्रॉस है। प्रत्येक बार जब यह "चरण" समाप्त होता है (यानी, (0, 0) से (1, 0) तक जाता है), मुझे किसी ईवेंट को बंद करने की आवश्यकता होती है। प्रति फ्रेम इकाई की आवाजाही द्वारा गणना की जाती है:तल (एक्स) मॉड्यूलो एक्स एक्स बराबर है?
frameMovement = entitySpeed * (frameDeltaMs/1000)
और फिर इकाई के एक्स समन्वय में जोड़ा गया। मैं केवल चिंता के अलगाव के लिए समन्वय प्रणाली के लिए कच्चे पिक्सल के बजाय विश्व इकाइयों (1 विश्व इकाई 16 पिक्सल) का उपयोग करने के लिए चुने गए। दुनिया को यह जानने की जरूरत नहीं है कि एक वर्ग की दूरी 16 पिक्सल है - केवल ड्राइंग सिस्टम ही करता है।
तो मूल रूप से, मैं यह समझने की कोशिश कर रहा हूं कि यूनिट ने "चरण" समाप्त करने के लिए सिस्टम को कैसे बताना है। जाहिर है, फ्रेम आंदोलन की गणना के तरीके के कारण, आप कभी भी एक नए वर्ग पर नहीं होंगे, इसलिए मुझे इकाई को उस वर्ग में "क्लिप" करना होगा या एक विधि है जो "सत्य" वापस आ जाएगी यदि हम एक निश्चित दूरी के भीतर हैं वर्ग से (जो अभी मैंने 0.05wu होने का फैसला किया है - वर्ग से लगभग 0.8 पिक्सेल)।
return Math.floor(x) % x == 0;
मैं केवल उपयोग कर रहा हूँ एक्स के रूप में मैं सिर्फ यह इस समय काम कर पाने के कोशिश कर रहा हूँ देखकर:
समारोह मैं अब तक है यह है। हालांकि समस्या मैं इस समारोह के दो परिणाम एक वापस करने के लिए लगता है कि यह है:
x = 0f;
System.out.println(Math.floor(x) % x);
> NaN
यह उम्मीद की जा करने के लिए है, के रूप में 0% 0 वास्तव में NaN है। मैं इस समस्या के आसपास काम कर सकता हूं। हालांकि इस मुद्दे को मैं पल में है अन्य परिणाम है ..
x = 1f; // Or any number with 1sd > 0
System.out.println(Math.floor(x) % x);
> 1f
है यही कारण है, अन्य परिणाम हमेशा के बजाय सही सापेक्ष एक्स का मान, (रिटर्न है, जो अगर math.floor (x) और एक्स बराबर हैं - यानी एक्स 1 एफ के बराबर है), जो 0
मुझे पूरी तरह से यकीन नहीं है कि इसका कारण क्या है। अगर आपके पास मेरे लिए कोई जवाब है या किसी भी सुझाव के बारे में कोई सुझाव है कि मैं इसे बेहतर तरीके से कैसे ठीक कर सकता हूं, तो मैं सभी कान हूं।
टीएल; डीआर: मुझे यह पता लगाना होगा कि एक इकाई एक समन्वय से अगले तक कब जाती है। समन्वय (और उनमें से इकाई का संक्रमण) एक फ्लोट के रूप में संग्रहीत किया जाता है। यदि एक इकाई एक वर्ग को पार करने के लिए आधा रास्ते है, तो उदाहरण के लिए इकाई का एक्स समन्वय 1.5 के रूप में संग्रहीत किया जाता है। अंत में, मंजिल (1.0) 1.0% से 1.0 लौटा रहा है, और नहीं 0.
संपादित करें:
मेरी कोड में मैं इस
System.out.println("x equals " + x + ". Math.floor(x)%x==Math.floor(x): "+(Math.floor(x)%x==Math.floor(x)));
उत्पादन के साथ
संपादित करें 2: छवियां मजेदार हैं!
सफेद वर्ग इकाई है। लाल वर्ग बस एक खींचा ग्रिड है। प्रत्येक वर्ग 16 से 16 है।
जैसा कि आप देख सकते हैं, अभी सफेद वर्ग (6.5, 0) पर है। मुझे मूल रूप से पहचानने के लिए कार्यक्रम की आवश्यकता होती है जब यह गुजरती है (7, 0)।
संपादित करें: http://chat.stackoverflow.com/rooms/34727/discussion-between-neglected-and-lee-meador
वह तो मैं सही रूप में अपने जवाब स्वीकार कर लिया है मेरे लिए समस्या हल: ली और मैं एक बातचीत की, यहाँ हमारी चैट है।
float after = pos.x+changeInPosition;
if (Math.floor(after) != Math.floor(pos.x)) {
// We passed a boundary
}
pos.x = after;
y% x कर सकते हैं कभी नहीं के बराबर एक्स। यह 0 से x-1 के बराबर कुछ भी हो सकता है। मेरे कोड में –
मेरे पास यह है: \t \t System.out.println (Math.floor (x)% x == Math.floor (x)); और यह सच का मूल्यांकन कर रहा है। मुझे पता है कि ** ** इसे कभी बराबर नहीं होना चाहिए, लेकिन मेरी समस्या यह है कि यह ** ** है। –
मेरे लिए झूठा मूल्यांकन करता है। –