grafik programmierung



  • hi. ich würde gerne wissen was ich machen muss um eine 640x480 grafikauflösung mit 256 farben einzustellen um mit putpixel (war glaub ich der befehl) einzelne verschiedenfarbige pixel auf den bildschirm darzustellen.



  • huhu,
    schau mal ins Spiele und grafik forum 😉



  • das ist alles mit opengl ode directx wie ich das sehe.

    ich arbeite mit einem dos basierendem c und moechte die grafik auf 640x480 mit 256 farben gestellt haben um dort werte aus einem 2 dimensionalem array als karte auf den bildschirm zu schreiben.

    vielelicht hilft es wenn ihr wisst worum es geht.

    2 schrittmotoren steuern eine solarzelle um lichtintensität zu messen.

    hier mal der sourcecode:

    #include <stdio.h>
    #include <conio.h>
    #include <dos.h>
    
    void scan(void)
    {
    int messwerte[255,255];
    int schalter = 0;
    int i = 0;
    int k = 0;
    int maxwert = 0;
    int imerk = 0;
    int kmerk = 0;
    unsigned short sonne = 0;
    int wert = 0;
    int wert2= 0;
    int summe = 0;
    int zeit = 10;
    char dende;
    clrscr();
    
    printf("Richten Sie Bitte die Solarzelle des Sonnenfinders Waagerecht aus!\n");
    printf("Nachdem Sie das getan haben drcken Sie bitte enter um fortzufahren.");
    
    do{}
    while(!kbhit());
    
    clrscr();
    i=0;k=0;schalter=0;
    for(i=0;i<48;i++)
    	{
    	if(schalter==0)
    		{
    		schalter = 1;
    		for(k=0;k<25;k++)
    			{
    			if(k==0 || k == 4 || k == 8 || k == 12 || k == 16 || k == 20 || k == 24) wert = 0;
    			if(k==1 || k == 5 || k == 9 || k == 13 || k == 17 || k == 21) wert = 1;
    			if(k==2 || k == 6 || k == 10 || k == 14 || k == 18 || k == 22) wert = 3;
    			if(k==3 || k == 7 || k == 11 || k == 15 || k == 19 || k == 23) wert = 2;
    
    			if(i==0 || i == 4 || i == 8 || i == 12 || i == 16 || i == 20 || i == 24 || i == 28 || i == 32 || i == 36 || i == 40 | i == 44) wert2 = 0;
    			if(i==1 || i == 5 || i == 9 || i == 13 || i == 17 || i == 21 || i == 25 || i == 29 || i == 33 || i == 37 || i == 41 | i == 45) wert2 = 4;
    			if(i==2 || i == 6 || i == 10 || i == 14 || i == 18 || i == 22 || i == 26 || i == 30 || i == 34 || i == 38 || i == 42 | i == 46) wert2 = 12;
    			if(i==3 || i == 7 || i == 11 || i == 15 || i == 19 || i == 23 || i == 27 || i == 31 || i == 35 || i == 39 || i == 43 | i == 47) wert2 = 8;
    
    			outportb(0x37a,0x00^0x0b); delay(10);
    			outportb(0x37a,0x01^0x0b);
    			sonne = (((inportb(0x379))>>3)^0x10)& 0x1f;
    			messwerte[i,k]=sonne;
    
    			if(maxwert < sonne) {maxwert = sonne; imerk=i; kmerk = k;}
    
    			summe = wert + wert2;
    			delay(zeit);
    			gotoxy(1,1);
    			printf("schalter = %d i = %d k = %d aus = %d         \n",schalter,i,k,summe);
    			gotoxy(1,2);
    			printf("eingelesener wert = %3d",sonne);
    			outportb(0x378,summe);
    			}
    		}
    	else if(schalter==1)
    		{
    		schalter = 0;
    		for(k=24;k>=0;k--)
    			{
    			if(k==0 || k == 4 || k == 8 || k == 12 || k == 16 || k == 20 || k == 24) wert = 0;
    			if(k==1 || k == 5 || k == 9 || k == 13 || k == 17 || k == 21) wert = 1;
    			if(k==2 || k == 6 || k == 10 || k == 14 || k == 18 || k == 22) wert = 3;
    			if(k==3 || k == 7 || k == 11 || k == 15 || k == 19 || k == 23) wert = 2;
    
    			if(i==0 || i == 4 || i == 8 || i == 12 || i == 16 || i == 20 || i == 24 || i == 28 || i == 32 || i == 36 || i == 40 | i == 44) wert2 = 0;
    			if(i==1 || i == 5 || i == 9 || i == 13 || i == 17 || i == 21 || i == 25 || i == 29 || i == 33 || i == 37 || i == 41 | i == 45) wert2 = 4;
    			if(i==2 || i == 6 || i == 10 || i == 14 || i == 18 || i == 22 || i == 26 || i == 30 || i == 34 || i == 38 || i == 42 | i == 46) wert2 = 12;
    			if(i==3 || i == 7 || i == 11 || i == 15 || i == 19 || i == 23 || i == 27 || i == 31 || i == 35 || i == 39 || i == 43 | i == 47) wert2 = 8;
    
    			outportb(0x37a,0x00^0x0b); delay(10);
    			outportb(0x37a,0x01^0x0b);
    			sonne = (((inportb(0x379))>>3)^0x10) & 0x1f;
    			messwerte[i,k]=sonne;
    
    			if(maxwert < sonne) {maxwert = sonne; imerk=i; kmerk = k;}
    
    			summe = wert + wert2;
    			delay(zeit);
    			gotoxy(1,1);
    			printf("schalter = %d i = %d k = %d aus = %d         \n",schalter,i,k,summe);
    			gotoxy(1,2);
    			printf("eingelesener wert = %3d",sonne);
    			outportb(0x378,summe);
    			}
    		}
    	}
    printf("\n%d %d %d",maxwert,imerk,kmerk);
    printf("\nFahre zum hellsten Punkt"); delay(2000);
    
    for(i=0;i<=imerk;i++)
    	{
    	delay(100);
    	if(i==0 || i == 4 || i == 8 || i == 12 || i == 16 || i == 20 || i == 24 || i == 28 || i == 32 || i == 36 || i == 40 | i == 44) wert2 = 0;
    	if(i==1 || i == 5 || i == 9 || i == 13 || i == 17 || i == 21 || i == 25 || i == 29 || i == 33 || i == 37 || i == 41 | i == 45) wert2 = 4;
    	if(i==2 || i == 6 || i == 10 || i == 14 || i == 18 || i == 22 || i == 26 || i == 30 || i == 34 || i == 38 || i == 42 | i == 46) wert2 = 12;
    	if(i==3 || i == 7 || i == 11 || i == 15 || i == 19 || i == 23 || i == 27 || i == 31 || i == 35 || i == 39 || i == 43 | i == 47) wert2 = 8;
    	outportb(0x378,wert2);
    	}
    
    for(k=0;k<=kmerk;k++)
    	{
    	if(schalter == 0)
    		{
    		delay(100);
    		if(k==0 || k == 4 || k == 8 || k == 12 || k == 16 || k == 20 || k == 24) wert = 0;
    		if(k==1 || k == 5 || k == 9 || k == 13 || k == 17 || k == 21) wert = 1;
    		if(k==2 || k == 6 || k == 10 || k == 14 || k == 18 || k == 22) wert = 3;
    		if(k==3 || k == 7 || k == 11 || k == 15 || k == 19 || k == 23) wert = 2;
    		}
    	else if(schalter == 1)
    		{
    		delay(100);
    		if(k==0 || k == 4 || k == 8 || k == 12 || k == 16 || k == 20 || k == 24) wert = 2;
    		if(k==1 || k == 5 || k == 9 || k == 13 || k == 17 || k == 21) wert = 3;
    		if(k==2 || k == 6 || k == 10 || k == 14 || k == 18 || k == 22) wert = 1;
    		if(k==3 || k == 7 || k == 11 || k == 15 || k == 19 || k == 23) wert = 0;
    		}
    	outportb(0x378,wert);
    	}
    }
    
    int maske(void)
    {
    int eingabe = 0;
    clrscr();
    gotoxy(12,5);
    printf("Wilkommen beim UBAR-1337 Sonnenfinder !!!!1111einself\n\n");
    printf("Scan starten (1)\n");
    printf("Programm beenden (0)\n");
    scanf("%d",&eingabe);
    if(eingabe == 1) scan();
    else printf("\nDanke fr die Benutzung des Programms!");
    delay(5000);
    return eingabe;
    }
    
    void main(void)
    {
    int moo = 0;
    do
    	{
    	moo = maske();
    	}
    while(moo != 0);
    }
    

    ich weiss das ich die graphics.h brauche umd den grafiktreiber zu laden etc. hab aber keinerlei ahnung wie ich das anstellen muss.

    Edit by AJ: CPP-Tags eingefügt (liest sich besser ;))



  • Wenn du Turbo C++ von Borland benutzt kann ich dir weiterhelfen!

    Da musst du nämlich unter irgendeinem Menüpunkt noch die Graphic Libraries einbinden und mit graphics.h geht dann alles!



  • Borland C++ 3.0

    ist das was wir in der ausbildung benutzen und was ich mir zu hause installiert habe.



  • Wie schon gesagt, wird zum Pixeln die graphics.h benötigt (zumindest beim Borland Compiler). Hat aber somit eigentlich nichts mehr mit ANSI-C zu tun.

    Tipp:
    Deine if-Konstruktionen kannst du ganz einfach kürzen:

    ...
    switch(k % 4)
    {
       case 0:
          wert = 0;
          break;
       case 1:
          wert = 1;
          break;
       case 2:
          wert = 3;
          break;
       case 3:
          wert = 2;
          break;
    }
    ...
    

    Die restlichen ifs kannst du sicher selber nach dem Schema ersetzen 😉



  • Dieser Thread wurde von Moderator/in AJ aus dem Forum ANSI C in das Forum DOS und Win32-Konsole verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ich hab jetzt weiter mit graphics.h rummgespielt und versucht in einem 16x16 feld aus 2x2 großen pixeln alle farben auszugeben. allerdings sehe ich nur schwarz. weiss wer rat?

    hier mal das prog:

    #include <stdio.h>
    #include <graphics.h>
    #include <stdlib.h>
    #include <dos.h>
    #include <conio.h>
    
    int set_graph(void)
    {
      int graphdriver = DETECT, graphmode, error_code;
      int i = 0, x = 1, y = 1;
    
      graphmode = 0;
      graphdriver = 6;
    
      initgraph(&graphdriver, &graphmode, "IBM8514.BGI");
      error_code = graphresult();
    
      if(error_code != grOk) return(-1);
    
      if(graphdriver != IBM8514)
        {
        closegraph();
        return(0);
        }
    
      for(i=0;i<255;i++)
        {
        putpixel(x,y,i);
        putpixel(x+1,y,i);
        putpixel(x,y+1,i);
        putpixel(x+1,y+1,i);
    
        if(x % 16 == 0)
          {
          x=1;y+=2;
          }
        x+=2;
        }
    
      gotoxy(1,20); printf("test\n"); delay(5000); clrscr();
    
      return(1);
    }
    
    void main(void)
    {
    clrscr();
    if(set_graph() != 1)
      {
      printf("Konnte IBM8514 640x480 256 Farben nicht initialisieren!");
      }
    else printf("IBM8514 640x480 256 Farben wurde erfolgreich initialisiert!");
    do{}while(!kbhit());
    }
    

    Edit by AJ: CPP-Tags (C/C++) eingefügt (bitte nächtes mal selber machen; gleich unter den Smileys ;))



  • Warum machst du nach deiner Pixelausgabe nicht einfach ein getch()?
    Du solltest übrigens am Ende der Funktion wieder ein closegraph() machen und noch viel besser wärs, bevor du wieder im Textmodus (printf()) schreibst.



  • man kanns auch ohne library machen wenn man die graphikkarte über irgendwelche assembler befehle in den VESA mode packt. so machens auf jeden fall die qbasic programmieren wenn si mehr als mode13h haben wollen. soll dann aber sehr schwierig sein pixel zu putten. ich würd aber auf jeden fall mal nach VESA googeln


Anmelden zum Antworten