Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 17-06-2007, 17:26   #1 (permalink)
Der Wunderhund
 
Benutzerbild von gaspode
 
Registriert seit: Jun 2002
Ort: Hattingen
Beiträge: 10.515
Saubere Kurve durch fünf beliebige Punkte

Hallo.

Ich bastel gerade an einem kleinen Skript, welches
eine saubere Kurve (ohne Ecken) durch fünf Punkte
errechnen soll (P1-P5). Die Reihenfolge der Punkte
liegt dabei fest. (siehe Anhangsbild)

Leider stoße ich gerade an meine mathematischen
Grenzen (LK-Wissen, wo bist Du hin? ) und frage
mich langsam, ob das überhaupt machbar ist.

Ich habe mal meinen derzeitigen Stand angehangen.
(Achtung: quick-and-dirty-AS1!). Hier sind alle grau-
en Punkte dragbar, die blauen sind Mittelpunkte (s.u.)
und die roten Kontrollpunkte.

Ich arbeite derzeit mit zwei Ansätzen aus dem Buch
»Actionscript Animation« von Keith Peters, die ich
aber irgendwie nicht kombiniert bekomme.

Einer davon errechnet zwischen je zwei Punkten den
Mittelpunkt und berechnet die Kurven basieren auf
denen.
Vorteil: Die Übergänge sind schön glatt
Nachteil: Die Kurve läuft nicht mehr durch die Aus-
gangspunkte-Punkte

Der andere Ansatz errechnet einen weiteren Kontroll-
punkt, damit man eine Kurve vom ersten Punkt, durch
einen gegebenen zweiten zum dritten Punkt zeichnen
kann.
Vorteil: Die Kurve läuft durch die gewünschten Punkte
Nachteil: Die Übergänge bilden manchmal Ecken

Weiß jemand dafür eine Lösung oder kennt einen Link
zu einem Skript, wo sowas schon mal gemacht wurde?

Danke für jede Hilfe.

gruß, gaspode
Angehängte Grafiken
Dateityp: gif kurve.gif (4,0 KB, 34x aufgerufen)
Angehängte Dateien
Dateityp: zip curve.zip (6,1 KB, 15x aufgerufen)

Geändert von gaspode (17-06-2007 um 17:27 Uhr)
gaspode ist offline   Mit Zitat antworten
Alt 17-06-2007, 17:56   #2 (permalink)
mod_rewrite
 
Benutzerbild von sonar
 
Registriert seit: Feb 2003
Ort: München
Beiträge: 15.621
Such mal nach 'hgseib+kurven' oder stöber gleich mal in seinem Programmladen...
sonar ist offline   Mit Zitat antworten
Alt 17-06-2007, 19:52   #3 (permalink)
Der Wunderhund
 
Benutzerbild von gaspode
 
Registriert seit: Jun 2002
Ort: Hattingen
Beiträge: 10.515
Erstmal Danke für den Tipp.

Im Forum selber habe ich nichts gefunden
aber in SeibsProgrammLaden war einiges
Interessantes. Allerdings zeigen mir seine
Kurven-Algorythmen, daß es anscheinend
tatsächlich nicht möglich ist eine Kurve zu
errechnen, wo sich die angegebenen Punkte <-- Zerstört den perfekten Blocksatz!
nicht nur auf der Kurve befinden, sondern
dann auch noch die Scheitelpunkte (nennt
man das so?) der Kurven darstellen. Dann
muß ich wohl entweder aufgeben oder ein
wenig weitersuchen.

gruß, gaspode

Geändert von gaspode (17-06-2007 um 19:53 Uhr)
gaspode ist offline   Mit Zitat antworten
Alt 18-06-2007, 19:15   #4 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
Zitat:
Zitat von gaspode Beitrag anzeigen
daß es anscheinend tatsächlich nicht möglich ist eine Kurve zu errechnen, wo sich die angegebenen Punkte ... nicht nur auf der Kurve befinden, sondern dann auch noch die Scheitelpunkte (nennt man das so?) der Kurven darstellen.
da hat er nicht richtig geguckt ;-)
http://www.seibsprogrammladen.de/fra...ispiele/flash6
-> Zeichnen
kurven_vergleich.swf
die hermite-interpolation entspricht diesen anforderungen. allerdings wird die weniger gerne zum zeichnen benützt. ist eher was für mathematische angleichungen, weil die kurve stark übersteuert.

geht auch mit curveTo - siehe anhang:
blaue punkte, das sind die, die du vorgeben willst.
grüne punkte, das sind die hilfspunkte z.b.
p2.x = p1.x+(p5.x-p1.x)*1/4;
p4.x = p1.x+(p5.x-p1.x)*3/4;
rote punkte, das ist jeweils die mitte zwischen den grünen.
moveTo(p1)
curveTo(p2,p3)
curveTo(p4,p5)
curveTo(p6,p7)
curveTo(p8,p9)
usw.
Angehängte Grafiken
Dateityp: gif kurv.gif (6,2 KB, 37x aufgerufen)
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 18-06-2007, 20:06   #5 (permalink)
Der Wunderhund
 
