DEUTSCHE VERSION |
|
Links | | | Forums | | | Comments | | | Report news |
Chat | | | Polls | | | Newsticker | | | Archive |
amiga-news.de Forum > Programmierung > CGX: Linien? | [ - Search - New posts - Register - Login - ] |
-1- | [ - Post reply - ] |
2004-03-17, 00:24 h Ralf27 Posts: 2779 User |
WriteRGBPixel haben wir schon bearbeitet, aber wie schaut es mit Linien aus? Man kann zwar wunderschön mit denn Funktionen von Graphics Linien auf dem CGX-Display zeichnen, aber wie mach ich das mit Linien Systemkonform? Bzw. wenn ich mit einer bestimmten Farben zeichnen möchte? Hab heute schon wieder ( ) ein altes Programm (Feldliniengenerator) umgeschrieben und wollte es eigentlich zum Download stellen, aber diese "Kleinigkeit" sollte vorher geklärt werden. PS: Hey, ihr habt mich mit dem C schon so weit gebracht das ich jetzt auch schon in MBasic mit INCLUDES anfange. -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2004-03-17, 01:29 h dante Posts: 111 User |
Move und Draw aus der graphics.library sind deine Freunde [ - Answer - Quote - Direct link - ] |
2004-03-17, 08:27 h Ralf27 Posts: 2779 User |
Zitat: Also kann ich diese auch "normal" benutzen für CGX. Wie schaut es aber aus mit dem Farben setzen für CGX? -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2004-03-17, 08:54 h thomas Posts: 7718 User |
Ich dachte, das hätten wir dir schon in dem anderen Thread deutlich gemacht: Du solltest nach Möglichkeit *nur* die Funktionen der graphics.library benutzen, nur wenn es sich gar nicht vermeiden läßt, auch die cgx-lib. Für normale Anwendungen reicht die graphics.lib vollkommen aus. Und WritePixel / WriteRGBPixel sind sicher keine geeigneten Funktionen, egal, was man macht. Das wurde auch schon besprochen. Farben setzen geht genauso wie bei AGA: mit ObtainPen oder ObtainBestPen einen Stift auswählen, ggf. mit SetRGB32 dem Stift eine Farbe geben und dann mit Move und Draw oder den Area-Funktionen zeichnen. Bei <= 8 bit-Screens wird mit SetRGB32 der Paletten-Eintrag überschrieben, d.h. du mußt für jede Farbe einen anderen Pen auswählen, sonst ändert sich auch die Farbe von Sachen, die du schon gezeichnet hast. Bei 16- und 24bit-Screens kannst du immer den selben Pen benutzen. Ein Beispiel (in C) findest du hier: http://home.t-online.de/home/thomas-rapp/download/truecolors.lha Du solltest es einmal auf einem 8bit-Screen und einmal auf einem 16bit-Screen ausprobieren, um den unterschiedlichen Effekt zu erkennen. Gruß Thomas -- Email: thomas-rapp@web.de Home: home.t-online.de/home/thomas-rapp/ [ - Answer - Quote - Direct link - ] |
2004-03-17, 09:45 h chkamiga Posts: [Former member] |
Schau mal rein in Basic: SetAPen rp&,dgrau& junk=SetOutlinePen&(rp&,dgrau&) Rectfill rp&,1+x,10+y,14+x,33+y move rp&,2+x,9+y:draw rp&,13+x,9+y move rp&,2+x,34+y:draw rp&,13+x,34+y Rectfill rp&,3+x,6+y,5+x,8+y bla=WritePixel&(rp&,4+x,5+y) SetAPen rp&, color4& move rp&,4+x,21+y:draw rp&,5+x,21+y move rp&,7+x,21+y:draw rp&,8+x,21+y move rp&,10+x,21+y:draw rp&,11+x,21+y move rp&,3+x,23+y:draw rp&,4+x,23+y move rp&,6+x,23+y:draw rp&,9+x,23+y move rp&,11+x,23+y:draw rp&,12+x,23+y move rp&,4+x,25+y:draw rp&,11+x,25+y move rp&,4+x,27+y:draw rp&,11+x,27+y move rp&,4+x,29+y:draw rp&,11+x,29+y move rp&,4+x,31+y:draw rp&,11+x,31+y SetAPen rp&,dgrau& move rp&,6+x,25+y:draw rp&,6+x,31+y move rp&,9+x,25+y:draw rp&,9+x,31+y SetAPen rp&,gruen& junk=SetOutlinePen&(rp&,gruen&) Rectfill rp&,2+x,13+y,13+x,19+y bla=WritePixel&(rp&,12+x,22+y) SetAPen rp&,rot& bla=WritePixel&(rp&,12+x,10+y) bla=WritePixel&(rp&,3+x,22+y) SetAPen rp&,1 move rp&,7+x,11+y:draw rp&,8+x,11+y bla=WritePixel&(rp&,4+x,14+y) bla=WritePixel&(rp&,3+x,15+y) bla=WritePixel&(rp&,4+x,16+y) bla=WritePixel&(rp&,3+x,17+y) move rp&,6+x,14+y:draw rp&,6+x,17+y move rp&,7+x,15+y:draw rp&,8+x,15+y move rp&,9+x,14+y:draw rp&,9+x,17+y bla=WritePixel&(rp&,12+x,14+y) bla=WritePixel&(rp&,11+x,15+y) bla=WritePixel&(rp&,12+x,16+y) bla=WritePixel&(rp&,11+x,17+y) Hilft dir vielleicht und ist Grafikkartenkompatibel. -- http://people.freenet.de/CHRAmiga.de CHRKUM@web.de [ - Edit - Answer - Quote - Direct link - ] |
2004-03-17, 16:35 h Mad_Dog Posts: 1944 User |
Zitat: Genau. Aber Ralf27 kann auch ruhig noch 10 mal fragen, ohne daß ich sauer werde. Und hier noch ein komplettes (wenn auch uraltes) Beispiel von mir für das Zeichnen von Linien: http://us.aminet.net/dev/src/intuiflake.lha -- http://www.norman-interactive.com [ - Answer - Quote - Direct link - ] |
2004-03-17, 20:14 h Ralf27 Posts: 2779 User |
Zitat: Äh, wenn ich ehrlich bin weiß ich nicht was ich damit anfangen soll. Ich weiß schon was jede einzelne Zeile macht. Meine Frage war in diesem Thread wie ich am besten Systemkonform einzelne Stifte (nicht Stiftnummer, sondern RGB) auswähle und setze. SetAPen ist mir schon klar. Ich wollte nur wissen wie man es am besten Systemkonform für Grafikkarten progt. Und genauergetippt ist genau das was ich suche da nicht vorhanden wie z.b. ObtainPen& oder ObtainBestPenA. Hast Du da Beispiele für diese Befehle? Das sind die interesanten für mein Problem. [ Dieser Beitrag wurde von Ralf27 am 17.03.2004 editiert. ] [ - Answer - Quote - Direct link - ] |
2004-03-17, 20:16 h Ralf27 Posts: 2779 User |
Zitat: Ne, es würde für mich nicht deutlich, deswegen nochmal diese Frage hier. Das man einzelne Punkte nicht setzen sollte via Write(RGB)Pixel sondern via Array ist mir schon klar. Die Frage hier bezieht sich auf das Linien ziehen. -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2004-03-17, 20:55 h Holger Posts: 8116 User |
Zitat:Die Philosopie von Cybergraphics zumindest zu Begin war, keine Funktion zur Verfügung zu stellen, die man mit der originalen graphics.lib auch hinbekommt. Deshalb gibt es zu der Vorgehensweise: (alles original gfx) keine Alternative in cgx. Wenn Du jetzt meinst, daß man damit eigentlich nicht die volle Funktionalität einer Grafikkarte nutzen kann, hast Du recht. Hilft aber auch nichts mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2004-03-17, 22:38 h Ralf27 Posts: 2779 User |
Ok, ObtainPen ist das Zauberwort für mein Problem. Aber leider habe ich mit diesem Befehl ein Problem: Ich weiß nicht, irgendwie stürz der Rechner immer ab wenn ich diesen Befehl benutze. Leider weiß ich noch nicht mal wie ich diesen Befehl am besten fütter. Bis jetzt hab ich es testweise so gemacht: Stiftummer=ObtainPen(ColorMap,-1,255,255,255,PEN_NO_SETCOLOR) Ich will halt testweiße Weiß haben. Ich hoffe doch das RGB von 0-255 geht, oder? -1 = keine Liste von Pens die reserviert sind (sehe ich richtig so, oder? ) PS: (schreib ich sicherheitshalber gleich nochmal hin, sicher ist sicher. ) 1. ich kann kaum englisch 2. ich hab die SDK für os3.9, aber da leider Punkt 1 hier zieht...:angry: -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2004-03-18, 00:14 h Mad_Dog Posts: 1944 User |
Zitat: Ich hab Dir aber auch geschrieben, daß Du die Grafikprimitiven (also Punkte, Linien, Polygone) unter CGX genauso benutzen kannst (bzw. sollst) wie üblich. -- http://www.norman-interactive.com [ - Answer - Quote - Direct link - ] |
2004-03-18, 06:50 h Ralf27 Posts: 2779 User |
Wie nutze ich am besten ObtainPen? (Problem siehe oben) Ich hab da zwar schon eine Problemlösung, aber das wäre wieder ein Hack um ObtainPen zu umschreiben. Dürfte auch auf Grafikkarten laufen, aber dann wohl nur auf den unteren 8 Bit. -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2004-03-18, 10:04 h chkamiga Posts: [Former member] |
Kein Problem: LIBRARY "graphics.library" DECLARE FUNCTION ObtainBestPenA& LIBRARY 'cm&, r&, g&, b&, tags& DECLARE SUB ReleasePen LIBRARY 'cm&, ExtendedNoden& DIM tags&(10) sWindow& = WINDOW(7) sScreen& = PEEKL(sWindow& + 46) sViewPort& = sScreen& + 44 cm& = PEEKL(sViewPort& + 4) r&=255 g&=255 b&=0 IF r&<128 THEN rr&=r&*16843009 ELSE rr&=(r&-255)*16843009-1 IF g&<128 THEN gg&=g&*16843009 ELSE gg&=(g&-255)*16843009-1 IF b&<128 THEN bb&=b&*16843009 ELSE bb&=(b&-255)*16843009-1 TAGLIST VARPTR(tags&(0)), _ OBP_Precision&, PRECISION_GUI&, _ OBP_FailIfBad&, FALSE&, _ TAG_DONE& bp&=ObtainBestPenA&(cm&,rr&,gg&,bb&,VARPTR(tags&(0))) COLOR bp&:PRINT"bestpen=";bp& ReleasePen cm&,bp& -- http://people.freenet.de/CHRAmiga.de CHRKUM@web.de [ - Edit - Answer - Quote - Direct link - ] |
2004-03-18, 11:52 h Ralf27 Posts: 2779 User |
Zitat: Hm, ich weiß jetzt nicht wie Du auf die Farbumrechnungsberechnung kommst, aber es geht. Ich hab übrigens am Anfang die drei Zeilen raus gelassen und hab folgendes dafür eingebaut: rem $include graphics.bh LIBRARY OPEN "graphics" Sonst geht es ja nicht mit den Konstanten, die da unten im Programm benutzt werden. Und für was ist denn dann RelaisPen da? So, Mittag ist rum, muß wieder an die Arbeit. [ Dieser Beitrag wurde von Ralf27 am 18.03.2004 editiert. ] [ - Answer - Quote - Direct link - ] |
2004-03-18, 12:36 h thomas Posts: 7718 User |
Zitat: Die Farben müssen in 32bit und nicht 8bit angegeben werden. Gruß Thomas -- Email: thomas-rapp@web.de Home: home.t-online.de/home/thomas-rapp/ [ - Answer - Quote - Direct link - ] |
2004-03-18, 17:07 h chkamiga Posts: [Former member] |
Genau und da Maxonbasic Variablen mit Vorzeichen behaftet muss das so komisch umgerechnet werden. Das wurde mir auch hier im Forum gesagt. >Ich hab übrigens am Anfang die drei Zeilen raus gelassen und hab folgendes dafür eingebaut: >rem $include graphics.bh >LIBRARY OPEN "graphics" Kann man auch machen, er declariert denn aber alles und das Programm wird größer. >Sonst geht es ja nicht mit den Konstanten, die da unten im Programm benutzt werden. Das Programm ist eigenständig und müsste ohne Veränderung laufen! >Und für was ist denn dann RelaisPen da? Keine Ahnung. -- http://people.freenet.de/CHRAmiga.de CHRKUM@web.de [ - Edit - Answer - Quote - Direct link - ] |
2004-03-18, 18:55 h thomas Posts: 7718 User |
Zitat: ReleasePen gibt den angeforderten Stift wieder frei. Wenn du das nicht machst, sind irgendwann alle Stifte belegt und kein Programm kann mehr zeichnen. Bei Stiften, die mit ObtainBestPen angefordert wurden, darf man die Farbe nicht ändern, denn diese Stifte werden von mehreren Programmen gleichzeitig benutzt. Wenn du einen Pen möchtest, der nur deinem Programm gehört, dann mußt du ObtainPen mit PEN_EXCLUSIVE nehmen. Gruß Thomas -- Email: thomas-rapp@web.de Home: home.t-online.de/home/thomas-rapp/ [ - Answer - Quote - Direct link - ] |
2004-03-18, 20:47 h Ralf27 Posts: 2779 User |
Zitat: Moment, ich dachte 3*8 Bit, das heißt pro Farbe 8 Bit. Aber das Programm braucht 3*32 Bit? Pro Farbe 32 Bit??? -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2004-03-18, 20:50 h Ralf27 Posts: 2779 User |
Zitat:Da hätte ich lange versuchen können. Darauf wäre ich nicht gekommen. Zitat:Sicher? Da werden doch nur Konstanten deklariert und alle die nicht gebraucht werden werden ja auch nicht mit ins Programm eingebunden (denke ich mir mal, hab es noch nie versucht). Aber das müßte dann ja auch so bei C-Programmen sein. Ich werde das aber auch mal testen. Zitat:Laufen ja, aber was ist mit den Konstanten die nicht deklariert sind? Die wären alle auf 0. Insofern also nicht richtig. -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2004-03-18, 21:55 h Ralf27 Posts: 2779 User |
Hm, schön und gut. Unter AGA läuft es, unter CGX liefert es immer nur ein und denn gleichen Wert: 104. ??? Die Stifte die ich jetzt bekommen darf ich nicht ändern, oder? Wieso bekomme ich bei drei total unterschiedlichen Farbvorgaben(255,0,0 - 0,255,0 - 0,0,255) denn gleichen Stift unter CGX und bei AGA gehts? -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2004-03-18, 22:35 h Ralf27 Posts: 2779 User |
Problem hat sich gelöst, danke! -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2004-03-19, 21:59 h Holger Posts: 8116 User |
Zitat:Richtig. Wenn Du den Stift auch ändern willst, mußt Du ObtainPen statt ObtainBestPen benutzen und das Flag PEN_EXCLUSIVE angeben. Dann darfst Du ihn auch ändern. Trotzdem muß er hinterher mit ReleasePen wieder freigegeben werden. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2004-03-21, 04:47 h Mad_Dog Posts: 1944 User |
Ich konnt's mit irgendwie nicht verkneifen und hab für Ralf27 eine Intuition-Version meines OpenGL-Programms "Rainbow Spectrum 2" gemacht (da er mit OpenGL ja noch nicht klarkommt). Irgendwie sieht's noch nicht ganz wie das OpenGL-Original aus... aber egal, hier kommt's:code:--/* Intui_Spectrum * Autor: Norman Walter */ #include <exec/types.h> #include <exec/exec.h> #include <intuition/intuition.h> #include <graphics/gfx.h> #include <dos/dos.h> #include <stdlib.h> #include <math.h> #include <proto/intuition.h> #include <proto/graphics.h> #include <proto/dos.h> #include <proto/exec.h> // Symbolische Konstanten #define WIDTH 300 // Breite des Fensters #define HEIGHT 300 // Höhe des Fensters #define FACTOR 0x7FE00000 struct Window *Fenster; // Zeiger auf Window-Struktur struct IntuiMessage *message; // Zeiger auf IntuiMessage-Struktur struct Library *IntBase; // Zeiger auf Library-Struktur struct Library *MyGfxBase; // Zeiger auf Library-Struktur struct RastPort *rp; // Zeiger auf RastPort-Struktur // Die verschiedenen Pens LONG red_pen,green_pen,blue_pen,white_pen,rb_pen; // Struktur für Kurvenparameter struct curve_parameters { double center; double amplitude; double sigma; }; struct curve_parameters red_curve = {650.0,2.0,70.0}; struct curve_parameters green_curve = {550.0,1.5,65.0}; struct curve_parameters blue_curve = {450.0,0.75,60.0}; // Funktionsprototypen double gauss(double x, double center, double height, double sigma); int main(void) { double wavelength; // in nanometer int x; double red,green,blue,brightness; // Intuition Library öffnen IntBase = (OpenLibrary("intuition.library",0L)); if (IntBase != NULL) { // Graphics Library öffnen MyGfxBase = (OpenLibrary("graphics.library",0L)); // Fenster mittels Tags öffnen Fenster = OpenWindowTags(NULL, WA_Left, 100, // Abstand vom linken Rand WA_Top, 100, // Abstand vom oberen Rand WA_Width, WIDTH, // Breite WA_Height, HEIGHT, // Höhe WA_Title, "Intui Spectrum", // Fenstertitel WA_ScreenTitle, "Intui Spectrum", // Screen-Titel WA_CloseGadget, TRUE, // Close-Gadget WA_DragBar, TRUE, // Ziehleiste WA_DepthGadget, TRUE, // Depth-Gadget WA_GimmeZeroZero, TRUE, // Ursprung 0/0 WA_IDCMP, IDCMP_CLOSEWINDOW, WA_Activate, TRUE, // Fenster aktivieren TAG_DONE); if (Fenster != NULL) { rp = Fenster->RPort; red_pen = ObtainBestPen(Fenster->WScreen->ViewPort.ColorMap, 0xFFFFFFFF,0x00000000,0x00000000, TAG_DONE); green_pen = ObtainBestPen(Fenster->WScreen->ViewPort.ColorMap, 0x00000000,0xFFFFFFFF,0x00000000, TAG_DONE); blue_pen = ObtainBestPen(Fenster->WScreen->ViewPort.ColorMap, 0x00000000,0x00000000,0xFFFFFFFF, TAG_DONE); white_pen = ObtainBestPen(Fenster->WScreen->ViewPort.ColorMap, 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, TAG_DONE); SetRast(rp, 1L); // Fensterinhalt löschen /* Durch das Farbspektrum iterieren: * Wir fangen bei 400nm an und gehen bis 700nm. */ for (x=0; x < 300; x++) { wavelength = (double)(x+401); // Wellenlänge /* Die Farbkomponenten zur aktuellen Wellenlänge * lassen sich näherungsweise durch die Gauss'sche * Fehlverteilungskurve berechnen. */ red = gauss(wavelength, red_curve.center, red_curve.amplitude, red_curve.sigma); green = gauss(wavelength, green_curve.center, green_curve.amplitude, green_curve.sigma); blue = gauss(wavelength, blue_curve.center, blue_curve.amplitude, blue_curve.sigma); brightness = red + green + blue; // Passenden Pen finden rb_pen = ObtainBestPen(Fenster->WScreen->ViewPort.ColorMap, (ULONG)(red*FACTOR) << 1L, (ULONG)(green*FACTOR) << 1L, (ULONG)(blue*FACTOR) << 1L, OBP_Precision, PRECISION_IMAGE, OBP_FailIfBad, FALSE, TAG_DONE, NULL); // Spektrallinien zeichnen SetAPen(rp,rb_pen); // Farbe setzen Move(rp,x,0); Draw(rp,x,20); // Die Kurven für Rot, Grün und Blau zeichnen SetAPen(rp,red_pen); WritePixel (rp,x,HEIGHT-(int)(100.0*red)); SetAPen(rp,green_pen); WritePixel (rp,x,HEIGHT-(int)(100.0*green)); SetAPen(rp,blue_pen); WritePixel (rp,x,HEIGHT-(int)(100.0*blue)); SetAPen(rp,white_pen); WritePixel (rp,x,HEIGHT-(int)(100.0*brightness)); } // Auf Close-Gadget warten Wait(1L << Fenster->UserPort->mp_SigBit); CloseWindow(Fenster); // Fenster schließen } // end if } // end if // Libraries schließen if (MyGfxBase != NULL) CloseLibrary(MyGfxBase); if (IntBase != NULL) CloseLibrary(IntBase); return 0; } /* Gauss'sche Fehlverteilungskurve */ double gauss(double x, double center, double height, double sigma) { return height * exp(- (x - center) * (x - center) / (2.0 * sigma * sigma)); } http://www.norman-interactive.com [ Dieser Beitrag wurde von Mad_Dog am 21.03.2004 editiert. ] [ - Answer - Quote - Direct link - ] |
2004-03-25, 18:02 h Holger Posts: 8116 User |
Aber Du würdest in einer richtigen Anwendung die pens auch wieder freigeben, oder?:glow: mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2004-03-26, 16:50 h Mad_Dog Posts: 1944 User |
Zitat: Uuups... Du hast natürlich recht. Das hatte ich ganz vergessen. Peinlich! Korrektur: code:// Passenden Pen finden rb_pen = ObtainBestPen(Fenster->WScreen->ViewPort.ColorMap, (ULONG)(red*FACTOR) << 1L, (ULONG)(green*FACTOR) << 1L, (ULONG)(blue*FACTOR) << 1L, OBP_Precision, PRECISION_EXACT, OBP_FailIfBad, FALSE, TAG_DONE, NULL); // Spektrallinien zeichnen SetAPen(rp,rb_pen); // Farbe setzen Move(rp,x,0); Draw(rp,x,20); ReleasePen(Fenster->WScreen->ViewPort.ColorMap,rb_pen); // Die Kurven für Rot, Grün und Blau zeichnen SetAPen(rp,red_pen); WritePixel (rp,x,HEIGHT-(int)(100.0*red)); SetAPen(rp,green_pen); WritePixel (rp,x,HEIGHT-(int)(100.0*green)); SetAPen(rp,blue_pen); WritePixel (rp,x,HEIGHT-(int)(100.0*blue)); SetAPen(rp,white_pen); WritePixel (rp,x,HEIGHT-(int)(100.0*brightness)); } // Auf Close-Gadget warten Wait(1L << Fenster->UserPort->mp_SigBit); ReleasePen(Fenster->WScreen->ViewPort.ColorMap,red_pen); ReleasePen(Fenster->WScreen->ViewPort.ColorMap,green_pen); ReleasePen(Fenster->WScreen->ViewPort.ColorMap,blue_pen); ReleasePen(Fenster->WScreen->ViewPort.ColorMap,white_pen); CloseWindow(Fenster); // Fenster schließen Mit PRECISION_EXACT sieht's noch besser als mit PRECISION_IMAGE aus. Bild: http://w3studi.informatik.uni-stuttgart.de/~walternn/Intui_Spectrum.png -- http://www.norman-interactive.com [ Dieser Beitrag wurde von Mad_Dog am 26.03.2004 editiert. ] [ - Answer - Quote - Direct link - ] |
-1- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > CGX: Linien? | [ - Search - New posts - Register - Login - ] |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved. |