Du bist nicht eingeloggt.

Login

Pass

Registrieren

Community
Szene & News
Locations
Impressum

Forum / Bits und Bytes

C++ Problem

-mOsTwAnTeD- - 35
Profi (offline)

Dabei seit 07.2006
677 Beiträge
Geschrieben am: 15.04.2008 um 12:11 Uhr

Hi ihr Cracks ;-)


hab da mal eine kleine frage :-)

ich möchte mit der GDI ein Diagramm zeichnen. Das ist soweit kein problem. Doch anstatt Linien werden an den Koordinaten Rechtecke gemalt. Immernoch kein Problem. Jetzt sollen aber die Rechtecke unterschiedliche Farben erhalten.

So d.h ich habe mir eine Methode GetColour(int Wert, int Array, int* R, int* G, int* B)

geschrieben.

Der Wert ist der aktuelle Wert für den eine farbe ermitelt werden soll. In dem Array stehen alle Werte (vorsicht das Array ist mehrdimensional)

die es insgesamt gibt. R,G und B sind zeiger die den RGB wert darstellen sollen.
So nun ist das Problem das ich nicht weiß wie ich die RGB Werte berechnen soll, denn es gibt immer Unterschiedliche Werte die von 0 bis schätzungsweise 200
gehen, allerdings auch mal erst bei 50 anfangen und nur bis 100 gehen, oder nur von 0 bis 10. Da man nicht für jeden Wert eine extra farbe nimmt, da es sonst zu unübersichtlich wird muss man auch berücksichtigen, d.h wenn es unter 10 verschiedene Werte sind soll für jeden wert eine extra farbe gewählt werden, wenn es mehr sind sollten alle 8-10 schritte eine neue farbe gewählt werden. Außerdem sollte wenn man die Drafik ausdruckt (Schwarz-Weiß) auch noch zu erkennen sein
an welchen Stellen höhere und wo niederigere Werte liegen. -> Die 0 ist nicht zu berücksichtigen, da die methode dann erst gar nicht aufgerufen wird. Die kleinste Zahl soll möglichst hell dargestellt werden
und die höchste möglichst dunkel. Nur leider kann man nicht einfach den RGB Wert erhöen da sich dann ja die gesamte Farbe ändert.(R++, G++, B++)
Außerdem sollte die Methode möglichst wenig resourcen benötigen damit das programm möglichst nicht gebremst wird.



Ich habe jetzt nur eine idee und zwar das ganze mit zig if abfragen und switch case anweisungen zu machen. Hat jemand eine idee wie es am leichtesten zu realisieren ist?


Greetz und schon mal danke im vorraus
most


Ich scheiß auf deine Welt voller Arroganz und Geld!

BIOSHOCK - 33
Halbprofi (offline)

Dabei seit 10.2007
383 Beiträge

Geschrieben am: 15.04.2008 um 13:36 Uhr

Zitat von -mOsTwAnTeD-:

Hi ihr Cracks ;-)


hab da mal eine kleine frage :-)

ich möchte mit der GDI ein Diagramm zeichnen. Das ist soweit kein problem. Doch anstatt Linien
werden an den Koordinaten Rechtecke gemalt. Immernoch kein Problem. Jetzt sollen aber die
Rechtecke unterschiedliche Farben erhalten.

So d.h ich habe mir eine Methode GetColour(int Wert, int Array, int* R, int* G, int* B)

geschrieben.

Der Wert ist der aktuelle Wert für den eine farbe ermitelt werden soll. In dem Array stehen alle
Werte (vorsicht das Array ist mehrdimensional)

