2009-03-20 15 views
11

मैं स्पर्श आंदोलन की गति का पता लगाने की कोशिश कर रहा हूँ और मैं हमेशा परिणाम मैं उम्मीद थी नहीं मिल रहा है। (कहा: स्पीड कीलें चारों ओर बहुत ज्यादा) अगर मैं कुछ अजीब या कर रहा हूँ किसी को भी देखा जा सकता है यह ऐसा करने का एक बेहतर तरीका सुझाव है?UITouch आंदोलन को गति का पता लगाने


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    self.previousTimestamp = event.timestamp; 
} 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView:self.view]; 
    CGPoint prevLocation = [touch previousLocationInView:self.view]; 
    CGFloat distanceFromPrevious = distanceBetweenPoints(location,prevLocation); 
    NSTimeInterval timeSincePrevious = event.timestamp - self.previousTimestamp; 
    CGFloat speed = distanceFromPrevious/timeSincePrevious; 
    self.previousTimestamp = event.timestamp; 
    NSLog(@"dist %f | time %f | speed %f",distanceFromPrevious, timeSincePrevious, speed); 

} 

उत्तर

10

आप की कोशिश कर सकते (शून्य distanceSinceStart और timeSinceStart बाहर touchesBegan में):

distanceSinceStart = distanceSinceStart + distanceFromPrevious; 
timeSinceStart = timeSincestart + timeSincePrevious; 
speed = distanceSinceStart/timeSinceStart; 

जो आप औसत गति दे देंगे जब से तुम स्पर्श (कुल दूरी/कुल समय) शुरू कर दिया।

या आप गति की एक चलती औसत कर सकता है, शायद एक घातीय मूविंग औसत:

const float lambda = 0.8f; // the closer to 1 the higher weight to the next touch 

newSpeed = (1.0 - lambda) * oldSpeed + lambda* (distanceFromPrevious/timeSincePrevious); 
oldSpeed = newSpeed; 

यदि आप हाल ही में मूल्यों के लिए अधिक वजन देना चाहता हूँ 1 के पास मूल्यों के लिए लैम्ब्डा समायोजित कर सकते हैं।

+0

अरे ... मैं मुसीबत यह लागू करने आ रही है। लैम्बडा उद्देश्य उद्देश्य सी का हिस्सा है? मुझे इसे लागू करने की क्या ज़रूरत है? tia – dizy

+2

नहीं ... यह एक स्थिर है जिसे आप स्वयं निर्दिष्ट करते हैं। यह करीब 1 है, जितना अधिक वजन आप नवीनतम मूल्य पर रखते हैं। एन मानों के अंकगणितीय औसत की तुलना करें। प्रत्येक नए मूल्य का वजन 1/एन होता है। घातीय के लिए, लैम्ब्डा = 2/(n + 1) जहां n बराबर गणित मूल्य है निर्धारित किया है। इसलिए नए मूल्य भारित 2 (n + 1) के/बजाय 1/एन, और फिर मौजूदा चलती औसत वापस (1-लैम्ब्डा) = (n-1)/(n + 1) द्वारा बढ़ाया जाता है और दो हैं जोड़ा। स्पष्ट? – Jim

3

मुख्य समस्या यह है कि गति गणना गलत होगी जब timeSincePrevious बहुत छोटा (कुछ मिलीसेकंड) है। इसे देखने के लिए, मान लें कि timeSincePrevious 1ms है।

const float labmda = (timeSincePrevious>0.2? 1: timeSincePrevious/0.2); 

है कि: फिर गणना की गति अगर distanceFromZero है 1.

इस कारण से मैं लैम्ब्डा के निम्नलिखित मूल्य का सुझाव देने के लिए 0 यदि distanceFromPrevious 0 है, और 1000 हो जाएगा कहें, timeSincePrevious छोटा है जब हम एक छोटे लैम्ब्डा का उपयोग करते हैं।

+0

उचित चर नमूना दर फ़िल्टर का उपयोग कर यह एकमात्र उत्तर है। और इसे मानक प्रथम-आदेश निम्न-पास की तरह करने के लिए: k = <प्रतिक्रिया समय>; ए = एक्सपी (-डीटी/के); फ़िल्टर किए गए स्पीड = ए * (डीएक्स/डीटी) + (1-ए) * फ़िल्टर किए गए स्पीड; – kylefinn

1

फिल्टर सुझाव ठीक हो सकता है, लेकिन यह समस्या का समाधान नहीं करता है: शिखर बाहर समतल किया जाएगा, लेकिन रहते हैं।

यदि आपने स्पर्श घटनाओं को लॉग आउट किया है, तो ये चोटें पिछले समय (0.001215 एमएस) से बहुत कम समय डेल्टा के साथ एक स्पर्श की तरह दिखाई देगी, जो कि बड़े समय डेल्टा के संपर्क से पहले थी।

 
distance = 17.269917, timeDelta = 0.016132, speed = 1070.504639 
distance = 15.206906, timeDelta = 0.017494, speed = 869.251709 
distance = 15.882380, timeDelta = 0.017583, speed = 903.297546 
distance = 14.983324, timeDelta = 0.030101, speed = 497.771088  //low peak 
distance = 15.435349, timeDelta = 0.001215, speed = 12703.991211 //high peak! 
distance = 15.882380, timeDelta = 0.017343, speed = 915.795898 
distance = 15.890248, timeDelta = 0.016302, speed = 974.742249 
distance = 16.560495, timeDelta = 0.016468, speed = 1005.606445 
distance = 16.101242, timeDelta = 0.017291, speed = 931.201050 

मुझे क्या हाल स्पर्श घटनाओं के बीच औसत समय डेल्टा की गणना है, और अगर वहाँ असामान्य समय डेल्टा (± 30%) के साथ एक स्पर्श है, मैं अपनी गति पर ध्यान न दें (पिछले घटना की गति रखने के लिए)

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