Linie zeichnen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Linie zeichnen

Beitrag von bobobo »

gdi+ ist geil :D , aber leider nur unter windows .. :cry:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Linie zeichnen

Beitrag 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... ;)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Linie zeichnen

Beitrag 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?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Linie zeichnen

Beitrag 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
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Linie zeichnen

Beitrag 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".
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Linie zeichnen

Beitrag 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. ;)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Linie zeichnen

Beitrag 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 ?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten