Jak lze zjistit směr k chvění iPhone

hlasů
4

Jsem pomocí akcelerometru posouvat více subViews v A UIScrollVIew. Chci pohled (orientace na výšku) posouvat doprava, když uživatel šlehne iPhonu vpravo a přejděte na levé straně, pokud je přístroj hodil směrem doleva.

myslel jsem, že tomu, že právě tím, že poznamená kladné nebo záporné hodnoty x zrychlení, ale vidět, že hodnoty jsou obvykle směs kladných a záporných hodnot. Nastavil jsem podlahu na 1,5 g eliminovat pohyb bez rozmazání, a koukám na hodnotách x po dobu trvání .5 sekund.

Jsem si jistý, že je trigonometrické metody pro stanovení celkové směr pohybem, a že máte k měření hodnot během celého trvání flick pohybu. Jsem také jistý, že již někdo přišel tenhle tým.

Nějaké nápady tam?

dík

Položena 19/06/2009 v 17:04
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
6

Vyvinul jsem řešení, které mi dává lepší odezvu než navrhované řešení (pouze pro levou a pravou chvění). To, jak jsem to zde je velmi citlivý (rozpoznává malé chvění), ale citlivost může být upravena změnou tresholdFirstMove a tresholdBackMove (zvýšení pro nižší citlivost)

V Swift: (. V viewController A přidat "import CoreMotion")

var startedLeftTilt = false
var startedRightTilt = false
var dateLastShake = NSDate(timeIntervalSinceNow: -2)
var dateStartedTilt = NSDate(timeIntervalSinceNow: -2)
var motionManager = CMMotionManager()
let tresholdFirstMove = 3.0
let tresholdBackMove = 0.5

override func viewDidLoad() {
    // your code

    motionManager.gyroUpdateInterval = 0.01
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    motionManager.startGyroUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler: { (gyroData, error) -> Void in
        self.handleGyroData(gyroData.rotationRate)
    })

}

private func handleGyroData(rotation: CMRotationRate) {

    if fabs(rotation.z) > tresholdFirstMove && fabs(dateLastShake.timeIntervalSinceNow) > 0.3
    {
        if !startedRightTilt && !startedLeftTilt
        {
            dateStartedTilt = NSDate()
            if (rotation.z > 0)
            {
                startedLeftTilt = true
                startedRightTilt = false
            }
            else
            {
                startedRightTilt = true
                startedLeftTilt = false
            }
        }
    }

    if fabs(dateStartedTilt.timeIntervalSinceNow) >= 0.3
    {
        startedRightTilt = false
        startedLeftTilt = false
    }
    else
    {
        if (fabs(rotation.z) > tresholdBackMove)
        {
            if startedLeftTilt && rotation.z < 0
            {
                dateLastShake = NSDate()
                startedRightTilt = false
                startedLeftTilt = false

                println("\\\n Shaked left\n/")
            }
            else if startedRightTilt && rotation.z > 0
            {
                dateLastShake = NSDate()
                startedRightTilt = false
                startedLeftTilt = false

                println("\\\n Shaked right\n/")
            }
        }
    }

}
Odpovězeno 13/03/2015 v 11:24
zdroj uživatelem

hlasů
5

OK, vypracovali řešení. Když registruji zatřesení pohyb (zrychlení větší než 1,5 na ose x), I spustit časovač a nastavit BOOL true. I když je pravda, BOOL přidám hodnoty zrychlení. Po vypršení časovače, I zastavit přidávání hodnoty zrychlení a určovat směr chvění znakem celkové zrychlení.


- (void)accelerometer:(UIAccelerometer *)acel didAccelerate:(UIAcceleration *)aceler {

    if (fabsf(aceler.x) > 1.5)
    {
        shake = YES;
        NSTimeInterval myInterval = .75;
        [NSTimer scheduledTimerWithTimeInterval:myInterval target:self selector:@selector(endShake) userInfo:nil repeats:NO];
        return;
    }

    if(shake)
    {
        totalG += aceler.x;
    }
}

- (void) endShake {
    shake = NO;
    int direction;
    if (totalG isLessThan 0) direction = 1;
    if(totalG isGreaterThan 0) direction = -1;
    [self changePageByShake:direction];
    totalG = 0;
}

Poznámka: Nemohl jsem se dostat <a> symboly formátování správně v codeblock výše, takže jsem substituovaný isLessThan a isGreaterThan pro symboly.

Odpovězeno 19/06/2009 v 18:19
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more