2016-04-09 9 views
-1

Ich baue eine App, wo ich Grundrisse für den Benutzer anzeigen wollte, was interaktiv ist, was bedeutet, dass sie auf jeden Bereich tippen können, um diese zu zoomen und feinere Details zu finden.iOS: Quartz2d zum Zeichnen von Grundrissen

Ich bekomme eine JSON-Antwort von der Back-End, die die Metadaten-Informationen der Grundrisse, Form Info und Punkte hat. Ich plane, die Punkte zu analysieren und die Formen auf einer Ansicht unter Verwendung des Quarzes zu zeichnen (fing an, Quartz2d zu lernen). Als Anfang habe ich einen einfachen blauen Druck genommen, der wie das untere Bild aussieht.

Laut dem blauen Druck ist der Mittelpunkt bei (0,0) und es gibt 4 Punkte.

Unten sind die Punkte, die ich vom Backend für den blauen Druck bekomme.

X:-1405.52, Y:686.18 
X:550.27, Y:683.97 
X:1392.26, Y:-776.79 
X:-1405.52, Y:-776.79 

ich versuchte, diesen

// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect { 
    // Drawing code 

      for (Shape *shape in shapes.shapesArray) { 
       CGContextRef context = UIGraphicsGetCurrentContext(); 
       CGContextSetLineWidth(context, 2.0); 
       CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor); 
       BOOL isFirstPoint = YES; 
       for (Points *point in shape.arrayOfPoints) { 
        NSLog(@"X:%f, Y:%f",point.x,point.y); 
        if (isFirstPoint) { 
         CGContextMoveToPoint(context, point.x, point.y); 
         //[bpath moveToPoint:CGPointMake(point.x,point.y)]; 
         isFirstPoint = NO; 
         continue; 
        } 
        CGContextAddLineToPoint(context, point.x, point.x); 

       } 
       CGContextStrokePath(context); 
      } 

} 

zu zeichnen Aber ich bin auf das Bild unten als Ergebnis bekommen, das nicht die richtigen Rendered Image

Fragen aussieht:

  1. Bin ich ich n die richtige Richtung, um dies zu erreichen?

  2. Wie zeichne Punkte in -ve-Richtung?

  3. Nach den Koordinaten, wird die Zeichnung sehr groß sein, ich will es zuerst zeichnen und dann schrumpfen auf den Bildschirm passen, so dass Benutzer später in/pan usw. zoomen

UPDATE:

Ich habe einige der grundlegenden Dinge mit Hilfe von Übersetzung und Skalierung erreicht. Jetzt ist das Problem, wie ich den gezeichneten Inhalt an die Sichtgrenzen anpassen werde. Da meine Koordinaten ziemlich groß sind, geht es außerhalb der Grenzen, ich will, dass es passt.

Hier finden Sie den Testcode, den ich habe. Irgendeine Idee, wie man es anbringt?

DrawshapefromJSONPoints

Antwort

0

Ich habe eine Lösung für das Problem gefunden. Jetzt bin ich in der Lage, Formen aus einer Reihe von Punkten zu zeichnen und sie an den Bildschirm anzupassen und sie auch ohne Qualitätsverlust zoomfähig zu machen. Hier finden Sie den Link zum Projekt. Dies kann optimiert werden, um Farben, verschiedene Formen zu unterstützen. Ich handle derzeit nur mit Polygonen.

DrawShapeFromJSON

1

Einige Beobachtungen:

Es gibt nichts falsch mit quartz dafür verwenden, aber man könnte es flexibler mit OpenGL finden, da Sie Anforderungen für die Hit-Prüfbereiche erwähnen und die Skalierung Modell in Echtzeit.

Ihr Code wird unter der Annahme einer Liste der Punkte bestellt, da Sie den Pfad CGContextMoveToPoint mit plotten. Wenn dies durch den Datenvertrag garantiert ist, dann in Ordnung; Sie müssen jedoch einen intelligenteren Renderer schreiben, wenn mehrere geschlossene Pfade in Ihrem JSON zurückgegeben werden.

Fragen 2 & 3 können mit einem Primer in der Computergrafik (speziell Model-View-Matrix und Transformationen) abgedeckt werden. Wenn Ihre Weltkoordinaten auf (0,0,0) zentriert sind, können Sie die Scheitelpunkte skalieren, indem Sie einen Skalar auf jeden Scheitelpunkt anwenden. Das Zeichnen von Punkten auf der negativen Achse macht mehr Sinn, wenn Sie das quartz-2d Koordinatensystem nicht verwenden.

+0

Danke für die Info. Ich bin nicht so ein Experte mit OpenGL, deshalb plante ich mit Quarz. Mein anderer Ansatz besteht darin, mehrere Uiviews für jede Form zu erstellen, damit ich Gestenerkenner haben kann, ich schreibe den Code um. Aber auch hier ist die Frage, selbst wenn ich die Koordinaten angegeben habe, sind die gezeichneten Linien nicht korrekt, wenn man den Screenshot überprüft. Ich habe in einigen Büchern gelesen, dass -ve Koordinaten abgeschnitten werden. – anoop4real

+0

Ich habe es geschafft, die Punkte zu übersetzen, ich habe meine Antwort aktualisiert ... können Sie es sich anschauen? – anoop4real

Verwandte Themen