Einzelnen Beitrag anzeigen
Alt 26.09.2010, 08:19   #1 (permalink)
kanonenfutter
Extrem Tweaker
 
Benutzerbild von kanonenfutter
 

Registriert seit: 10.07.2006
Beiträge: 2.290

kanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblick

Frage [C++] Problem bei Denkaufgabe

Hi Leutz

Also ich sitze gerade an einem Programm, welches ich als Projekt in der Uni abgeben muss. Thema: Demonstration von Bildverarbeitungsbefehlen in C++. So weit so gut. Mein Problem hier ist allerdings sehr allgemeiner Kultur, hat also nicht viel mit C++ oder BV im speziellen zu tun.

Und zwar folgendes: Ich habe ein Fenster mit einem Bild drin. Außerdem ist in dem Fenster ein Balken (quasi ein Schieberegler), über den ich einen Wert alpha einstellen kann (von 0 bis 1). Umso höher alpha, desto stärker wird das Bild geschärft. Ich arbeite über das gesamte Projekt hinweg (dies hier ist nur eine Teilaufgabe) mit der Bibliothek "CImg". Ich verwende daher keine normale Windowsoberfläche (da nicht möglich), sondern bastel mir meine wenigen benötigten Eingabeelemente einfach selbst

Mal kurz zur Vorstellung:

http://www.tweakpc.de/forum/members/...e1641-bv-c.jpg

Mittlerweile hab ich nach einigem geistigem Spagat schonmal geschafft, dass die Höhe des Balkens korrekt gezeichnet wird, je nach eingestelltem alpha.

Mein Problem nun ist, dass ich aus der y-Position des Mausklicks (Achtung: beim Bildkoordinatensystem liegt der Ursprung links oben, y wird nach unten also immer größer), das entsprechende alpha berechnen muss. Hierzu hab ich zwar schon mehrere in Frage kommende Formeln durch, allerdings liefert keine das Ergebnis das ich suche.

Ich möchte mal kurz die verwendeten Maße versuchen zu verdeutlichen. Das Bild ist fest 450px hoch, über und unter dem Balken befinden sich jeweils 25px+Schriftgröße (im aktuellen Fall bei Schriftgröße 24 = insgesamt 49px) Platz zum Fensterrand.

Der unterste Punkt für alpha = 0 lässt sich also durch 450 - schriftgröße - 25 (= 401)angeben, der oberste für alpha = 1 durch schriftgröße + 25 (= 49).

Hier mal mein aktueller Quelltext zum Problem:

Code:
1)    const int yb = (int)((450-tsize-25)-(alpha*(450-50-(2*tsize))));
    
2)            visu[1].draw_rectangle(38, 450-tsize-23, 62, tsize+23, lblue, 1).
            draw_rectangle(39, 450-tsize-24, 61, tsize+24, dblue, 1).draw_rectangle(40, 450-tsize-25, 60, yb, blue, 1);
    
3)            if ((disp.button()) && (disp.mouse_x()>=img.width() + 38) && (disp.mouse_x()<=img.width() + 62) && 
                (disp.mouse_y()>=tsize + 25) && (disp.mouse_y()<=450-tsize-25))
            {
4)                alpha = ((disp.mouse_y() -450 +25 +tsize) / ((50 +(2*tsize) -450)/100));
                  alpha/= 100;

5)                if(alpha>0.999)
                {
                    alpha = 0.999;
                }
            }
1) hier wird yb berechnet, welches die Höhe des Balkens angibt in Abhängigkeit von alpha, funzt wunderbar

2) da wird einfach nur der Balken gezeichnet an die entsprechenden Koordinaten

3) Sobald in dem Balken ein Mausklick registriert wird...

4) ...berechne das zugehörige alpha aus der y-Position des Klicks (bei dieser Formel liegt der Hund begraben, aktuell habe ich die obere Formel von yb genommen und nach alpha umgestellt und für yb die y-Mauskoordinate angenommen)

5) sollte alpha größer werden als 0,999 setze es au 0,999, soll einfach verhindern das Werte mit 1 angenommen werden können, da dann die Schärfeformel Müll rechnet

Tja, so wie ich das im Moment so stehen habe, ergibt sich folgendes Problem, umso weiter ich den Balken nach oben schieben will, desto weiter eilt der Balken meiner Maus voraus. In den unteren Regionen bei alpha ca. 0,1 stimmt die Balkenposition mit der Mausposition überein. Umso größer das alpha wird, umso größer auch der Fehler. Hab leider keine Ahnung mehr woran das liegen kann. Irgend einen einfachen Offset kann ich nicht vergessen haben, da sonst über den gesamten Balkenverlauf der Fehler (Distanz y-Balkenposition zu y-Mausposition) immer gleich groß wäre. In meinem Fall jedoch nimmt er mit kleinerer y-Mauskoordinate zu...

Wäre schön wenn jmd. eine Idee liefer könnte, bin mit meinem Latein am Ende,hoffe ich konnte es ausreichend rüberbringen

mfg
kanonenfutter
kanonenfutter ist offline   Mit Zitat antworten