2016-05-09 19 views
0

Ich versuche, eine effiziente Möglichkeit zum Zeichnen von Linienmustern auf einem Bildschirm mit Python zu erarbeiten.Effizientes Zeichnen von Linien mit Python

Vor einiger Zeit habe ich einen Code zusammengeschustert, der einen LAser Spirograph steuern könnte. Das sind im Grunde 3 Kreise, die sich jeweils um einen beweglichen Punkt des Umfangs drehen. Dies erzeugt eine Reihe von Punkten, die verschiedene Muster in Abhängigkeit von den relativen Geschwindigkeiten ableiten, mit denen sich jeder der Kreise dreht.

So jetzt habe ich eine lange Liste von x, y Schnur, die ich als eine einzige Linie zeichnen möchte, gibt es eine Funktion in Python (derzeit mit Pygames spielen), die eine Reihe von Punkten nehmen und sie mit a glatte gekrümmte Linie.

zum Beispiel sagen, ich habe ein paar hundert Punkte, die das Muster in diesem link beschreiben, gibt es einen "einfachen" Weg in Python, um das volle Muster auf dem Bildschirm zu rendern. Ich gehe davon aus, dass dies schneller wäre, als zu versuchen, jeden von mehreren tausend Punkten zu plotten, um das Aussehen einer Linie zu erhalten.

EDIT

ich davon aus habe, dass es ein schnellerer Weg sein, den Bildschirm zu zeichnen sagt einen Halbkreis um eine Funktion des Start- und Endpunkt sowie den Radius, indem. anstatt 2000 Punkte auf der Kurve zu berechnen und sie getrennt entweder als Punkte oder kurze Geraden zu zeichnen. Ich nehme auch an, dass es schneller ist, eine gerade Linie mit 100 Punkten zu zeichnen, als die gleiche Linie als separate Punkte auszugeben?

+0

[** 'pygame.draw.lines' **] (http://www.pygame.org/docs/ref/draw.html#pygame.draw.lines) –

+0

Hallo, wie ich es verstanden Draws Eine Reihe von Linien zwischen den nicht glatten Punkten setzt sich fort.Zum Beispiel können drei Punkte mit zwei geraden Flusen verbunden werden und einen Engel oder eine glatte Kurve bilden. Ich möchte die Kurve. – DevilWAH

+0

Sie müssten die Tangenten und das Gewicht der Endpunkte definieren. Welchen Weg sollte die Kurve sonst verfolgen? –

Antwort

1

Haftungsausschluss Dies ist keine Antwort


oben

auf meinem Kommentar erweitern

Du hast nicht die Kurve wollen. Sie wollen mit einer Frequenz um die Kurve probieren ausreichende Wahrnehmung zu täuschen

haben einen Blick auf die Auswirkungen der dichteren vs gröberen Probenahme auf die Wahrnehmung von dem, was auf dem Bildschirm gezogen wird

import numpy as np 
import matplotlib.pyplot as plt 

t = np.linspace(0, np.pi*3, 301) 
x = np.sin(t) 

von der jeweiligen Punkte (t[i], x[i]) stellen einen Punkt dar, hier ein Punkt in einer Sinuskurve, in Ihrer Anwendung eine komplexere Kurve, also lassen Sie uns diese Punkte mit einem anderen Abtastschritt zeichnen, um zu sehen, ob die Abtastrate einen Einfluss auf Ihre Wahrnehmung dessen hat, was gezeichnet wird. ..

for step in (1, 25, 50): 
    plt.plot(t[::step], x[::step], label='step=%d'%step) 
#    ^^^^  ^^^^    
plt.ylim((-1.05, 1.05)) 
plt.legend(loc='best') 

, die mich

enter image description here

Ich wage zu sagen, mit einer ausreichend hohen Abtastrate gibt, was sieht aus wie eine Kurve gezogen wird, selbst wenn es sich um eine Folge von geraden Segmenten (wie es offensichtlich ist, wenn Sie Schauen Sie sich die anderen zwei Eigenschaften von t vs x).

In anderen Kommentaren wurde Ihnen gesagt, welche pygames Funktion Sie verwenden können, um Ihre Tat zu tun.

+0

hi, prost für die Ausgabe in voller, Mein consern versucht, die richtige Abtastrate zu wählen, für einige Teile der Kurve "0,75-1,25" ist die Kurve fast gerade. während von 1,25 - 1,75 würde eine gerade Linie sehr offensichtlich von der Kurve abweichen. Ich könnte gut darauf zurückkommen, aber werde einen bezier bier Kurven sehen. – DevilWAH

+1

Wenn der Sinus in der Nähe des Maximums ist, hat auch die Krümmung ihre maximalen Werte. Wenn der Sinus eine Null kreuzt, ist die Krümmung nahe bei Null, daher ist die Sinuskurve ziemlich nah an einer geraden Linie. Und equisampling WORKS in beiden Regionen. Auf jeden Fall werde ich nicht versuchen, dich weiter zu überzeugen, weil ich glaube, dass ich dich nicht überzeugen werde. Ciao – gboffi