die es insgesamt gibt. R,G und B sind zeiger die den RGB wert darstellen sollen.
So nun ist das Problem das ich nicht weiß wie ich die RGB Werte berechnen soll, denn es gibt
immer Unterschiedliche Werte die von 0 bis schätzungsweise 200
gehen, allerdings auch mal erst bei 50 anfangen und nur bis 100 gehen, oder nur von 0 bis 10. Da
man nicht für jeden Wert eine extra farbe nimmt, da es sonst zu unübersichtlich wird muss man
auch berücksichtigen, d.h wenn es unter 10 verschiedene Werte sind soll für jeden wert eine extra
farbe gewählt werden, wenn es mehr sind sollten alle 8-10 schritte eine neue farbe gewählt werden.
Außerdem sollte wenn man die Drafik ausdruckt (Schwarz-Weiß) auch noch zu erkennen sein
an welchen Stellen höhere und wo niederigere Werte liegen. -> Die 0 ist nicht zu berücksichtigen,
da die methode dann erst gar nicht aufgerufen wird. Die kleinste Zahl soll möglichst hell dargestellt
werden
und die höchste möglichst dunkel. Nur leider kann man nicht einfach den RGB Wert erhöen da sich
dann ja die gesamte Farbe ändert.(R++, G++, B++)
Außerdem sollte die Methode möglichst wenig resourcen benötigen damit das programm möglichst
nicht gebremst wird.



Ich habe jetzt nur eine idee und zwar das ganze mit zig if abfragen und switch case anweisungen
zu machen. Hat jemand eine idee wie es am leichtesten zu realisieren ist?


Greetz und schon mal danke im vorraus
most


tipp es gibt ne gruppe die heißt programmierer die müssten eig helfen können ;-)

Welcome to Rapture

uwebaier - 36
Halbprofi (offline)

Dabei seit 06.2005
124 Beiträge

Geschrieben am: 15.04.2008 um 13:45 Uhr
Zuletzt editiert am: 15.04.2008 um 13:47 Uhr

Also wenn ich das jetz so halbwegs verstanden hab willst du Werte als Farben zeigen.
Der niedrigste Wert soll eine helle Farbe sein (also weiß) und der höchste eine dunkle Farbe (also Schwarz)

Um das ganze zu machen würd ich kein Mehrdimensionales Array nehmen sondern die Fraben und Werte in nem struct Speichern, also so:

struct farbwert {
int Wert;
unsigned char R;
unsigned char G;
unsigned char B;
};

Da du ja wies aussieht eh in Schwarz-weiß ausdrucken willst empfehl ich dir das ganze mit Grautönen zu machen.
Wenn du Grautöne benutzt kannst ja zu R G und B schrittweise das gleiche addieren...

Die Funktion sähe dann bei mir ungefähr so aus:

void erstelleFarbenArray
(farbwert * Buffer, //Ein Zeiger in den das Eregbnisarray geschrieben wird
int * Values,//Die Werte die die Funktion in das array schreiben soll
int Valuecount)
{
Buffer=new farbwert[Valuecount]; //Das neue Array erstellen
for (int i=0; i<Valuecount; i++) {
Buffer[i].Wert=Values[i];
Buffer[i].R=255/Valuecount*i;
Buffer[i].G=255/Valuecount*i;
Buffer[i].B=255/Valuecount*i; }
}

Das ominöse 255/valuecount*i bedeutet lediglich dass im ersten Schritt(255/Valuecount) die Farbschrittweite zum nächsten Wert bestimmt wird und im
zweiten Schritt (also *i) der Farbwert mit der Farbschrittweite mal der Nummer des Arrayindex versehen wird (bisschen Mathe am Mittag xD)

Ich glaub zwar nich dass ich dir ganz geholfen hab, aber du bist hoffentlich ein Stück näher gekommen und kannst was damit anfangen.
Wenn dir was fehlt oder ich was falsch verstanden hab, nur schreiben...

MFG WaynnnE

EDIT: Wenn de brauchst musst halt davor die Zahlen sortieren, google kann dir mit Quicksort oder ähnlichem helfen =)

UT3 Sucks ^^

BeeZeBub - 35
Anfänger (offline)

Dabei seit 03.2008
3 Beiträge

Geschrieben am: 15.04.2008 um 14:23 Uhr

kann mir jmd einen taschenrechner auf der graphischen oberfläche machen?
ich brauch des für ein projekt
oderkann mir jmd helfe?


