Seite 4 von 4

Re: Linie zeichnen

Verfasst: 06.07.2011 17:38
von bobobo
gdi+ ist geil :D , aber leider nur unter windows .. :cry:

Re: Linie zeichnen

Verfasst: 06.07.2011 20:03
von Danilo
PureLust hat geschrieben:@Danilo: Sehr geil !!! :allright:

Hättest Du das nicht mal 3 Wochen früher posten können?
Dann hätte ich mir meine eigene Drawing-Lib und das Einarbeiten in die GDI-Funktionen sparen können. >_< . . . :mrgreen:

Kleine Anmerkung hätte ich aber noch:
Code von Danilo hat geschrieben:;-[ antialiased PB compatible drawing functions using GDI+ ]-
Deine GDI+ Funktionen sind zwar in der Syntax kompatibel zu den PB-Derivaten - bei der erzeugten Grafik besteht zu der durch PB-Befehle erstellten Gafik jedoch ein Unterschied.

So wird z.B. bei dem Line-Befehl von GDI und auch GDI+ keine Linie (Punkt) gezeichnet, wenn der Start- und der Endpunkt identisch sind.
gLineXY(10,10,10,10,Color) zeichnet also kein Punkt, das "Original" von PB jedoch schon (musste ich bei meiner Lib auch erst abfangen - hatte das gleiche Problem).
Auch zeichnen die PB-Befehle bei Line() keine Linie, wenn Breite oder Höhe = 0 sind - die GDI und GDI+ Befehle jedoch schon.

Weiterhin entstehen durch den bei gStartDrawing() voreingestellten PixelOffsetMode (#PixelOffsetModeHighQuality) fast immer Pixelabweichungen von 1 Pixel zu den PB-Befehlen.
Hier würde eine Voreinstellung von '#PixelOffsetModeNone' dem "Original" eher entsprechen.

Um den PixelOffsetMode nach Bedarf anpassen zu können wäre ja vielleicht noch eine entsprechende Funktion sinnvoll:

Code: Alles auswählen

Procedure gPixelOffsetMode( newMode.l)
    If __graphics
        GdipSetPixelOffsetMode_(__graphics,newMode)
    EndIf
EndProcedure
Aber ansonsten eine seeeeehr geile Lib !!!

Und da (wie ich jetzt sehe) GDI+ scheinbar einiges mehr an Möglichkeiten bietet als GDI (auch wenn GDI um einiges schneller ist als GDI+), werde ich jetzt wohl auch auf Deine Routinen (oder zumindest auf GDI+) umschwenken. ;)

BIG Thanks for sharing and inspiration !!! :allright:
STARGÅTE hat geschrieben:Ich frage mich aber, wieso alle Positionen/Größen in LONG sind ?
ich meine wenn Antialiasing enthalten ist, sollte es noch möglich sein, auch Linien "dazwischen" zu zeichen, die dann geglättet werden.

Und vorallem bei Linienstärken wäre FLOATs sehr von nöten, denn zwischen 1 und 2 liegen "welten"
Danke für das Lob und diese Hinweise! :)

Ich habe mir das vor ca. 2 Wochen als PB-Lib mit C++ angefangen, als Unterteil
einer anderen Lib, die bessere Zeichenfunktionen braucht als die PB-Befehle.
Hatte dabei nicht vor das auch noch nach PB zu übersetzen. Mit C++ gehts für
mich einfach schneller, da ich dann nicht immer alle Konstanten und Funktionen
in PB deklarieren muß, was einfach nur unnötige Zeit raubt.
Nachdem mir das fehlende AA aber nun schon öfters negativ aufgefallen ist,
z.B. auch bei ts-softs schönem ButtonMaker, habe ich heute früh schnell mal
den obigen Code mit PB gemacht.

Da scheinbar weiteres Interesse besteht, könnt ich mir vorstellen da noch bissl
was dran zu machen. Da ich aber ursprünglich keine Zeit mehr in PB investieren
wollte, wäre es zumindest nett wenn jemand mit helfen kann oder das vielleicht
übernimmt und ausbaut.

Die Angesprochenen Probleme sollten alle zu lösen sein. Auch kann man es leicht
komplett auf Float umstellen, da es alle verwendeten GDI+ Funktionen immer
als Integer- und Real-Version gibt, zum Beispiel:

Code: Alles auswählen

GdipDrawLine (GpGraphics *graphics, GpPen *pen, REAL x1, REAL y1, REAL x2, REAL y2);
GdipDrawLineI(GpGraphics *graphics, GpPen *pen, INT  x1, INT  y1, INT  x2, INT  y2);
Mal schauen, vielleicht setze ich mich nach der Arbeit morgen früh nochmal dran...
bobobo hat geschrieben:gdi+ ist geil :D , aber leider nur unter windows .. :cry:
Es gibt auf anderen Platformen doch auch bessere Grafikbibliotheken mit AA etc.
Weiß jetzt nicht mehr wie das Zeug da hieß, aber Gimp und verschiedene GUI-Bibliotheken
zeichnen doch auch nicht mehr so pixelig wie vor 15 Jahren. Muß nur mal jemand machen... ;)

Re: Linie zeichnen

