Geändertes Verhalten von "Line"?

Anfängerfragen zum Programmieren mit PureBasic.
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Geändertes Verhalten von "Line"?

Beitrag von Sven »

Ich habe in einem älteren Programm (vlt. 5 Jahre her) einige Änderungen vornehmen müssen und dabei etwas Eigenartiges festgestellt:

In der alten Version wurde mit Line(x, y, a, 0, c) eine waagerechte Linie der Länge a gezogen. Das geht jetzt nicht mehr. Ich musste alle Befehle zu Line(x, y, a, 1, c) ändern.

1. Weiss jemand, seit wann das so ist?
2. Weiss jemand, warum das so ist? Meines Wissens zeichnen Line-Befehle üblicherweise bei Breite / Höhe 0 eine gerade Linie. Bei Breite / Höhe 1 gibt es ein Pixel Versatz. Also so, wie es vorher war.

Ich habe das neu mit PB Version 4.6 compiliert, da mit einer neueren Version wahrscheinlich noch ettliche andere Sachen nicht gehen und ich noch mehr Anpassungen im Code vornehmen müsste. Vielleicht später... Ich weiss nicht mehr, mit welcher Version die alte Variante funktionierend mit Breite / Höhe 0 compiliert wurde, wie gesagt etwa 5 Jahre her, vielleicht länger.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Geändertes Verhalten von "Line"?

Beitrag von ts-soft »

Ich weiß jetzt nicht, mit welcher Version der Bug behoben wurde, aber es steht ganz deutlich in der Hilfe:
http://www.purebasic.com/german/documen ... /line.html
Line() hat geschrieben:daher wird bei einer Höhe von 1 eine horizontale Linie gezeichnet, während bei einer Höhe von 0 gar nichts gezeichnet wird.
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: Geändertes Verhalten von "Line"?

Beitrag von Sven »

Das ist nicht die Frage, es steht auch in der 4.60er Version schon so in der Hilfe.

Aber es war vorher anders, definitiv, sonst hätte mein altes Programm nicht funktioniert. Und es wurde meines Wissens in anderen Basic-Dialekten (Amiga-Basic, QBasic) und auch in Pascal (aus der Erinnerung, ewig nichts mehr damit gemacht) auch so gehandhabt: Eine Höhe / Breite von 0 zeichnet eine gerade Linie, eine Höhe / Breite von 1 zeichnet eine Linie mit 1 Pixel Versatz zwischen Anfang und Ende. Ist Höhe = Breite = 0, wird ein Punkt gezeichnet.

Warum sollte das ein Bug gewesen sein?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Geändertes Verhalten von "Line"?

Beitrag von ts-soft »

Sven hat geschrieben:Warum sollte das ein Bug gewesen sein?
Weil eine Linie mit einer Höhe von 0 nichts sichtbares sein kann :mrgreen: , das wiederspricht jeder Logik.
Wie es in anderen Basics gehandhabt wird, ist auch uninteressant, es wird in PB so gehändelt, wie dokumentiert.
Da interessieren irgendwelche Mutmaßungen nicht.

Allerdings war dieses Verhalten in älteren Versionen noch anders, dies war aber definitiv ein Bug!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: Geändertes Verhalten von "Line"?

Beitrag von Sven »

ts-soft hat geschrieben:Weil eine Linie mit einer Höhe von 0 nichts sichtbares sein kann
Aber ein Kreis mit dem Radius Null ist sichtbar? Und eine Ellipse mit der Achse Null? Eine Linie oder Box der Höhe Null dagegen nicht?

DAS widerspricht jeder Logik. :roll:

Ich mein, das kann man ja so definieren. Aber dass

Line(xstart, ystart, laenge, 1) = Line(xstart, ystart, laenge, -1) ist, dagegen Line(xstart, ystart, laenge, 2) != Line(xstart, ystart, laenge, -2)
Line(xstart, ystart, laenge, hoehe) != LineXY(xstart, ystart, xstart + laenge, ystart + hoehe)

finde ich nicht sehr hilfreich.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Geändertes Verhalten von "Line"?

Beitrag von STARGÅTE »

Hier mal mein DiskussionsThread von damals, zu diesem Thema:
http://www.purebasic.fr/german/viewtopi ... 16&t=21169

Es ist auch für mich "unlogisch" diese Definition von Line() zu haben.
Du kannst aber einfach LineXY() nutzen, und mit einem Macro Line überschreiben:

Code: Alles auswählen

Macro Line(X, Y, DX, DY, Color)
  LineXY(X, Y, X+DX, Y+DY, Color)
EndMacro
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
NicTheQuick
Ein Admin
Beiträge: 8809
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: Geändertes Verhalten von "Line"?

Beitrag von NicTheQuick »

Ich finde das auch unlogisch. Für mich war Line() nichts anderes wie das, was STARGÅTE da so schön als Macro gebaut hat. Der Höhen- und Breite-Parameter hat ja nichts mit der Höhe oder Breite der Linie zu tun. Sie ist weiterhin 1 Pixel breit.
Aber es macht Sinn für mich, dass der letzte Punkt nicht inklusive ist. Also wenn man Line(0, 0, 1, 1) schreibt, dann macht es Sinn, dass nur genau ein Punkt gezeichnet wird. Damit hat die Linie nämlich eine Breite von 1 und eine Höhe von 1. LineXY(0, 0, 1, 1) hingegen zeichnet den zweiten Punk inklusive, also werde da zwei Pixel gezeichnet. Hintergrund war glaube ich, dass wenn man zuerst Box(0, 0, 4, 4) und dann Line(0, 0, 4, 4) zeichnet, die Linie auch beim letzten Pixel der Box aufhören soll und nicht darüber hinausgeht. Also nicht so (. = Linie, # = Box):

Code: Alles auswählen

  0 1 2 3
0 . # # #
1 # . # #
2 # # . #
3 # # # .
4         .
Antworten