2017-04-04 10 views
0

ich diese Gleichung bin mit einer Reihe von Punkten entlang einer quadratischen Kurve zu berechnen:berechnen gleichmäßig verteilten Punkten entlang einer Kurve

// Returns a point on a quadratic bezier curve with Robert Penner's optimization of the standard equation 
result.x = sx + t * (2 * (1 - t) * (cx - sx) + t * (ex - sx)); 
result.y = sy + t * (2 * (1 - t) * (cy - sy) + t * (ey - sy)); 

Leider sind die Punkte ungleichmäßig verteilt sind, wie Sie in der gestrichelten Linien sehen Rendern unten. Die Punkte sind in der Mitte der Kurve dichter und in der Nähe der Kanten sind sie weiter beabstandet. Wie kann ich eine gleichmäßig verteilte Menge von Punkten entlang einer quadratischen Bezierkurve berechnen?

Bitte beachten Sie, dass ich dies zum Rendern einer gestrichelten Linie verwende, so dass eine langsame Lösung in MATLAB oder etwas nicht tun. Ich brauche eine schnelle Lösung, die in einen Renderer passt. Dies ist nicht für die Forschung oder eine einmalige Berechnung!

dashed

Edit: Ich bin nicht zu fragen, wie die obige zu erreichen. Das oben genannte ist MEIN RENDERN! Ich weiß bereits, wie man die Länge eines Beziers schätzt, die Anzahl der Punkte usw. berechnet. Was ich brauche, ist ein besserer Bezierpunkt-Interpolationsalgorithmus, da der, den ich habe, Punkte ungleichmäßig verteilt entlang der Kurve berechnet!

+0

dazu Ähnliche (http: // Stackoverflow com/questions/18244305/how-to-redistribute-point-even-over-a-curve) aber ich möchte etwas viel einfacheres und Code in JS. –

+0

https://github.com/MadLittleMods/svg-curve-lib, https://gamedev.stackexchange.com/questions/5373/moving-ships-between-two-planets-along-a-bezier-missing- einige Gleichungen-für-acce/5427 # 5427 .... wenn ich nach einer Antwort für diese Suche suche sogar Geschwindigkeit Bewegung entlang eines Pfades, oder so etwas, das ist, wie ich normalerweise die Antwort finde – PAEz

Antwort

3

Sie möchten äquidistante (nach Bogenlänge) Unterteilung quadratischer Bezier-Kurven erzeugen.

Sie brauchen also Unterteilungsprozedur und function for calculation of curve length.

Suche Länge der gesamten Kurve (L), gewünschte Anzahl von Segmenten schätzen (N), dann Unterteilung Punkte erzeugen, die Anpassung t Parameter Bezier-Segmente mit einer Länge von etwa L/N

Beispiel zu erhalten: Sie L = 100 finden und will N = 4 Segmente. Get t = 1/2, unterteilen Sie die Kurve um zwei Teile und erhalten Sie die Länge des ersten Teils. Wenn die Länge> 50 ist, verkleinern Sie t und unterteilen Sie die Kurve erneut. Wiederholen Sie (binäre Suche verwenden), bis der Längenwert nahe 50 wird. Denken Sie an t-Wert und führen Sie die gleiche Prozedur aus, um Segmente mit Länge = 25 für die erste und für die zweite Hälfte der Kurve zu erhalten.

+0

Ich mache das schon ! Was ich brauche, ist ein besserer Bezierpunkt-Interpolationsalgorithmus, da der, den ich mache, dazu führt, dass die Punkte ungleich verteilt sind !! –

+0

Was meinen Sie unter "Bezierpunkt-Interpolation"? – MBo

+0

Sieh dir die Gleichung an, die ich im ersten Absatz meines Beitrags angegeben habe. Ich brauche eine bessere Version davon. Eine Gleichung, in der Sie den T-Wert angeben und das X/Y des Bezierpunkts gleichmäßig entlang der Kurve verteilt, wobei T = 0 der Startpunkt und T = 1 der Endpunkt ist. –

0

Dieser Ansatz nutzt die Three.js Bibliothek, die nicht in den OP der Frage, aber kann nützlich sein, wenn auch nur zu sehen, wie sie sich nähern sie:

var curve = new THREE.QuadraticBezierCurve(
    new THREE.Vector2(-10, 0), 
    new THREE.Vector2(20, 15), 
    new THREE.Vector2(10, 0) 
); 

    var points = curve.getSpacedPoints(numPoints); 
Verwandte Themen