2013-08-02 17 views
6

त्वरित प्रश्न। मैं मूल रूप से ऐसे कार्यक्रम पर काम कर रहा हूं जहां हमारे पास ग्रिड में एक इकाई क्रॉस है। प्रत्येक बार जब यह "चरण" समाप्त होता है (यानी, (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))); 
उत्पादन के साथ

http://pastebin.com/egDwj7Gs

संपादित करें 2: छवियां मजेदार हैं!

http://prntscr.com/1j193n

सफेद वर्ग इकाई है। लाल वर्ग बस एक खींचा ग्रिड है। प्रत्येक वर्ग 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; 
+0

y% x कर सकते हैं कभी नहीं के बराबर एक्स। यह 0 से x-1 के बराबर कुछ भी हो सकता है। मेरे कोड में –

+0

मेरे पास यह है: \t \t System.out.println (Math.floor (x)% x == Math.floor (x)); और यह सच का मूल्यांकन कर रहा है। मुझे पता है कि ** ** इसे कभी बराबर नहीं होना चाहिए, लेकिन मेरी समस्या यह है कि यह ** ** है। –

+0

मेरे लिए झूठा मूल्यांकन करता है। –

उत्तर

4

मॉडुलो का मतलब है कि हम विभाजित करते हैं और शेष लेते हैं (जैसे मेरे लिए तीसरे ग्रेड में)।

तो ...

10 % 9 is 1. 

और

10 % 10 is 0 

और

10.5 % 10.5 is 0. 

(शायद आप राउंडिंग मुद्दों मिल सकता है अगर आप था एक्स = ... 10.5 गणना .. और उसके बाद x% x जहां आपको 10.5 से नीचे या 0 से बड़ा होना होगा)

तो, सभी पूर्णांकों के लिए,

Floor(x) % x is 0. 

एक गैर पूर्णांक के लिए, इसे दूसरे तरीके से काम करता है। या तो 0 (पूर्णांक के लिए) या

Floor(10.5) => 10 

और

10 % 10.5 is 10. 

तो चल बिन्दु में त्रुटियों गोलाई के प्रभाव को छोड़कर, मंजिल (एक्स)% x है मंजिल (एक्स) गैर पूर्णांकों के लिए।

अधिक

शायद आप अगर यह पहले की तुलना द्वारा और पदों के बाद एक ग्रिड लाइन पारित कर बता सकते हैं:

if (Math.Floor(xAfterMoving/gridSize) != Math.floor(xBeforeMoving/gridSize)) { 
    fireXGridCrossingEvent(); 
} 
+0

एचएम। मेरे स्कूल में मुझे कभी भी मॉड्यूलस सिखाया नहीं गया था। मुझे पता था कि यह शेष शेष लौटा एक विभाजन समीकरण। आप क्या सुझाव देते हैं कि मैं इसके बजाय उपयोग करता हूं, तो मुझे बस यह सत्यापित करने की आवश्यकता है कि इकाई (या यदि नहीं) इकाई वर्ग पर है या नहीं। एकमात्र विकल्प जिसे मैं सोच सकता हूं वह माप के रूप में पिक्सल का उपयोग कर रहा है लेकिन ऐसा लगता है एक बहुत बुरा विचार। –

+0

मैंने यह कोशिश की, और, एर, ठीक है, यह हर बार इकाई चलता है, जब यह सीमा पार करता है तो यह आवश्यक नहीं होता है। –

+0

इसके अलावा, आंदोलन प्रणाली के बारे में कोई जानकारी नहीं है कि प्रत्येक ग्रिड वर्ग कितना बड़ा है। यह केवल जानता है कि 1 समन्वय परिवर्तन का मतलब है कि आपने पूरी तरह से एक वर्ग पार किया है। : पी –

संबंधित मुद्दे