Me @ Southpark :D

McPommes - 51
Experte (offline)

Dabei seit 09.2006
1422 Beiträge
Geschrieben am: 15.04.2008 um 17:22 Uhr

Es gibt doch auch ne Funktion um Linien zu zeichnen.
Das mit den Farben hab ich vielleicht nicht wirklich kapiert. Was uwebaier schreibt, hab ich mir auch gedacht. Ich denk mal du will unterschiedliche Farben haben und dir ausrechnen, wann du welche Farbe nimmst.
Dazu würd ich ein paar Farben vorgeben und die in ein Array stecken.
Dann rechnest du aus wie viele unterschiedliche Werte es gibt und kannst daran entscheiden, wie viele Schritte du zu einer einzigen Farbe zusammenfasst. Daraus ergibt sich dann die Anzahl der Farben. Wenn du ein paar unterscheidbare Farben in deinem Array hasst, würd ich dann einfach die ersten x Farben nehmen, je nach dem wie viele du brauchst.
Triffts das ungefähr?


*** diese Fusszeile verschwendet 45 Bytes ***

-mOsTwAnTeD- - 35
Profi (offline)

Dabei seit 07.2006
677 Beiträge
Geschrieben am: 17.04.2008 um 11:59 Uhr

Zitat von uwebaier:

Also wenn ich das jetz so halbwegs verstanden hab willst du Werte als Farben zeigen.
Der niedrigste Wert soll eine helle Farbe sein (also weiß) und der höchste eine dunkle Farbe (also Schwarz)

Um das ganze zu machen würd ich kein Mehrdimensionales Array nehmen sondern die Fraben und Werte in nem struct Speichern, also so:

struct farbwert {
int Wert;
unsigned char R;
unsigned char G;
unsigned char B;
};

Da du ja wies aussieht eh in Schwarz-weiß ausdrucken willst empfehl ich dir das ganze mit Grautönen zu machen.
Wenn du Grautöne benutzt kannst ja zu R G und B schrittweise das gleiche addieren...

Die Funktion sähe dann bei mir ungefähr so aus:

void erstelleFarbenArray
(farbwert * Buffer, //Ein Zeiger in den das Eregbnisarray geschrieben wird
int * Values,//Die Werte die die Funktion in das array schreiben soll
int Valuecount)
{
Buffer=new farbwert[Valuecount]; //Das neue Array erstellen
for (int i=0; i<Valuecount; i++) {
Buffer[i].Wert=Values[i];
Buffer[i].R=255/Valuecount*i;
Buffer[i].G=255/Valuecount*i;
Buffer[i].B=255/Valuecount*i; }
}

Das ominöse 255/valuecount*i bedeutet lediglich dass im ersten Schritt(255/Valuecount) die Farbschrittweite zum nächsten Wert bestimmt wird und im
zweiten Schritt (also *i) der Farbwert mit der Farbschrittweite mal der Nummer des Arrayindex versehen wird (bisschen Mathe am Mittag xD)

Ich glaub zwar nich dass ich dir ganz geholfen hab, aber du bist hoffentlich ein Stück näher gekommen und kannst was damit anfangen.
Wenn dir was fehlt oder ich was falsch verstanden hab, nur schreiben...

MFG WaynnnE

EDIT: Wenn de brauchst musst halt davor die Zahlen sortieren, google kann dir mit Quicksort oder ähnlichem helfen =)

Danke erstaml für eure antworten.
Ich glaube du hast da etwas falsch verstanden bzw ich hab da etwas falsch geschrieben :-D