Benutzerbild von gaspode
 
Registriert seit: Jun 2002
Ort: Hattingen
Beiträge: 10.515
Hallo hgseib.

Ich hatte die Kurve gesehen, aber durch die starke Übersteuerung,
v.a. wenn zwei Punkte recht nah nebeneinanderliegen, ist sie für
meine Zwecke leider unbrauchbar.

Durch Deinen Kurvenvergleich kann man auch sehen, daß sich die
Kurve in den seltensten Fällen so verhält, wie ich das brauche, son-
dern meistens recht sonderbare Wege geht.

gruß, gaspode
gaspode ist offline   Mit Zitat antworten
Alt 18-06-2007, 20:23   #6 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
deshalb nimm das ab: "..geht auch mit curveTo - siehe anhang:.." beschriebene
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 18-06-2007, 21:48   #7 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
*
Angehängte Dateien
Dateityp: zip fuenfpunktekurve.zip (5,9 KB, 32x aufgerufen)
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 18-06-2007, 22:07   #8 (permalink)
Der Wunderhund
 
Benutzerbild von gaspode
 
Registriert seit: Jun 2002
Ort: Hattingen
Beiträge: 10.515
Danke, ich hatte es mir mittlerweile auch schon gebaut.
Leider muß ich noch eine Lösung dafür finden, daß die
Kurve keine Spitzen bildet, wenn der erste Punkt z.B.
weiter rechts ist als der zweite.

Aber schonmal Danke für Deinen Mühen.

gruß, gaspode
Angehängte Grafiken
Dateityp: gif kurve.gif (2,2 KB, 21x aufgerufen)
gaspode ist offline   Mit Zitat antworten
Alt 19-06-2007, 09:17   #9 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Vor langer Zeit hab ich das auch mal gebraucht, raus kam damals folgendes:
http://janosch.scharlipp.de/uploads/shared/Curves2.swf

Mit gedrückter [strg]-Taste kann man eine Figur zeichen, aus der dann anhand des rechts oben ausgewählten und konfigurierten Filters "unnötige" Punkte gefiltert werden. Daraus entsteht der rote Pfad, der dann zu der blauen Kurve "geglättet" wird.

Allerdings ist das so lang her, dass ich keinen Code mehr habe, der das Beispiel rekonstruiert, da ich an den core-Klassen extrem viel weitergebastelt habe, ohne die Flash-Datei und die Klassen, die nur für diese Aufgabe da sind, anzupassen.

Ich hab dir mal noch alle Quell-Dateien hochgeladen, die ich noch in dem Zustand habe, die wichtigste für dich ist wohl die Shape2D mit ihrer Methode smoothPointSet.
http://janosch.scharlipp.de/uploads/shared/curves.rar

Hab leider kein Flash, so dass ich dir nicht schnell was funktionierendes zusammenbasteln kann
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 19-06-2007, 20:04   #10 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
Zitat:
Zitat von gaspode Beitrag anzeigen
Leider muß ich noch eine Lösung dafür finden, daß die Kurve keine Spitzen bildet, wenn der erste Punkt z.B. weiter rechts ist als der zweite.
a) die punkte in x-richtung sortieren
b) wenn die kurve waagrecht überschwingen darf z.b. siehe script. das ist natürlich eine recht eigenwillige kurve ;-) weil die mathematisch korrekte ist halt die hermite-interpolation. alle anderen können nur schlechter sein.
Code:
ps = [p0, p1, p2, p3, p4];
//
function finit() {
	for (var i in ps) {
		ps[i].onPress = startDrag;
		ps[i].onRelease = stopDrag;
	}
}
finit();
//
_root.createEmptyMovieClip('paint', 1);
function sortX(a, b) {
	return a._x>b._x;
}
paint.onEnterFrame = function() {
	with (this) {
		clear();
		lineStyle(1, 0);
		ps.sort(sortX);
		moveTo(ps[0]._x, ps[0]._y);
		for (var i = 1; i<ps.length; i++) {
			var x0 = ps[i-1]._x, y0 = ps[i-1]._y;
			var x4 = ps[i]._x, y4 = ps[i]._y;
			var dx = x4-x0, dy = y4-y0;
			var dy = Math.abs(y4-y0)/2;
			var x1 = x0+dx*1/4+dy, y1 = y0;
			var x3 = x0+dx*3/4-dy, y3 = y4;
			var x2 = (x3+x1)/2, y2 = (y3+y1)/2;
			curveTo(x1, y1, x2, y2);
			curveTo(x3, y3, x4, y4);
		}
	}
};
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (19-06-2007 um 20:05 Uhr)
hgseib ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 04:02 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele