amiga-news 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 ( :D ) 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:
Original von dante:
Move und Draw aus der graphics.library sind deine Freunde :)



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:
Original von thomas:

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.


Genau. :D

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:
Original von chkamiga:
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



Ä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:
Original von Mad_Dog:
Zitat:
Original von thomas:

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.


Genau. :D

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


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:
Original von Ralf27:
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.

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:
  • ObtainPen
  • SetAPen
  • Draw
    (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 X(

    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. :D 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:
    Original von Ralf27:

    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.


    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:
    Original von chkamiga:
    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


    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:
    ich weiß jetzt nicht wie Du auf die Farbumrechnungsberechnung kommst

    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:
    Und für was ist denn dann RelaisPen da?

    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:
    Original von thomas:
    Zitat:
    ich weiß jetzt nicht wie Du auf die Farbumrechnungsberechnung kommst

    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/


    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:
    Original von chkamiga:
    Genau und da Maxonbasic Variablen mit Vorzeichen
    behaftet muss das so komisch umgerechnet werden.
    Das wurde mir auch hier im Forum gesagt.

    Da hätte ich lange versuchen können. Darauf wäre ich nicht gekommen. :)
    Zitat:
    >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.

    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:
    >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!

    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? 8o
    --
    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! 8)
    --
    http://www.alternativercomputerclub.de.vu

    [ - Answer - Quote - Direct link - ]

    2004-03-19, 21:59 h

    Holger
    Posts: 8116
    User
    Zitat:
    Original von Ralf27:
    Die Stifte die ich jetzt bekommen darf ich nicht ändern, oder?

    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:
    Original von Holger:
    Aber Du würdest in einer richtigen Anwendung die pens auch wieder freigeben, oder?:glow:


    Uuups... Du hast natürlich recht. Das hatte ich ganz vergessen. Peinlich! :glow:

    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. :D

    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.
    .