Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich glaube das Problem ist nicht fachlicher Natur, sondern Mangel an an grundlegenden Programmierkenntnissen.
Du hast schon auf die richtige stelle in deinem Code hingewiesen. DrawPoly zeichnet nacheinander deine Controlpoints und vrbindet diese mit einer linie (GL_LINES).
Was du also tun must, ist die Berechnung ändern, welche dir die Werte in deine Liste mit Controlpoints ("cpts") schreibt.
Ohne auch nur einen Hauch von der enthaltenen Mathematik zu verstehen, gehe ich davon aus, dass das die Funktion "move" betrifft. Dort werden Werte in "cpts" geschrieben.
Ich denke an der dortigen Stelle wirst du dein polynom 5ten Grades reinbauen müssen.
Wobei... nein, scheinbar ist die Funktion nur dazu da deine Kontrollpunkte zu verschieben. Wenn der Code kommentiert wäre, hätte ich gerade 5Minuten meines Lebens gespart.
Und Drawpoly zeichnet nur eine eine Kurve die direkt die Stützstellen verbindet.
"drawParabel" ist viel interessanter. Siehst du am Ende dieser Funktion den Aufruf "glVertex(x,y)". An dieser Stelle wird was gezeichnet. Du musst jetzt einfach nur im Code rückwärts gehen und die Berechnung von "y" umstellen.
Wie das geht, weiß ich nicht. Polynome zeichnen ist ein akademisches Beispiel, mit sowas hab ich nix zu tun. Für die Mathematiker: Kann ihr vielleicht jemand erklären wie man aus den Formeln für Polynome 5.Grades einen quellcode macht? Im Grunde genommen sind Matheformeln auch nur ne Programmiersprache. Nur ne ziemlich komplexe (die ich nicht wirklich verstehe). Ein Summenzeichen kann z.B. als Schleife for (int i=START; i < END; i++) umgesetzt werden. usw.
Was mir noch Sorgen macht ist sowas:
Zitat:
int i,k,m,n=2,l,r,p;
Soweit ich das sehe ist l, r und p nirgends definiert. Der Code ist also so, wie er da steht gar nicht kompilierbar. Wobei meine C Kenntnisse eingeschlafen sind. Dort gibts ja auch ganz komische Sachen...
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Also so ganz versteh' ich das nicht. Ist das Problem jetzt wie man ein Polynom n-ten Grades bekommt das durch n Punkte verläuft oder wie man mit n Punkten die dazugehörige Bezierkurve zeichnet?
Bei den ganzen Matrizen würde ich ja eher auf ersteres tippen, wegen Gleichungssystem lösen und so. Allerdings steht am Anfang des Programms "Simple Bezier curve drawing program". Ich hab mich jetzt nur ein paar Minuten mit Bezierkurven beschäftigt und die meisten Erkenntnisse hab ich aus den Animationen in der Wikipedia gewonnen, aber ich glaube nicht das man dafür Matrizen braucht. Ich glaube eher das man das schnell und kurz mit Rekursionen lösen kann oder (natürlich) auch iterativ.
ja genau, das problem was ich habe ist, ich weiss nicht wie ich diesen parabel zeichnen soll bzw polynom.
wenn man das programm startet kann man mit der mause viele verschiedene punkte erstellen und dann eine
approximationskurve erstellen, und dann soll dazu noch die polynomfunktion gezeichnet werden.
das heisst wenn ich diese ganz vielen punkte erstellen und dann die taste a drücke sollte ein parabel bis zu
5. grad gezeichnet werden.
meint ihr, einer von euch bekommt es vielleicht hin ? *liebfrag*
gute nacht leute
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Okay, ich weiß ja nicht wie du auf die Idee gekommen bist etwas zu studieren was du nicht nsatz weiße beschreiben kannst. Um die Informationen die du bereit stellst einmal zusammen zufassen:
1. Ich soll ein Polynom zeichnen
2. Ich habe keine Ahnung
3. Ich bin Dankbar
4. Ich habe keine Ahnung
5. Macht das jemand für mich
6. Ich habe kein Ahnung
So wie es aussieht weißt du weder wie man mit der Programmiersprache umgeht, noch wie ein Polynom funktioniert oder wie OpenGl benutzt wird. Ich habe in meinem Studium ebenfalls solch Mädels kennen gelernt die sich so durchschummln wollten und die haben sich dann ganz schnell vom Acker gemacht als die Prüfungszeit kam, weil die ermogelten Aufgaben die sie nicht geschnallt haben ihnen kein Stück geholfen haben.
Der Code von dir ist riesig! Er ist unverständlich! Wir haben weder die Zeit noch die Lust dieses Mörderkonstrukt deines wahrscheinlich geistfreien Profs zu verstehen. Außerdem bin ich skeptisch, dass du es schaffst, selbst wenn wir dir auf einer vernünftigen Basis helfen könnten. Ich versuchs mal trotzdem:
1. In unserer Tutorial Ecke gibt es ein Tutorial "abseits Eckiger Welten" da kannste schonmal schauen wie Evaluators funktionieren. Das ist eine von openGl mitgebrachte interpolations methode.
2. Solltest du dir mal Arrays und Listen anschauen, damit du auch 5 bis n Koeffizienten speichern kannst für dein Polynom. die Formel mit der du dann f(x) berechnest ist dann eine Schleife, die über alle werte im Array geht und sie nach Berechnung des Grades von x summiert. Das Ergebnis ist dann y.
3. diesen x,y Wert zeichnet man dann innerhalb eines glbegin glend blockes mittels glvertex2f(x,y);
Da sind genug Vokabeln im Text nach denen man hier im Forum und in den Tutorials suchen kann um sich ein Bild von deinen Möglichkeiten zu machen. Auf ein weiteres "Ich habe keine Ahnung, macht mal für mich" hab ich hier definitiv kein Bock.
also mein lieber. ich bin fast festig mit meinem studium, nur ich hatte keine andere wahl ein anderes projekt zu machen und da das mein letzer projekt ist wäre ich euch dankbar.
muss das projekt bald abgeben und soviel zeit bleibt mir nicht übrig.
so ein kleines bissy ahnung habe ich zwar aber net so viel, sonst würde ich hier nicht um hilfe bitten und wäre auf euch nicht angewiesen, aber da ich hilfe brauche bin ich auf euch angewiesen !!!!
Auf diese Weise wirst du nirgends Hilfe finden, du willst nämlich überhauptkeine Hilfe haben. Du willst, dass dir jemand das Programm fix und fertig hier reinstellt. Wenn du auf dieses Programm angewiesen bist dann solltest du selbst auch was dazu beitragen. Dass die Leute hier raten müssen was du überhaupt machen sollst ist ne Zumutung. Offensichtlich weißt du selbst nicht was du machen musst. Musst du anhand von den Punkten eine Bezierkurve zeichnen oder sollst du ein Polynom finden dass durch die gegebenen Punkte geht? Dafür gibts dann auch wieder viele Möglichkeiten (zb: Newtonannäherung). Der Thread ist schon drei Seiten lang und was du machen musst hast du nie beschrieben, wo dein Problem liegt noch weniger.
Wenn überhaupt noch jemand da sein sollte der bereit ist dir zu helfen (nicht das Programm zu schreiben) solltest du mal in mehr als zwei Sätzen deine Aufgabe + Problem beschreiben.
dann die taste a drücke sollte ein parabel bis zu 5. grad gezeichnet werden.
Es gibt keine "Parabel 5. Grades".... Eine Parabel ist immer 2. Grades...
f(x) = a*x^2 + b
-> Parabel. Da taucht kein x^5 auf wie in einem Polynom 5. Grades. Der Grad eines Polynoms wird durch den höchsten Exponenten bestimmt (Achtung, wenn irgendwas nicht hier stimmt, bitte bitte korrigieren ).
Du solltest wirklich mal genau deine Aufgabenstellung beschreiben...
Sollst du Bézierkurven mit mehr als 4 Kontrollpunkten zeichnen?
Sollst du was ganz anderes machen?
Im Moment ist das ein bischen wie "Hey, ich hab hier ein Auto mit vier Reifen. Nun soll ich 6 dranschrauben. Wie mach ich das?" Da kommt es auch komplett auf mehr Informationen an wie was für ein Auto das ist, wozu es dienen soll, wo es überall fahren soll.
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
So ich bring das mal auf den Punkt. Es ist DEINE Zeit die knapp ist und nicht unsere, also wenn du eine Lösung willst, dann nimm dir deine knappe Zeit und formuliere deine Problem aus. Mir ist es egal ob ich dir helfen kann oder nicht. Du hast ja noch nichteinmal die vollständige Aufgabenstellung gepostet. Du hast was geschrieben von einem Programm in dem der Code etwas bewirken soll. Welche Information stellt das Programm denn für deine funktion zur Verfügung und welche Informationen müssen herraus kommen, oder soll einfach nur etwas passieren (in dem Fall einfach nur Zeichnen?).
Außerdem heißt ein "fast abgeschlossenes Studium" eine noch nicht angetreten Prüfung die man auch durchaus noch in den Sand setzen kann und wenn dein aktuelles Projekt nichts wird, dann quälste damit definitiv deine Noten, also tu nicht so als wenn du der völlige überflieger wärst, denn dem würde es nicht passieren, dass er sich von Hobby-Programmieren helfen lassen muss.
In meiner Signatur steht was über Leute die nicht vernünftig Antworten können. Ich ergänze das gleich mal um Leute die nichteinmal vernünftig Fragen können.
Also LR-Zerlegung kannte ich (bis eben) noch nicht, aber ein Blick in die Wikipedia zeigt das sowas für das "Gaußsche Eliminationsverfahren" benutzt wird. Das brauch man zum Lösen von linearen Gleichungssystemen, sollte in der Schule schon drangekommen sein.
Um das Polynom f(x) = a*x^5 + b*x^4 + c*x^3 + d*x^2 + e*x + f aus den Punkten zu berechnen muss man einfach nur ein Gleichungssystem aus den Punkten aufstellen. Auf jeden Fall ist der Grad des Polynoms gleich der Anzahl der Punkte - 1. Ansonsten ist das Gleichungsystem überbestimmt (es gibt keine Lösung) oder unterbestimmt (es gibt unendlich viele Lösungen) und das ist einfach nur doof.
Das Gleichungssystem sieht dann so aus:
(1) a*punkt1.X^5 + b*punkt1.X^4 + ... + f = punkt1.Y
(2) a*punkt2.X^5 + b*punkt2.X^4 + ... + f = punkt2.Y
...
Das f sollte man noch auf die rechte Seite subtrahieren => punkt1.Y - f
Die Punkte sind ja konkrete Zahlen, a,b,..,f sind gesucht. Daraus macht man eine Matrix bei der in jeder Spalte die Koeffizienten für eine Variable stehen.
Das ganze kann man dann eben mit dem "Gaußschen Eliminationsverfahren" lösen, sodass man als erstes f und durch einsetzen auch die anderen Variablen bekommt. Wie das jetzt genau mit der LR-Zerlegung geht kann ich nicht sagen.
Dann hat man eben die Koeffizienten des Polynoms. Das Zeichnen erscheint mir eigentlich relativ trivial:
Das würde dann die Funktion zwischen dem am weitesten linken und rechten Punkt zeichnen:
Code:
glBegin(GL_LINE_STRIP);
for i:=0to unterteilungen do
begin
x:=minx+i/unterteilungen*(maxx-minx);//minx = kleinster x wert der punkte, maxx = der größte, stattdessen kann man auch feste Grenzen unabhängig von den Punkten bestimmen
y:=a*x^5+b*x^4+c*x^3+d*x^2+e*x+f;
glVertex3f(x,y,0);
end;
glEnd;
Das ist jetzt in Pascal, in C++ ist das aber auch nicht viel anders.
Edit: Mir ist grad noch aufgefallen, dass das so richtig wohl doch kein Pascal ist, "^" zum potenzieren gibts ja garnicht, das müsste man mit power() oder per Hand mit vielen "*" machen. Naja, dann ist das oben eben in Pseudocode...
Ich hoffe jetzt mal das hat irgendwie geholfen. Bei der LR-Zerlegung kann ich nicht helfen, das müsste ich mir auch erst erarbeiten und das "Gaußsche Eliminationsverfahren" muss man einfach können.
Die Funktion bei dir Berechnet und Zeichnet ja, sodass ich immernoch nicht so richtig weiß was von beiden nun Probleme macht.
Ich habe mir mal die Mühe gemacht und das Programm auf einem System kompiliert. Abgesehen davon, dass GLUT echt stinkt (Boah, ich musste Metacity statt Compiz nutzen, damit es ordentlich läuft -_-), ist das Programm erstmal schon lustig.
Für alle, die es bis jetzt nicht verstanden haben (habe es auch nicht bis ich das Programm selbst mal gesehen habe):
Man kann beliebig Punkte angeben (und auch nachträglich verschieben) und er malt einen eine Approxmitationskurve. Hier mal ein Screenshot:
Nun die Frage an dich, Julia, geht es darum statt der Parabel (Polygon 2. Grades) das Polygon 5. Grades aus dem selben Input zu Zeichnen? Dann wäre schonmal das Problem, dass du lösen musst geklärt und wir können zu der Frage kommen.
LG Ziz
_________________ Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut. Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’. Und du schaust mich an und fragst ob ich das kann. Und ich denk, ich werd' mich ändern irgendwann. _________________Farin Urlaub - Bewegungslos
Hallo,
Ja "Ziz", es soll im selben Input gezeichnet werden, ein Polygon bis zu 5. Grades.
gibt es denn auch eine möglichkeit das man nicht nur bis 5. grades zeichnen kann sondern auch bis n-ten grades ?
Hallo, gibt es denn auch eine möglichkeit das man nicht nur bis 5. grades zeichnen kann sondern auch bis n-ten grades ?
Indem man die Koeffizienten in einem Array speichert, ein "dynamisches" wie es bei Delphi heißt. Bei C++ gibt es da sicher etwas vergleichbares.
Eigentlich stehen die bei dir ja sogar schon im einem Array ("koeff[11]") , oder? Zumindest werden die zum Zeichnen benutzt. Mit dieser Zerlegung wo mir der Name nicht einfällt, die Multplikationen sparen soll, oder so ähnlich.
Die ganzen Matrizen sind ja schon auf ein Polynom bis 10. Grad ausgelegt. Ich hab mir die Rechnungen nicht so genau angeschaut.
Dann gibt es bei dir eine Variable n, oder vielmehr eine Konstante, die den Wert 2 hat und in vielen Schleifen verwendet wird. Wofür ist die gut und was passiert wenn man die erhöht?.
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.