SVG-Bogenkurven in Python implementieren

8

Ich versuche SVG-Pfadberechnungen in Python zu implementieren, aber ich habe Probleme mit Arc-Kurven.

Ich denke, das Problem liegt in der Konvertierung von der Endpunkt- zur Zentralparametrierung, aber ich kann das Problem nicht finden. Sie finden Hinweise zur Implementierung in Abschnitt F6.5 der SVG-Spezifikationen . Ich habe mir Implementierungen in anderen Sprachen angeschaut und kann auch nicht sehen, was sie anders machen.

Meine Arc-Objekt-Implementierung ist hier:

%Vor%

Sie können dies mit dem folgenden Code testen, der die Kurven mit dem Turtle-Modul zeichnet. (Der raw_input () am Ende dient nur dazu, dass der Bildschirm beim Beenden des Programms nicht verschwindet).

%Vor%

Das Problem:

Jeder dieser vier gezeichneten Bögen sollte vom Startpunkt zum Endpunkt ziehen. Sie werden jedoch aus den falschen Punkten gezogen. Zwei Kurven gehen von Ende zu Anfang, und zwei gehen von 100, -50 bis 0,0 statt von 0,0 bis 100, 50.

Ein Teil des Problems besteht darin, dass die Implementierungshinweise Ihnen die Formel geben, wie die Endpunkte des Konvertierungsformulars in die Mitte gebracht werden, aber nicht, was es geometrisch macht, also bin ich nicht ganz klar, was jeder Schritt tut. Eine Erklärung dazu wäre auch hilfreich.

    
Lennart Regebro 18.01.2013, 12:52
quelle

2 Antworten

3

Ich glaube, ich habe einige Fehler in Ihrem Code gefunden:

%Vor%

Die Bedingung uy > 0 ist falsch, richtig ist uy < 0 (der gerichtete Winkel von (1, 0) bis (ux, uy) ist negativ, wenn uy < 0 ):

%Vor%

Dann

%Vor%

Die Unterscheidung ist hier nicht notwendig, die Parameter sweep und arc sind bereits in theta und delta berücksichtigt. Dies kann vereinfacht werden zu:

%Vor%

Und schließlich

%Vor%

Hier sind sin und cos durcheinander, korrekt ist

%Vor%

Nach diesen Änderungen wird das Programm wie erwartet ausgeführt.

BEARBEITEN: Es gibt ein weiteres Problem. Die point -Methode berücksichtigt keinen möglichen rotation -Parameter. Die folgende Version sollte korrekt sein:

%Vor%

(Siehe Formel F.6.3.1 in der SVG-Spezifikation .)

    
Martin R 18.01.2013, 22:03
quelle
3

Vielleicht könnten Sie sich die unten stehenden Links ansehen, es scheint eine Schritt-für-Schritt-Anleitung zur Berechnung der Bögen zu geben (siehe computeArc() ):

Ссылка

oder

Ссылка

    
Ecir Hana 18.01.2013 21:44
quelle

Tags und Links