6 Stimmen

Wie kann man diese Art von Zufallskurven erzeugen?

Ist es möglich, diese Art von Zufallskurven zu erzeugen?

enter image description here

Ich habe versucht, IMagick Bezier-Kurven (siehe http://www.php.net/manual/en/function.imagickdraw-bezier.php ), aber selbst mit 20-30 Punkten sehen sie nicht so aus. Hier ist mein Beispiel http://mechanicalzilla.com/sandbox/imagick/curve.php

Ich danke Ihnen.

5voto

Gajus Punkte 61796

Ich wette, Sie könnten einen Algorithmus schreiben, der im Grunde genommen x eine Reihe von zufälligen Wendungen, bevor es direkt zu den Ausgangskoordinaten geht. Dies setzt auch voraus, dass der Algorithmus intelligent genug ist, um den Winkel der Kurve zu überprüfen. (vorausgesetzt, man will nicht im Knotennetz landen)

Wenn es sich dabei jedoch nicht um Ihre Abschlussarbeit handelt oder Sie dafür auf Stundenbasis bezahlt werden, wäre dies reine Zeitverschwendung und der Erfolg höchst zweifelhaft.

Selbst wenn es Ihnen gelingen würde, einen einzeiligen Algorithmus zu erstellen, ist es nahezu unmöglich, die Zeilen so zu gestalten, dass sie sich nicht zu nahe kommen. Am Ende erhalten Sie etwas wie dieses: knot-web

4voto

TheHorse Punkte 2757

Sieht so aus:

x = 0; y = 0; angel = 0;
while (true) {
   angel = angel + 0.5 - random(1);
   x1 = x + 0.1 * cos(angel);
   y1 = y + 0.1 * sin(angel);
   if (abs(x1 - x) + abs(y1 - y) < 10)
     drawline(x,y,x1,y1);
   x = x1; y = y1;

   if (x < 0) x = width;
   if (y < 0) y = height;
   if (x > width) x = 0;
   if (y > height) y = 0;
}

enter image description here

4voto

pinkgothic Punkte 5941

Dies ist bei weitem keine vollständige Antwort, aber vor meinem geistigen Auge sieht es so aus, als ob es Ihnen helfen könnte:

Anstatt Kurven vom Anfangs- bis zum Endpunkt der gesamten Linie zu zeichnen, sollten Sie Ihr Brett in ein gleichmäßig verteiltes Raster unterteilen. Jedes Quadrat einer Spalte des Gitters darf einen Punkt einer Kurve enthalten, und Sie würden (zunächst der Einfachheit halber) stetig von links nach rechts vorgehen.

Der Zufall kommt ins Spiel, wenn man ein Quadrat für eine Kurve auswählt - damit es nicht zu chaotisch wird, könnte man dieser Zufälligkeit Grenzen setzen, z.B. "man darf kein Quadrat auswählen, das (wenn ein Abstand von Quadrat zu Quadrat als 1 ) verstößt abs(current vertical position - new vertical position) <= 5 es sei denn, sie sind zu diesem Zeitpunkt nicht mehr frei" oder eine andere willkürliche Einschränkung. ("es sei denn, dass an diesem Punkt nichts mehr frei ist" ist wichtig, da man sich sonst in einen unlösbaren Zustand hineinmanövrieren kann).

Two example curves generated this way.

(Sorry, ich zeichne Kurven mit der Maus -> schlechteste/keine Interpolation überhaupt. Catmull-Rom-Interpolation wird hier aber wahrscheinlich dein Freund sein, denke ich).

Die Anzeige sollte locker genug sein, wenn man bedenkt, dass die Kurvenpunkte nicht willkürlich in einem Raster verstreut sein können, aber es ist wahrscheinlich sehr schwierig, die Kurve dazu zu bringen, sich "fließend" mit dem Endpunkt zu verbinden - das könnte eine gute Lösung sein, wenn man sich nicht an willkürlichen Endpunkten stört, obwohl der Algorithmus selbst entscheiden kann, wo die Linie enden soll.

Glauben Sie, diese Idee könnte Ihnen bei Ihren Kurven helfen?

1voto

Jacek Jaskólski Punkte 111

Eine Möglichkeit wäre, zunächst eine Reihe von Zufallskurven zu erzeugen und dann mit einem Physik-Löser Abstoßungskräfte zwischen ihnen anzuwenden, um ein Verklumpen zu vermeiden.

Hier ist ein kurzer Beweis für das Konzept:

noodle curves

Ich habe dies mit einem sehr nischenorientierten Tool erstellt (für alle Interessierten: Känguru-Physik-Löser , ein Plugin für Grasshopper, visuelle Skriptsprache für Rhinoceros3d ), aber Sie können dasselbe Konzept wahrscheinlich in jeder gängigen Programmiersprache nachbilden, z. B. in Python.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X