Verfasst am: 01.03.2010, 20:24
Titel: Hilfe bei for-loop
Hallo!
Ich will einen Farbgradienten programmieren. Das Unterprogramm, dass ich anhänge, wird von einem Hauptprogramm aufgerufen. Input sind alle Werte, die oben angegeben sind.
Das Programm macht auch einen schönen Gradienten, nur habe ich das Problem, dass es sich über meine Weite-Angaben hinweg setzt...
Es muss etwas mit dem for-loop zu tun haben, hinter den ich im Programm ???? geschrieben habe.
Eigentlich wollte ich folgendes:
Die Breite (als Beispiel, für die Höhe gilt das Gleiche) des Bildes wird abgefragt. Die Farben (a1,a2,a3 für Startfarben, b1,b2,b3 für Endfarben; 0 bis 255) und die Anzahl Schritte (2 bis 256) werden abgefragt. Jetzt kann es aber sein, dass durch ungünstige Anzahl der Farben und Schritte der Farbvektor länger ist als die Matrix (heightxwidth). Also nehme ich den letzten Schritt und teile ihm die Endfarbe zu. Der Schritt ist aber möglicherweise zu lang, also nehme ich das Ende des vorherigen Schrittes (steps-1)*p bis height und weise ihm die Endfarbe zu. Zumindest war es so gedacht.
Wenn ich das als if-loop schreibe, bekomme ich statt der gewünschten Bildbreite die Anzahl unterschiedlicher Farben. Und als for-loop meckert Matlab. Warum???
for s > height % ?????
grad((steps-1)*p:height,:,1) = f1(steps);
end
War etwas konfus, und ich weiss auch nicht so genau, wie ich das Problem beschreiben soll. Kurz: das Bild hat nicht die gewünschte Breite...
Vielleicht kann mir ja jemand helfen?
Achso, wenn ich das hier schon eingestellt habe: der Prof meckert über mein switch-case und beanstandet "falschen syntax" und "falsche Reihenfolge der Argumente". Habt Ihr eine Ahnung, was da falsch sein könnte? Ansonsten funktioniert das Programm ja (wenn ich die andere Fehlerstelle ausschalte).
Mit if hatte ich es auch versucht. Nun meckert Matlab zwar nicht mehr, aber das Problem, dass das Bild zu breit (oder zu hoch ist), habe ich immer noch.
Da wird wohl was in deinen Berechnungen im Argen sein. Bevor ich mir das angucke schon mal ein paar Dinge:
- In deinem eigenen Interesse: Bitte kommentiere deinen Code mal etwas. Mindestens solltest du einen Hilfe-Kommentar erstellen. Dazu schreibst du einfach einen Kommentarblock unter deinen Funktionskopf und beschreibst beispielsweise, was deine Funktion tut, was deine Übergabeparameter bedeuten und von welchem Format sie sind. So kannst du oder jemand anders später einfach "help img_gradient_d" eingeben und erhält einen schnellen Überblick über die Benutzung der Funktion.
- Du fragst nirgendwo die Anzahl der Übergabeparameter ab. Ich kann die Funktion aber auch so aufrufen: "a=img_gradient_d(1024,768,[0 0 0],[255 0 0], 13)". Dann knallt es. So geht's z.B.:
Einfach nach deinem Funktionskopf einfügen bevor du irgendwelche Berechnungen anfängst.
- Deine Funktionsaufrufe "round(f1);" tun gar nix. Ist das Absicht?
- Es wäre hilfreich, wenn du mal einen Satz Übergabeparameter nennen würdest, mit dem z.B. dein Problem auftritt. Sonst muss hier jeder Suchen und rumprobieren.
hast du Überschneidungen der Bereiche, also beispielsweise im ersten Durchlauf schreibst du 4:8 im nächsten Durchlauf 8:12.
Das ist bei bestimmten Bildgrößen nicht schlimm, bei einer Bildhöhe von 10 und 9 Schritten werden so aber nur noch 5 oder 6 Schritte dargestellt.
Wenn steps größer als die jeweilige Kantenlänge ist wird auch nur die Startfarbe dargestellt.
Hier ist also sicher noch Verbesserungsbedarf.
Das Hauptproblem handelst du dir auf jeden Fall über das "ceil()" ein.
Beispiel:
Kantenlänge = 768, steps = 254
768/254 = 3.025..., dein p = 4
In der Schleife gehst du bis (n+1)*p=1012, also erheblich über 768.
Was du vor hast, wenn ich es richtig verstehe, ist zu gucken wieviele Zeilen (oder Spalten) im Bild jeweils von einer Farbe belegt werden. Da du 3,025 Zeilen nicht zeichnen kannst, rundest du auf 4 auf. Das Problem ist aber, dass du nach 100 Durchläufen bei Zeile 400 bist, aber eigentlich erst bei Zeile 303 sein dürftest.
Besser wäre also nicht von vornherein zu runden und alles nach hinten zu verschieben sondern lieber bei jedem Bereich neu zu runden.
Hier mal eine mögliche Lösung:
Code:
function img = img_gradient_d(width, height, colour1, colour2, steps, direction) % Hier Hilfetext einfügen % und Parameter beschreiben
Sorry, dass ich erst jetzt antworte. Habe kranke Kinder zu Hause, da ist momentan nicht viel mit Programmieren...
Das Bild ist aber immer noch zu gross... Also die eingegebene Höhe oder Breite ist kleiner als die tatsächliche... Mal schauen, ob ich das irgendwie hinbekomme.
Die fehlende Dokumentation liegt daran, dass ich nicht auf deutsch studiere und deshalb die Dokumentation entfernt habe. Faulerweise habe ich sie nicht auf deutsch übersetzt .
Ich versteh das nicht ganz mit "Das Bild ist aber immer noch zu gross... Also die eingegebene Höhe oder Breite ist kleiner als die tatsächliche". Wenn ich width = 1024 und height = 768 beim Funktionsaufruf übergebe erhalte ich einen Gradienten in genau diesen Dimensionen. Oder verstehe ich da was falsch?
Erklär das mal genauer.
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.