Also das 2 Dimensionale Array benötige ich. Darin stehen meine werte. Um es nicht ganz kompliziert zu machen sag ich es mal so. Array[x][y] x und y geben die position der daten an. D.h. Array[12][16] hat beispielsweise den Wert 32. D.h die Menge 32 soll durch eine bestimmte farbe dargestellt werden und zwar an dem Koordinatenpunkt der Einheitsschritte x,y (x und y stellen nicht die Pixel dar sondern die Einheitsschritte wenn man das so nennt ;-) ). Ich habe das Array nur übergeben um zu sehen welches der höchste und welches der niedrigste Wert ist. Die Methode wird jedesmal aufgerufen bevor ein Pen erzeugt wird. Die Zeiger R,G und B stehen dann in dem RGB wert des Pen wenn sich also die variablen RGB ändern ändert sich automatisch die Farbe des pen. -> fortsetzung im nächsten Post^^


Ich scheiß auf deine Welt voller Arroganz und Geld!

-mOsTwAnTeD- - 35
Profi (offline)

Dabei seit 07.2006
677 Beiträge
Geschrieben am: 17.04.2008 um 12:10 Uhr

Zitat von McPommes:

Es gibt doch auch ne Funktion um Linien zu zeichnen.


Ja das hab ich schon alles.
falls es dich interessiert die Funktion heißt

MoveToExt(hDC, x,y)
LineTo(hDC,x+Länge_x, y+Länge_y)

