Bezierkurve aufteilen < Numerik < Hochschule < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 17:37 Mo 25.10.2010 | Autor: | cgimda |
Wie kann eine Bezierkurve in gleichgroße Abschnitte aufgeteilt werden?
Oder Wie können auf einer Bezierkurve Punkte in gleichgroßen Abständen platziert werden?
|
|
|
|
Hallo cgimda,
> Wie kann eine Bezierkurve in gleichgroße Abschnitte
> aufgeteilt werden?
> Oder Wie können auf einer Bezierkurve Punkte in
> gleichgroßen Abständen platziert werden?
Wenn die Punkte der Bezierkurve so platziert werden,
dann müssen sie auf einer Geraden liegen.
Ist die Bezierkurve durch die Punkte [mm]b_{i}, \ 0 \le i \le n[/mm] gegeben,
dann lautet die Gerade auf der die Bezierpunkte verteilt sind.
[mm]g:\overrightarrow{x}=\overrightarrow{b_{0}}+u*\left(\overrightarrow{b_{n}}-\overrightarrow{b_{0}}\right)[/mm]
Dabei gilt: [mm]\vmat{\overrightarrow{b_{i+1}}-\overrightarrow{b_{i}}}=\bruch{1}{n}\vmat{\overrightarrow{b_{n}}-\overrightarrow{b_{0}}}, \ 0 \le i < n[/mm]
Gruss
MathePower
|
|
|
|
|
> Hallo cgimda,
>
> > Wie kann eine Bezierkurve in gleichgroße Abschnitte
> > aufgeteilt werden?
> > Oder Wie können auf einer Bezierkurve Punkte in
> > gleichgroßen Abständen platziert werden?
>
>
> Wenn die Punkte der Bezierkurve so platziert werden,
> dann müssen sie auf einer Geraden liegen.
>
> Ist die Bezierkurve durch die Punkte [mm]b_{i}, \ 0 \le i \le n[/mm]
> gegeben,
> dann lautet die Gerade auf der die Bezierpunkte verteilt
> sind.
>
> [mm]g:\overrightarrow{x}=\overrightarrow{b_{0}}+u*\left(\overrightarrow{b_{n}}-\overrightarrow{b_{0}}\right)[/mm]
>
> Dabei gilt:
> [mm]\vmat{\overrightarrow{b_{i+1}}-\overrightarrow{b_{i}}}=\bruch{1}{n}\vmat{\overrightarrow{b_{n}}-\overrightarrow{b_{0}}}, \ 0 \le i < n[/mm]
>
>
> Gruss
> MathePower
Hallo MathePower,
diese Antwort kann ich überhaupt nicht verstehen !
Die Frage war doch, wie man eine vorgegebene (nicht
geradlinige) Bézierkurve in eine Anzahl gleich langer
Kurven-Abschnitte unterteilen könne.
Meiner Ansicht nach antwortest du aber offenbar auf eine
ganz andere Frage.
Zur ursprünglichen Aufgabe von cgimda würde ich sagen,
dass sie vermutlich sehr schwierig zu lösen ist, da schon
die Längenberechnung von Bézierkurven durch Integration
auf nicht exakt darstellbare Integrale führt.
LG Al-Chwarizmi
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:53 Mo 25.10.2010 | Autor: | cgimda |
Danke für die Antworten.
Al-Chwarizmi hat natürlich recht. Ich wollte wissen, wie eine Bezierkurve in gleichgroße Abschnitte geteilt werden kann oder wie Punkte in gleichen Abständen auf ihr verteilt werden können.
Ich habe also zum Beispiel eine kubische Bezierkurve, die durch 4 Kontrollpunkte beschrieben wird. Diese Kurve kann dann durch folgende Funktion berechnet werden:
[mm]C(t) = (-P_0 + 3P_1 -3P_2 + P_3) t^3 + (3P_0 - 6P_1 + 3P_2) t^2 + (-3P_0 + 3P_1) t + P_0[/mm]
t ist der Parameter der von 0 bis 1 läuft. Wenn t = 0, dann C(t) = [mm] P_0. [/mm] Wenn t = 1, dann C(t) = [mm] P_3. [/mm] Würde ich nun die Kurve zeichnen, dann würde ich für t erst 0 einsetzen, dann 0,1, dann 0,2 usw. Das Problem ist, dass die Ergebnispunkte nicht die gleichen Abstände haben, auch wenn t gleichmäßig hochgezählt wird.
Hier ein Bild zur Veranschaulichung. t wurde gleichmäßig hochgezählt, aber die Punkte haben unterschiedliche Abstände:
[Dateianhang nicht öffentlich]
Dateianhänge: Anhang Nr. 1 (Typ: png) [nicht öffentlich]
|
|
|
|
|
> Danke für die Antworten.
>
> Al-Chwarizmi hat natürlich recht. Ich wollte wissen, wie
> eine Bezierkurve in gleichgroße Abschnitte geteilt werden
> kann oder wie Punkte in gleichen Abständen auf ihr
> verteilt werden können.
>
> Ich habe also zum Beispiel eine kubische Bezierkurve, die
> durch 4 Kontrollpunkte beschrieben wird. Diese Kurve kann
> dann durch folgende Funktion berechnet werden:
>
> [mm]C(t) = (-P_0 + 3P_1 -3P_2 + P_3) t^3 + (3P_0 - 6P_1 + 3P_2) t^2 + (-3P_0 + 3P_1) t + P_0[/mm]
>
> t ist der Parameter der von 0 bis 1 läuft. Wenn t = 0,
> dann C(t) = [mm]P_0.[/mm] Wenn t = 1, dann C(t) = [mm]P_3.[/mm] Würde ich
> nun die Kurve zeichnen, dann würde ich für t erst 0
> einsetzen, dann 0,1, dann 0,2 usw. Das Problem ist, dass
> die Ergebnispunkte nicht die gleichen Abstände haben, auch
> wenn t gleichmäßig hochgezählt wird.
>
> Hier ein Bild zur Veranschaulichung. t wurde gleichmäßig
> hochgezählt, aber die Punkte haben unterschiedliche
> Abstände:
[Dateianhang nicht öffentlich]
Hallo cgimda,
für die Lösung sehe ich da nur eine numerische Lösung
mittels Computer.
Die Kurvendarstellung kann man auflösen in zwei Gleichungen
für x(t) und y(t) (bei einer ebenen Kurve):
[mm] x(t)=a*t^3+b*t^2+c*t+d
[/mm]
[mm] y(t)=e*t^3+f*t^2+g*t+h
[/mm]
Differentiale:
[mm] dx=(3*a*t^2+2*b*t+c)*dt
[/mm]
[mm] dy=(3*e*t^2+2*f*t+g)*dt
[/mm]
[mm] ds=\sqrt{dx\,^2\,+\,dy\,^2\,}
[/mm]
Ersetzung der Differentiale durch kleine, aber endliche
Schrittlängen [mm] \Delta{x}, \Delta{y}, \Delta{s} [/mm] ermöglicht dann die Berechnung der
gesamten Bogenlänge der vorgegebenen Kurve sowie
deren Einteilung in eine Anzahl gleich langer Abschnitte.
LG Al-Chw.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 23:43 Mo 25.10.2010 | Autor: | cgimda |
Danke für die Antwort.
Ich habe es jetzt so gelöst, wie du gesagt hast, also beispielsweise so:
[mm]\Delta x = x(0,001) - x(0,000)[/mm]
[mm]\Delta y = y(0,001) - y(0,000)[/mm]
[mm]\Delta s_0 = \wurzel{\Delta x^2 + \Delta y^2}[/mm]
[mm]\Delta x = x(0,002) - x(0,001)[/mm]
[mm]\Delta y = y(0,002) - y(0,001)[/mm]
[mm]\Delta s_1 = \wurzel{\Delta x^2 + \Delta y^2}[/mm]
...
[mm]\Delta x = x(1,000) - x(0,999)[/mm]
[mm]\Delta y = y(1,000) - y(0,999)[/mm]
[mm]\Delta s_{999} = \wurzel{\Delta x^2 + \Delta y^2}[/mm]
Wenn ich nun die Gesamtlänge der Bezierkurve haben möchte, dann rechne ich einfach alle s zusammen:
[mm]s = \summe_{i=0}^{999}s_i[/mm]
Funktioniert alles wunderbar.
Aber noch eine Frage. Für was brauche ich die Ableitungen, die du angegeben hast?:
[mm]dx=(3*a*t^2+2*b*t+c)*dt[/mm]
[mm]dy=(3*e*t^2+2*f*t+g)*dt[/mm]
|
|
|
|
|
> Danke für die Antwort.
>
> Ich habe es jetzt so gelöst, wie du gesagt hast, also
> beispielsweise so:
>
> [mm]\Delta x = x(0,001) - x(0,000)[/mm]
> [mm]\Delta y = y(0,001) - y(0,000)[/mm]
>
> [mm]\Delta s_0 = \wurzel{\Delta x^2 + \Delta y^2}[/mm]
>
> [mm]\Delta x = x(0,002) - x(0,001)[/mm]
> [mm]\Delta y = y(0,002) - y(0,001)[/mm]
>
> [mm]\Delta s_1 = \wurzel{\Delta x^2 + \Delta y^2}[/mm]
>
> ...
>
> [mm]\Delta x = x(1,000) - x(0,999)[/mm]
> [mm]\Delta y = y(1,000) - y(0,999)[/mm]
>
> [mm]\Delta s_{999} = \wurzel{\Delta x^2 + \Delta y^2}[/mm]
>
> Wenn ich nun die Gesamtlänge der Bezierkurve haben
> möchte, dann rechne ich einfach alle s zusammen:
>
> [mm]s = \summe_{i=0}^{999}s_i[/mm]
>
> Funktioniert alles wunderbar.
>
> Aber noch eine Frage. Für was brauche ich die Ableitungen,
> die du angegeben hast?:
> [mm]dx=(3*a*t^2+2*b*t+c)*dt[/mm]
> [mm]dy=(3*e*t^2+2*f*t+g)*dt[/mm]
>
Guten Morgen !
für die numerische approximative Rechnung braucht man die
Ableitungen nicht unbedingt bzw. spart nicht sehr viel an Rechen-
aufwand. Wenn man ohnehin alle 1001 Punkte berechnet, ist es
ja leicht, jeweils die [mm] \Delta{s}_i [/mm] mittels Pythagoras zu berechnen.
Trotzdem denke ich, dass die Berechnung der Bogenlänge (wenn
man nur diese will und nicht gleichzeitig die Kurve plotten will)
mittels der Ableitungen weniger Rechenaufwand erfordert -
aber bei den heutigen schnellen Prozessoren ist das ja kaum mehr
ein Thema ...
Die Berechnung der Polynome mit den Koeffizienten a, b, c, ..... , g
würde ich dir aber trotzdem empfehlen (anstatt für jeden der 1001
Punkte auf die Koordinaten aller 4 Stützpunkte zurückzugreifen).
Das spart erheblichen Rechenaufwand.
LG Al-Chw.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 12:23 Mi 27.10.2010 | Autor: | cgimda |
Hallo Al-Chwarizmi,
ich habe noch mal über die Möglichkeit nachgedacht, die Länge mit den Ableitungen zu berechnen, aber irgendwie verstehe ich das nicht ganz. Vielleicht kannst du mir das noch mal genauer erklären, wie du mit den Ableitungen die Länge berechnest.
|
|
|
|
|
$\ s\ [mm] \approx\ \summe_{i=1}^{n}\Delta s_i$
[/mm]
wobei
[mm] $\Delta s_i\ [/mm] =\ [mm] \sqrt{(3\,a\,t_i^2+2\ b\,t_i+c)^2\ +\ (3\,e\,t_i^2+2\ f\,t_i+g)^2}*\Delta [/mm] t$
Aus numerischen Gründen am liebsten mit $\ [mm] t_i=\frac{i-\frac{1}{2}}{n}$ [/mm] ,
falls t für die ganze Kurve von 0 bis 1 läuft.
LG Al-Chw.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:27 Fr 29.10.2010 | Autor: | cgimda |
Danke für die Antwort. Es hat funktioniert und die Variante mit der Ableitung ist wirklich schneller. Es wird 30 bis 40 Prozent weniger Zeit benötigt.
|
|
|
|
|
> Danke für die Antwort. Es hat funktioniert und die
> Variante mit der Ableitung ist wirklich schneller. Es wird
> 30 bis 40 Prozent weniger Zeit benötigt.
Oh, danke für die Information !
LG Al-Chwarizmi
|
|
|
|