Koordinaten von Schnittpunkt zwischen PanGesture und Linie

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Koordinaten von Schnittpunkt zwischen PanGesture und Linie

    Hallo zusammen

    Im Moment Informatiktudent und in einem Projekteam tätig, habe ich folgende Frage. Wir entwickeln zurzeit eine iPad App, die im Grunde einem Probanden ermöglicht, eine Linie auf einer Skala zu machen. Dafür berechnen wir den Schnittpunkt zwischen der PanGesture (Mittels Anfangs und Schlusspunkt) und der schwarzen Linie auf dem Screen.

    Das Problem ist nun, dass dieser Schnittpunkt nicht immer sauber berechnet wird. Wird der Pan schräg gemacht (also nicht schön vertikal von oben nach unten), dann stimmt der Schnittpunkt nicht und die rote Linie erscheint am falschen Ort.

    Was machen wir im Code bei der Berechnung falsch? Wo stolpert der Algorithmus? Ich finds einfach nicht raus... :/
    Wär echt toll, wenn uns jemand einen Tipp geben könnte!

    Anbei der Code und ein Screenshot, damit ihr euch das besser vorstellen könnt.

    [Blockierte Grafik: http://i.imgur.com/bKKaKpn.png]

    Quellcode

    1. //Check if start of pan is above scala and if end of pan is under scala
    2. - (BOOL)didPan{
    3. if(startY<(touchView.frame.size.height/2)
    4. && stopY>(touchView.frame.size.height/2)
    5. && -100 < (startX - stopX)
    6. && 100 > (startX - stopX))
    7. didPan=YES;
    8. else
    9. didPan=NO;
    10. return didPan;
    11. }
    Alles anzeigen


    Quellcode

    1. //Get coordinates of starting and ending point of pan
    2. - (IBAction)getPanCoordinates:(UIPanGestureRecognizer*)sender {
    3. CGPoint start;
    4. CGPoint stop;
    5. //check if gesture done
    6. if (didDrawLine==NO
    7. &&sender.state == UIGestureRecognizerStateBegan) {
    8. start = [sender locationInView:self.touchView];
    9. startX=start.x;
    10. startY=start.y;
    11. }
    12. else if (didDrawLine==NO
    13. &&sender.state == UIGestureRecognizerStateEnded) {
    14. stop = [sender locationInView:self.touchView];
    15. stopX=stop.x;
    16. stopY=stop.y;
    17. int value=[self getIntersection];
    18. [self didPan];
    19. [self drawIntersectionAtValue:value];
    20. NSLog(@"Did Pan: %d", didPan);
    21. NSLog(@"Did Draw: %d", didDrawLine);
    22. }
    23. }
    Alles anzeigen


    Quellcode

    1. - (int) getIntersection{
    2. int m; //Gradient
    3. int b;
    4. int result;
    5. if (startX - stopX == 0){
    6. result = startX;
    7. }
    8. // Calculate Intersection
    9. else {
    10. m = (stopY - startY) / (startX - stopX);
    11. b = startY - (m * startX);
    12. result = ((touchView.frame.size.height/2) - b) / m;
    13. }
    14. self.prozent = 100 / touchView.frame.size.width * result;
    15. // self.prozent++;
    16. NSLog(@"Intersection: %i Prozent", self.prozent);
    17. return self.prozent;
    18. }
    Alles anzeigen


    Quellcode

    1. - (void) drawIntersectionAtValue:(int)value{
    2. int height = 50;
    3. //convert percental value into pixel value
    4. int value2=value*touchView.frame.size.width/100;
    5. //calculate start point of line
    6. int start=(touchView.frame.size.height/2)-(height/2);
    7. //generate line
    8. intersectionLine = [[UIView alloc] initWithFrame:CGRectMake(value2, start, 5, height)];
    9. intersectionLine.backgroundColor = [UIColor colorWithRed:0.824 green:0.243 blue:0.322 alpha:1]; /*#d23e52*/
    10. //draw line if Yes
    11. if (didPan==YES) {
    12. [touchView addSubview:intersectionLine];
    13. didDrawLine=YES;
    14. }
    Alles anzeigen
  • Die Berechnung des Schnittpunktes müsste meines Erachtens die vertikale Entfernung des Startpunktes von der Linie dividiert durch die Steigung von dem horizontalen Startpunkt der Linie abziehen:

    Quellcode

    1. m = (stopY -startY) / (stopX - startX);
    2. value = startX - (CGRectGetMidY(touchView.frame) - startY) / m;

    Außerdem solltest Du immer mit CGFloat rechnen. Gerade bei der Steigung dürfte das einiges ausmachen. ;)
    „Meine Komplikation hatte eine Komplikation.“