Was ist der Algorithmus hinter der PDF-Cloud-Annotation?

8

Ich habe festgestellt, dass mehrere PDF-Annotations-Anwendungen (Adobe Acrobat, Bluebeam usw.) einen Algorithmus zur Erstellung eines Wolkenmusters um ein Polygon haben:

Wenn Sie die Scheitelpunkte dieses Polygons ziehen, wird das Wolkenmuster neu berechnet:

Beachten Sie, wie die Bögen neu berechnet werden, um das Polygon zu umschließen. Sie werden nicht gestreckt oder verzogen. Welcher Algorithmus auch immer verwendet wird, scheint ein Industriestandard zu sein. Mehrere PDF-Editoren ermöglichen Ihnen, dies zu erstellen, und in jedem einzelnen sehen die Wolkenbögen beim Ziehen der Scheitelpunkte gleich aus.

Ich versuche, eine WPF-Beispielanwendung zu erstellen, die dies repliziert, aber ich kann die Dokumentation nirgends finden, um das Cloud-Muster zu generieren.

Ich beherrsche fließend Grafikdesign und 2D-Programmierung und bin in der Lage, das Werkzeug zum Ziehen der Ecken zu erstellen, aber ich brauche Hilfe, um herauszufinden, wie man diese Bögen zeichnet. Es sieht aus wie eine Reihe von ArcSegments in PathGeometry .

Meine Frage wäre also, wie ist der Algorithmus, um diese Bögen um ein Polygon zu erstellen?

oder

Wo finde ich die Dokumentation für diese branchenüblichen PDF-Muster, Zeichnungen und / oder Anmerkungen? (Wolke, Pfeile, Grenzen usw.)

    
Laith 06.01.2016, 00:45
quelle

1 Antwort

12

Die Wolken in Ihren Skizzen sind nur eine Reihe von Kreisen, die entlang jeder Polygonkante mit einer gewissen Überlappung gezeichnet sind.

Eine einfache Methode zum Zeichnen der gefüllten Basiswolkenform besteht darin, zuerst das Polygon einzufügen und dann die Kreise über dem gefüllten Polygon zu zeichnen.

Dieser Ansatz fällt flach aus, wenn Sie die Wolke mit einer teilweise transparenten Farbe füllen möchten, da die Überlappung der Kreise untereinander und mit dem Basispolygon zweimal angezeigt wird. Es wird auch die kleinen Cartoon-Stil Überschwinger auf den Wolken Kurven verpassen.

Eine bessere Möglichkeit, die Wolke zu zeichnen, besteht darin, zuerst alle Kreise zu erstellen und dann die Schnittwinkel jedes Kreises mit seinem nächsten Nachbarn zu bestimmen. Sie können dann einen Pfad mit Kreissegmenten erstellen, die Sie ausfüllen können. Der Umriss besteht aus unabhängigen Bögen mit einem kleinen Versatz für den Endwinkel.

In Ihrem Beispiel ist der Abstand zwischen den Wolkenbögen statisch. Es ist einfach, die Bögen an Polygon-Scheitelpunkten mit denen zu koinzidieren, indem diese Distanz variabel gemacht wird und indem sichergestellt wird, dass die Polygonkante gleichmäßig durch diese Distanz teilbar ist.

Eine Beispielimplementierung in JavaScript (ohne das Ziehen des Polygons) ist unten. Ich bin nicht vertraut mit C #, aber ich denke, dass der grundlegende Algorithmus klar ist. Der Code ist eine vollständige Webseite, die Sie im Browser speichern und anzeigen können, der die Zeichenfläche unterstützt. Ich habe es in Firefox getestet.

Die Funktion zum Zeichnen der Wolke nimmt ein Objekt von Optionen wie Radius, Bogenabstand und Überschwingen in Grad. Ich habe keine degenerierten Fälle wie kleine Polygone getestet, aber im Extremfall sollte der Algorithmus nur einen einzelnen Bogen für jeden Polygonscheitel zeichnen.

Das Polygon muss im Uhrzeigersinn definiert werden. Ansonsten wird die Wolke eher wie ein Loch in der Wolkendecke sein. Das wäre ein nettes Feature, wenn es keine Artefakte um die Ecke herum gibt.

Bearbeiten : Ich habe eine einfache Online-Testseite für die Cloud bereitgestellt Algorithmus unten. Auf der Seite können Sie mit den verschiedenen Parametern spielen. Es zeigt auch die Unzulänglichkeiten des Algorithmus. (Getestet in FF und Chrome.)

Die Artefakte treten auf, wenn Anfangs- und Endwinkel nicht korrekt bestimmt werden. Bei sehr stumpfen Winkeln kann es auch Überschneidungen zwischen den Bögen neben der Ecke geben. Ich habe das nicht behoben, aber das habe ich auch nicht zu viel gedacht.)

%Vor%     
M Oehm 06.01.2016, 08:16
quelle

Tags und Links