dies zeichnet eine schwarze linie...
Wenn man sich davor ein Object Pen anlegt
CPen myPen(PS_SOLID,Dicke,RGB(255,255,255)
und dannach das Object auswählt

pDC->SelectObject(&myPen)

und dannach das MoveToExt und LineTo macht wird die im RGB angegebene Farbe dargstellt.




Zitat von McPommes:


Das mit den Farben hab ich vielleicht nicht wirklich kapiert. Was uwebaier schreibt, hab ich mir auch gedacht. Ich denk mal du will unterschiedliche Farben haben und dir ausrechnen, wann du welche Farbe nimmst.


Ja ich weiß ich habs n bisschen kompliziert geschrieben aber das trifft dem Nagel auf den Kopf...

Zitat:


Dazu würd ich ein paar Farben vorgeben und die in ein Array stecken.
Dann rechnest du aus wie viele unterschiedliche Werte es gibt und kannst daran entscheiden, wie viele Schritte du zu einer einzigen Farbe zusammenfasst. Daraus ergibt sich dann die Anzahl der Farben. Wenn du ein paar unterscheidbare Farben in deinem Array hasst, würd ich dann einfach die ersten x Farben nehmen, je nach dem wie viele du brauchst.
Triffts das ungefähr?
So und genau das ist die Problembeschreibung.
Die Farben in ein Array zu klatschen is n wirklich guter Tipp. Hätte ich auch selber drauf kommen können :nixblicker:

Aber wie rechne ich die anzahl der Unterschiedlichen Werte aus? Es können in dem Werte Array alle möglichen werte vorkommen. D.h es muss nicht sein das der niedrigste wert unter 50 liegt es kann aber auch gut sein das er 1 ist. Der höchste Wert kann auch über 200 liegen oder unter 50 Es kann sein das die werte alle in einem bereich von 50 liegen es kann aber auch sein das sie über 200 bereiche willkürlich verstreut sind.

Aber so im allgemeinen Triffts das :-D


Danke an alle die bisher geantwortet haben

Ich scheiß auf deine Welt voller Arroganz und Geld!

uwebaier - 36
Halbprofi (offline)

Dabei seit 06.2005
124 Beiträge

Geschrieben am: 17.04.2008 um 16:01 Uhr

Also gut, ich glaub ich weiß jetz eher was du meinst...

Und das Problem mit den Werten (wenn ich das richtig verstanden hab)
ist dass du die Farben nich gleichmäßig sondern entsprechend ihrem Abstand zu höchstem/niedrigstem Wert liegen, also
5 (niedrigster Wert) 10 50 (höchster Wert)
Du willst jetz dass die Farben nicht gleichmäßig zunehmen sondern dass wie im Beispiel der Wert 10 heller dargestellt wird weil er näher bei 5 liegt als bei 50?

PS: Ist das mit den Grautönen von dir akzeptiert oder willst was anderes?

UT3 Sucks ^^

-mOsTwAnTeD- - 35
Profi (offline)

Dabei seit 07.2006
677 Beiträge
Geschrieben am: 17.04.2008 um 21:38 Uhr

Zitat von uwebaier:

Also gut, ich glaub ich weiß jetz eher was du meinst...

Und das Problem mit den Werten (wenn ich das richtig verstanden hab)
ist dass du die Farben nich gleichmäßig sondern entsprechend ihrem Abstand zu höchstem/niedrigstem Wert liegen, also
5 (niedrigster Wert) 10 50 (höchster Wert)
Du willst jetz dass die Farben nicht gleichmäßig zunehmen sondern dass wie im Beispiel der Wert 10 heller dargestellt wird weil er näher bei 5 liegt als bei 50?

PS: Ist das mit den Grautönen von dir akzeptiert oder willst was anderes?
joa so in die richtung...

und joa grautöne passen... gibt ja zig verschiedene...
man sollte aber auch einen unterschied erkennen...

Ich scheiß auf deine Welt voller Arroganz und Geld!

uwebaier - 36
Halbprofi (offline)

Dabei seit 06.2005
124 Beiträge

Geschrieben am: 18.04.2008 um 16:04 Uhr
Zuletzt editiert am: 18.04.2008 um 16:54 Uhr

OK, ich glaub ich weiß wo dein Problem liegt, aber ich denk dabei kann ich dir helfen...

Kurze Vorgehenserklärung:
Um die Farben gleichmäßig zu verteilen (so wie besprochen)
musst du einfach allen Arraywerten den kleinsten aller Arraywerte abziehen,
damit haste ja dann praktisch einen Wertebereich zwischen 0...n
den größten Wert solltest auch abspeichern, damit du weiß wann das Limit erreicht ist.

Nun hast einen Wertebereich deiner Zahlen zwischen 0 und größtem Wert,
die Anzahl verschiedener Farben is die Anzahl deiner Werte (ich habs im Code begrenzt auf 10)
Danach folgt Prozentrechnen:
Wert/Größter Wert ergibt prozentualen Anteil
prozentualer Wert * 255 gibt entsprechende Farbe zu Wert
Im letzten Schritt wird dafür gesorgt, dass nur eine begrenzte Anzahl von Farben möglich ist, die sich gleichmäßig in Bereiche aufteilen.

(Ich kanns nich in Worte fassen, erklären is nich so meine Stärke)

Code:

Zitat:


struct color {
unsigned char R;
unsigned char G;
unsigned char B; };

void fillColorArray(color * Array, int *Values, int Valuecount)
{
const int Maxcolorcount=10;
int Minvalue=Values[0];
int Maxvalue=Values[0];
for (int i=1; i<Valuecount; i++) {
if (Maxvalue<Values[i]) {
Maxvalue=Values[i]; }
else if (Minvalue>Values[i]) {
Minvalue=Values[i]; }
}
int Colorcount=(Valuecount>Maxcolorcount)?Maxcolorcount:Valuecount;
Maxvalue-=Minvalue;
for (int i=0;i<Valuecount; i++) {
Array[i].R=(float(Values[i]-Minvalue)/float(Maxvalue))*255; //Farbenwert
Array[i].R-=Array[i].R%Colorcount;
Array[i].G=Array[i].R;
Array[i].B=Array[i].B; }
}


Ich hoffe das ganze hat dir bisschen geholfen, Erklären war nie meine Stärke, aber Mathe regelt xxD

PS:Das colorarray solltext erstellen bevor du die Funktion aufrufst, ansonsten gibts Ärger =)

UT3 Sucks ^^

-mOsTwAnTeD- - 35
Profi (offline)

Dabei seit 07.2006
677 Beiträge
Geschrieben am: 19.04.2008 um 12:11 Uhr

oK Dankeschön!!!

ich machs jetzt aber anderst. Ich übergebe der funktion schon den max wert. Der minimal Wert wird immer 1 sein. Im Colour Array werden dann die Farben im vorhinein geschrieben.

