Line vs LineXY & DrawText Qualität

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Line vs LineXY & DrawText Qualität

Beitrag von STARGÅTE »

Tachchen,

mir ist eben aufgefallen das Line und LineXY nicht mehr die gleichen ergebnisse liefern:

Code: Alles auswählen

OpenWindow(0,0,0,200,100,"")
StartDrawing(WindowOutput(0))
 For y = -3 To 3
  Line(25,y*10+50,50,y)
  LineXY(125,y*10+50,125+50,y*10+50+y)
 Next
StopDrawing()

Repeat

Until WaitWindowEvent() = #PB_Event_CloseWindow 
Mir ist klar, da in der neuen Beta versucht worden ist einen Bug zu beheben, aber ich finde es jetzt sehr schlecht das eine Line mit Höhe oder Breite 0 garnicht mehr dargestellt wird.

Ich dachte mir immer das der Sinn hinter Width und Height bei Line() der ist, das die Linie bei x,y beginnt also den erstenPixel hat, und sich dann Width-Pixel nach Rechts beweg und Hight-Pixel nach unten.
Würde bedeuten das Line(x,y,2,4) eine ausdehung von 3x5 Pixel hat, so wie es auch bei LineXY der fall ist, wenn
LineXY(x,y,x+2,y+4).
Oder bei Circle(x,y,4) wird auch vom Mittleren Pixel ausgegangen und dann 4 nach alle Seiten gegangen, sodass der Kreis eine Ausdehung von 9Pixeln hat.
Stattdessen ist bei Line() nun die Ausdehung gemeint, und dann ist es ja nur logisch eine Linie ohne Höhe nicht darzustellen, was aber irgendwie eine art "definitionslücke" ist

Vorallem bei meinen eigenen Ellipsen und anderen Krumlinigen Sachen wo ich immer lieber statt LineXY ein Line genommen habe, habe ich nun haufenweise fehler (verrückungen und Lücken).

Sollte ich nun lieber auf LineXY umsteigen, damit ich "meine Definition" einer Linie habe, oder sollte ich die Line() Procedure als Macro umschreiben sodass ich noch den 1Pixel dazunehme (egal in welche richtung).

Was wird in der Zukunft noch geändert ?
Zuletzt geändert von STARGÅTE am 31.10.2009 17:58, insgesamt 2-mal geändert.
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Line vs LineXY

Beitrag von Kaeru Gaman »

steig auf LineXY um, das besteht nicht mehr wie früher aus zwei calls.

im Englischen wurde hierüber lang und breit diskutiert, warum und was geändert wurde.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Line vs LineXY

Beitrag von NicTheQuick »

Huch, das kannte ich ja noch gar nicht. Wer ist denn auf die Schnapsidee gekommen?

Ich finde das im englischen Forum irgendwie nicht. Hat jemand den Link grad da? Danke!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Line vs LineXY

Beitrag von Kaeru Gaman »

schon mal beobachtet, wie Höhe und Breite einer Linie definiert sind,
was bei Grafikprgrammen wie z.B. Paint in der Statusleiste angezeigt wird?

hier ist der Link zur Diskussion im Englischen
http://www.purebasic.fr/english/viewtop ... 48#p301948
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Re: Line vs LineXY

Beitrag von #NULL »

>> Wer ist denn auf die Schnapsidee gekommen?
dit wa icke :mrgreen:
kam daher, dass meine gezeichneten gui elemente plötzlich krumme checkbox-kreuzchen hatten. da habe ich mir Line() mal genauer angesehen und diese sachen bemerkt. dabei ging es mir aber in erster linie darum: "..draws lines one pix longer in dimensions if width/height are > 0".
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Line vs LineXY

Beitrag von STARGÅTE »

Es gibt auch n neues Problem mit DrawText und einigen Fonts:

In älteren PB versionen wurde eine Schift immer "gut" dargestellt mit geglätteten Rändern.
in der neuen BEta wird das nicht mehr gemacht, gar ignoriert:

Code: Alles auswählen

CreateImage(0, 256, 256, 32)
  Font1 = LoadFont(#PB_Any, "Times New Roman", 12)
  Font2 = LoadFont(#PB_Any, "Times New Roman", 14)
  Font3 = LoadFont(#PB_Any, "Times New Roman", 12, #PB_Font_HighQuality)
  Font4 = LoadFont(#PB_Any, "Times New Roman", 14, #PB_Font_HighQuality)

StartDrawing(ImageOutput(0))
  DrawingMode(1)
  FillArea(0,0,-1,$FFFFFF)
  DrawingFont(FontID(Font1))
  DrawText(10,10,"2x", $000000)
  DrawingFont(FontID(Font2))
  DrawText(10,60,"2x", $000000)
  DrawingFont(FontID(Font3))
  DrawText(10,110,"2x", $000000)
  DrawingFont(FontID(Font4))
  DrawText(10,160,"2x", $000000)
StopDrawing()

SetClipboardImage(0)

OpenWindow(0, 0, 0, ImageWidth(0), ImageHeight(0), "Fenster", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ImageGadget(0,0,0,ImageWidth(0), ImageHeight(0), ImageID(0))

Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Ergebnis: (links 4.4 b5, rechts PB 4.31)
Bild

Wird das noch korrigiert ? wenn nicht dann müsste ich in zukunft auf API zurückgreifen, weil ich da sagen kann das der Glätten soll.

Außerdem versteh ich nicht was der Flag: #PB_Font_HighQuality überhaupt bewirkt .

PS: vllt wäre auch ein neuer Flag: #PB_Font_ClearType die lösung ...
Zuletzt geändert von STARGÅTE am 09.07.2010 16:02, insgesamt 1-mal geändert.
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
KTX82
Beiträge: 95
Registriert: 31.08.2004 00:11
Wohnort: Mannheim
Kontaktdaten:

Re: Line vs LineXY & DrawText Qualität

Beitrag von KTX82 »

Hi!

bin über die Suche auf dieses Thema gestoßen, weil ich mal wieder damit angefangen hab ein Progrämmchen zu schreiben, allerdings stehe ich nun vor exakt dem gleichen, hässlichen Problem (4.50 Beta 3).
Über ImageGadgets sieht DrawText mit DrawingMode Transparent extrem fürchterlich aus, wie im Bild von Stargate, wenn ich den Hintergrund allerdings mit DrawImage statt ImageGadget erstelle, sieht der Text einwandfrei aus wie es auch sein soll.

Hat da schon jemand eine Lösung, wie Text sauber "über" ein ImageGadget zu bekommen ist?

Die Möglichkeit für jedes ImageGadget das Image doppelt anzulegen - Image1 = Originalhintergrund, Image2 = Mit dem Gadget verknüpfter Hintergrund (Image1 in Image2 kopieren, per Drawing den Text auf das 2. drauf -> Bei einer Änderung wieder Image1 in Image2 kopieren und so weiter) - was mir erst mal in den Sinn kam erscheint mir doch recht absurd um das gewünschte Ergebnis zu bekommen.

Edit: Ach du liebe Zeit - hab ja noch ein ganz verstaubtes Avatar ^^
Pharmacie populaire www.viagrasansordonnancefr.com aide aux malades
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Line vs LineXY & DrawText Qualität

Beitrag von Kaeru Gaman »

ich komm jetzt nicht ganz mit...
was ist falsch daran, ein Hintergrundbild als extra Image zu haben, und es dann auf das Zielimage aufzubringen und danach den Text?

PS:
sorry, was du eben als "absurd" bezeichnest, ist meiner Erfahrung nach die einzig sinnvolle Vorgehensweise...
... außer wir reden grad aneinander vorbei.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Line vs LineXY & DrawText Qualität

Beitrag von STARGÅTE »

Bitte nutze diese Procedure, zum "schöneren" Laden einer Font: (ClearType)

Code: Alles auswählen

 ; Lädt eine Font mit ClearTyp
 Procedure LoadClearTypeFont(Name$, Size.i, Style=0)
  Protected LogFont.LOGFONT 
  With LogFont
   \lfHeight         = -Size
   \lfWidth          = 0
   \lfEscapement     = 0
   \lfOrientation    = 0 
   If Style & #PB_Font_Bold       : \lfWeight = 700 : Else : \lfWeight = 400 : EndIf
   If Style & #PB_Font_Italic     : \lfItalic = #True : Else : \lfItalic = #False : EndIf  
   If Style & #PB_Font_Underline  : \lfUnderline = #True : Else : \lfUnderline = #False : EndIf  
   If Style & #PB_Font_StrikeOut  : \lfStrikeOut = #True : Else : \lfStrikeOut = #False : EndIf  
   \lfCharSet        = #DEFAULT_CHARSET
   \lfOutPrecision   = #OUT_DEFAULT_PRECIS	
   \lfClipPrecision  = #CLIP_DEFAULT_PRECIS 
   \lfQuality        = #CLEARTYPE_QUALITY
   \lfPitchAndFamily = #DEFAULT_PITCH | #FF_DONTCARE 
   PokeS(@\lfFaceName[0], Name$) 
  EndWith
  ProcedureReturn CreateFontIndirect_(@LogFont) 
 EndProcedure
Rückgabewert ist gleich die FontID ...
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
KTX82
Beiträge: 95
Registriert: 31.08.2004 00:11
Wohnort: Mannheim
Kontaktdaten:

Re: Line vs LineXY & DrawText Qualität

Beitrag von KTX82 »

Vielen dank für die Procedure ;o) Werde das gleich mal probieren.

@Kaeru Gaman: Ich habe mir eben nochmal in aller ruhe alle Möglichkeiten und Vorgehensweisen auch bei sich ständig aktualisierenden Text über Hintergrund durchgedacht - und sicher, es war ein blöder Gedanke meinerseits.
Ich glaube so spät sollte ich nicht mehr denken, vor allem da ich etwas aus der Übung bin ^^ Stimme dir natürlich voll und ganz zu. :allright:
Pharmacie populaire www.viagrasansordonnancefr.com aide aux malades
Antworten