Verfasst: 06.07.2011 21:00
von STARGÅTE
Auch kann man es leicht
komplett auf Float umstellen, da es alle verwendeten GDI+ Funktionen immer
als Integer- und Real-Version gibt, zum Beispiel:
Ah danke, hatte es mit GdipDrawLineF probiert ^^
Da scheinbar weiteres Interesse besteht, könnt ich mir vorstellen da noch bissl
was dran zu machen. Da ich aber ursprünglich keine Zeit mehr in PB investieren
wollte, wäre es zumindest nett wenn jemand mit helfen kann oder das vielleicht
übernimmt und ausbaut.
Interesse besteht sehr wohl.
Ich werde mich mal etwas näher mit deinem Beispiel befassen und etas PB-Like machen.
Also statt des Parameters PenWidth lieber n Funktion:
DrawingThickness() usw.

Auch noch n Frage: kann ich davon ausgehen, das diese DLL überall vorhabden ist (Windows) oder müsste man sie ggf mitliefern?

Re: Linie zeichnen

Verfasst: 07.07.2011 10:45
von Danilo
PureLust hat geschrieben:Weiterhin entstehen durch den bei gStartDrawing() voreingestellten PixelOffsetMode (#PixelOffsetModeHighQuality) fast immer Pixelabweichungen von 1 Pixel zu den PB-Befehlen.
Hier würde eine Voreinstellung von '#PixelOffsetModeNone' dem "Original" eher entsprechen.

Um den PixelOffsetMode nach Bedarf anpassen zu können wäre ja vielleicht noch eine entsprechende Funktion sinnvoll:
Geändert.
STARGÅTE hat geschrieben:Ich frage mich aber, wieso alle Positionen/Größen in LONG sind ?
Geändert.
STARGÅTE hat geschrieben:Also statt des Parameters PenWidth lieber n Funktion: DrawingThickness() usw.
Geändert. Es gibt nun gSetPen(color,size), gSetPenColor(color), gSetPenSize(size).
STARGÅTE hat geschrieben:Auch noch n Frage: kann ich davon ausgehen, das diese DLL überall vorhabden ist (Windows) oder müsste man sie ggf mitliefern?
Hier gehts weiter: http://forums.purebasic.com/german/view ... =8&t=24539

Re: Linie zeichnen

Verfasst: 07.07.2011 11:05
von STARGÅTE
Ich möchte das andere Thema nicht zumüllen, deswgeen hier die Frage:

Ich habe nun #PixelOffsetModeHalf eingestellt, damit ich für Vektorgrafiken, bei 0,0 wirklich oben in der Ecke bin und nicht in der mitte des Pixels.
Nun habe ich jedoch immer noch das Problem, dass ich nur ganzzahlige Stiftdicken einstellen kann, welchen Parameter muss ich noch ändern ?

Desweiteren habe ich gelesen, dass es bei GDI+ auch Transformationsbefehle gibt, sodass ich Ellipsen auch drehen kann oder schären kann.
Wäre nett wenn du diese Befehle noch "übersetzt".

Re: Linie zeichnen

Verfasst: 07.07.2011 11:16
von Danilo
STARGÅTE hat geschrieben:Ich habe nun #PixelOffsetModeHalf eingestellt, damit ich für Vektorgrafiken, bei 0,0 wirklich oben in der Ecke bin und nicht in der mitte des Pixels.
Nun habe ich jedoch immer noch das Problem, dass ich nur ganzzahlige Stiftdicken einstellen kann, welchen Parameter muss ich noch ändern ?
Keine Ahnung. :)

Default ist jetzt #PixelOffsetModeNone. Ich habs mit Stiftdicken 0.2, 0.4, 0.6, 0.8 probiert und geht,
ich sehe den Unterschied.
STARGÅTE hat geschrieben:Desweiteren habe ich gelesen, dass es bei GDI+ auch Transformationsbefehle gibt, sodass ich Ellipsen auch drehen kann oder schären kann.
Wäre nett wenn du diese Befehle noch "übersetzt".
Hab ich schon auf dem Plan. Hab auch gDrawText() und gDrawRotatedText() schon in
C++ gemacht, inklusive Outline-Modus dafür. Werd ich noch übersetzen, aber dafür
muß ich mir wieder erst Konstanten und Prototypes zusammensuchen, die ich brauche.

Bitte etwas Geduld. 2 oder 3 Tage. ;)

Re: Linie zeichnen

Verfasst: 07.07.2011 11:30
von STARGÅTE
>> Default ist jetzt #PixelOffsetModeNone.
>> Ich habs mit Stiftdicken 0.2, 0.4, 0.6, 0.8 probiert und geht,
>> ich sehe den Unterschied.

Komisch, ich habs jetzt auch mal mit den Defaultwerten von dir gemacht, und bei mir kommt das hier raus:

Code: Alles auswählen

CreateImage(#Image, 500, 300, 32)
gStartDrawing(ImageOutput(#Image))
  gClear($FFFFFFFF)
  For n = 0 To 20
    gSetPen($FF000000, n/10)
    gLineXY(n*20+20, 110, n*20+20, 190)
  Next	
gStopDrawing()
(von links nach rechts von 0.0 nach 2.0)
Bild
Wie man sieht, kommt erst ab 1.6 zu einer Kantenklättung...

Wenn es bei dir anders aussieht, bitte mal n Screen posten.
Wenn ja, wäre es schlecht, wenn es zB von der Grafikkarte abhängig ist oder so.
Vielleicht hab ich auch nur irgendwas übersehen, aber da es ja ab 1.6 funktioniert, ist es wohl ehr ein Problem in GDI ?

>> Bitte etwas Geduld. 2 oder 3 Tage.
Jo klar, nur kein Zeitdruck ...

Aber noch eine Frage: Wie kann ich die Pfeilgröße bei #LineCapArrowAnchor ändern, also relativ größer zur Linienstärke ?