So nun sind es zb. 1-70 Werte. Dann mache ich 70/AnzahlFarben so nun weiß ich ja wie viele Werte es für eine Farbe gibt. dann einfach Wert/(70/Anzahlfarben) dann weiß ich an welcher stelle die Farbe im array steht.

Also vielen dank für deine Idee mit dem Array!!!

So nun hat sich doch noch ein bisschen was geänderst. Die farben sollen NICHT grau sein.

D.h sie sollen bei Schwarz anfagne über blau ins grüne gehen von grün ins gelbe -> ins orange und dann ins rote. D.h es soll der niedrigste Wert am dunkelsten sein mit ausnahme von dem Wert 0 (weiß) und der höchste am hellsten.

So nun hab ich das mal versucht aber es sah einfach scheiße aus :-D

gibts vll irgendwo im netzt eine Farbaufstellung mit genau diesem chema?


Greetz most

Ich scheiß auf deine Welt voller Arroganz und Geld!

uwebaier - 36
Halbprofi (offline)

Dabei seit 06.2005
124 Beiträge

Geschrieben am: 19.04.2008 um 17:38 Uhr
Zuletzt editiert am: 19.04.2008 um 17:39 Uhr

Öhm das is eigenlich ganz einfach mit 2 Farben...

Das du Mathe kannst hab icj ja gesehen, also könnte dir das vielleicht den Finalen Tip geben (Ich weiß aber nich wies aussieht xD)

Rechne den Betrag von einer Frabe minus der anderen...
Nun teilst du dein Eregbnis in RGB auf und teilst dann einzeln R G und B durch die Anzahl der verschiedenen Farbwerte (Die Anzahl der Farben die du maximal anzeigen willst)

Damit hast Schrittweiten für R G und B, und bei der finalen for-schleife tust dann einfach zu der entsprechenden Farbe ihre Distanz dazurechnen also so:
RDistance=(großFarbe-kleinFarbe)/Maxanzahlfarben;

R=Wert/Maxwert*(großFarbe-kleinFarbe);
R-=R%RDistance;
R+=kleinFarbe;
/* Musst halt für jeden Farbton extra machen als R G und B... */

Probiers mal aus, ich kanns bei mir nich testen weil ich Probs mit CBuilder hab ^^

UT3 Sucks ^^

-mOsTwAnTeD- - 35
Profi (offline)

Dabei seit 07.2006
677 Beiträge
Geschrieben am: 21.04.2008 um 19:49 Uhr

Zitat von uwebaier:

Öhm das is eigenlich ganz einfach mit 2 Farben...

Das du Mathe kannst hab icj ja gesehen, also könnte dir das vielleicht den Finalen Tip geben (Ich weiß aber nich wies aussieht xD)

Rechne den Betrag von einer Frabe minus der anderen...
Nun teilst du dein Eregbnis in RGB auf und teilst dann einzeln R G und B durch die Anzahl der verschiedenen Farbwerte (Die Anzahl der Farben die du maximal anzeigen willst)

Damit hast Schrittweiten für R G und B, und bei der finalen for-schleife tust dann einfach zu der entsprechenden Farbe ihre Distanz dazurechnen also so:
RDistance=(großFarbe-kleinFarbe)/Maxanzahlfarben;

R=Wert/Maxwert*(großFarbe-kleinFarbe);
R-=R%RDistance;
R+=kleinFarbe;
/* Musst halt für jeden Farbton extra machen als R G und B... */

Probiers mal aus, ich kanns bei mir nich testen weil ich Probs mit CBuilder hab ^^


danke erstmal.. bin leider noch nicht dazugekommen es auszuprobieren... aber morgen sollte es so weit sein :-D

Ich scheiß auf deine Welt voller Arroganz und Geld!

  [Antwort schreiben]

Forum / Bits und Bytes

(c) 1999 - 2026 team-ulm.de - all rights reserved - hosted by ibTEC Team-Ulm

- Presse - Blog - Historie - Partner - Nutzungsbedingungen - Datenschutzerklärung - Jugendschutz -