| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| Der Wunderhund 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 fragemich 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 Geändert von gaspode (17-06-2007 um 17:27 Uhr) |
| | |
| | #3 (permalink) |
| Der Wunderhund 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) |
| | |
| | #4 (permalink) | |
| Techniker Registriert seit: Sep 2003 Ort: 64807
Beiträge: 16.324
| Zitat:
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.
__________________ die ultimative antwort auf alle programmierfragen: der debugger mfg h.g.seib www.SeibsProgrammLaden.de | |
| | |
| | #5 (permalink) |
| Der Wunderhund 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 |
| | |
| | #6 (permalink) |
| Techniker 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 |
| | |
| | #7 (permalink) |
| Techniker Registriert seit: Sep 2003 Ort: 64807
Beiträge: 16.324
|
*
__________________ die ultimative antwort auf alle programmierfragen: der debugger mfg h.g.seib www.SeibsProgrammLaden.de |
| | |
| | #8 (permalink) |
| Der Wunderhund 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 |
| | |
| | #9 (permalink) |
| muh 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!) |
| | |
| | #10 (permalink) | |
| Techniker Registriert seit: Sep 2003 Ort: 64807
Beiträge: 16.324
| Zitat:
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) | |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |