Seltsames Verhalten von Line und Rect bei Längenänderung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Flush

Betreff: Seltsames Verhalten von Line und Rect bei Längenänderung

BeitragDo, Jul 19, 2018 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

ich habe in meinem kleinen Programm animierte 3 Linien mit Line gezeichnet.
Das funktioniert sehr gut. Schließlich wollte ich Line durch Rect ersetzen, da nur horizontale Linien gezeichnet werden und Rect 1500 mal schneller als Line ist.

Das funktioniert aber nicht. Das Rechteck müsste sich doch bei in der Länge genauso (identisch) ändern wie die Linien die ich mit Line gezeichnet habe. Auf der X und Y Achse funktioniert das auch aber die Längenänderung ist komplett falsch.

Die Längenänderung von Rect müsste doch identisch mit der von Line sein Question

Ich habe hier mal ein lauffähiges Beispiel extrahiert:
BlitzBasic: [AUSKLAPPEN]

Graphics 1280, 768, 24, 3
SetBuffer BackBuffer()

font = LoadFont("Arial", 24, 1, 0, 0)
SetFont font

CalcSin(100, 1)
CalcCos(100, 1)

Global SinusWerte%[360]
Global CosinusWerte%[360]

Global ZaehlerTestLine% = 0
Global ZaehlerTestRect% = 0

; Linien sind blau
; Rechteck ist grün

Repeat

Cls
Color 255, 255, 255
Text 50, 20, "Linien sind blau"
Text 350, 20, "Rechteck ist grün"

TestLine()
TestRect()

Flip

Until KeyHit(1)

Function TestLine()

Local iAngle = 0
Local PosX = 150
Local PosY = 241

Local X = 300 + PosX + ZaehlerTestLine
Local Y = PosY - SinusWerte[(iAngle + ZaehlerTestLine)Mod 359]

Color 0, 0, 255

Line PosX + CosinusWerte[(iAngle + ZaehlerTestLine)Mod 359], PosY - SinusWerte[(iAngle + ZaehlerTestLine)Mod 359], X, Y
Line PosX + CosinusWerte[(iAngle + ZaehlerTestLine)Mod 359], 1 + PosY - SinusWerte[(iAngle + ZaehlerTestLine)Mod 359], X, Y + 1
Line PosX + CosinusWerte[(iAngle + ZaehlerTestLine)Mod 359], 2 + PosY - SinusWerte[(iAngle + ZaehlerTestLine)Mod 359], X, Y + 2

Color 255, 255, 255
ZaehlerTestLine = (ZaehlerTestLine + 1) Mod 359

End Function

Function TestRect()

Local iAngle = 0
Local PosX = 150
Local PosY = 251

Local X = 300 + PosX + ZaehlerTestRect
Local Y = PosY - SinusWerte[(iAngle + ZaehlerTestRect)Mod 359]

Color 0, 255, 0

Rect PosX + CosinusWerte[(iAngle + ZaehlerTestRect)Mod 359], PosY - SinusWerte[(iAngle + ZaehlerTestRect)Mod 359], X, 3

Color 255, 255, 255
ZaehlerTestRect = (ZaehlerTestRect + 1) Mod 359

End Function

Function CalcSin(Amplitude%, Periode%)

Local j%
Local sinus%

For j% = 0 To 359
sinus = Sin(j * Periode ) * Amplitude
SinusWerte[j] = sinus
Next

End Function

Function CalcCos(Amplitude%, Periode%)

Local j%
Local cosinus%

For j% = 0 To 359
cosinus = Cos(j * Periode ) * Amplitude
CosinusWerte[j] = cosinus
Next

End Function


Könnt Ihr mir sagen wo da der Hund begraben liegt un vor allem wie ich das richtig mache?

Vielen Dank für Eure Mühe und Hilfe bei der Hitze Exclamation

Viele Grüße,
Flush

SpionAtom

BeitragDo, Jul 19, 2018 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei rect gibt man als dritte und vierte Parameter die Länge und Höhe des Rechtecks an.
Das ist in deinem Fall Zeile 60

Code: [AUSKLAPPEN]
   Local X = 300 + PosX + ZaehlerTestLine


Du rechnest da zusätzlich die Position mit drauf, die sollte auf alle Fälle weggelassen werden.

Die Länge, welche die Linie hat, kannst du auch leicht errechnen:

Code: [AUSKLAPPEN]
Line PosX + CosinusWerte[(iAngle + ZaehlerTestLine)Mod 359],   PosY - SinusWerte[(iAngle + ZaehlerTestLine)Mod 359], X, Y


Das ist nämlich die Differenz der beiden X-Koordinaten, also:
X - (PosX + CosinusWerte[(iAngle + ZaehlerTestLine)Mod 359])
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
  • Zuletzt bearbeitet von SpionAtom am Do, Jul 19, 2018 19:23, insgesamt 3-mal bearbeitet

Flush

BeitragDo, Jul 19, 2018 19:18
Antworten mit Zitat
Benutzer-Profile anzeigen
@SpionAtom
Zitat:
Bei rect gibt man als dritte und vierte Parameter die Länge und Höhe des Rechtecks an.
Das ist in deinem Fall Zeile 60


Klar, aber wenn ich die PosX weglasse klapps auch nicht.

Danke für Deine schnelle Antwort!

Viele Grüße,
Flush
  • Zuletzt bearbeitet von Flush am Do, Jul 19, 2018 22:08, insgesamt einmal bearbeitet

SpionAtom

BeitragDo, Jul 19, 2018 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte meinen Beitrag noch editiert, du berechnest unterschiedliche Längen.

Im Falle der Linie hat die Linie eine Länge von:
Code: [AUSKLAPPEN]

   Local X = 300 + PosX + ZaehlerTestLine
   Line PosX + CosinusWerte[(iAngle + ZaehlerTestLine)Mod 359],   PosY - SinusWerte[(iAngle + ZaehlerTestLine)Mod 359], X, Y


X - (PosX + CosinusWerte[(iAngle + ZaehlerTestLine)Mod 359])

Setzt man für X den berechneten Wert ein, dann steht da folgendes:

(300 + PosX + ZaehlerTestLine) - ((PosX + CosinusWerte[(iAngle + ZaehlerTestLine)Mod 359]))

= 300 + ZaehlerTestLine - CosinusWerte[(iAngle + ZaehlerTestLine)Mod 359])


Die Länge beim Rechteck ist:

Code: [AUSKLAPPEN]
Local X = 300 + ZaehlerTestRect


Da wird der Cosinuswert gar nicht mit einberechnet, da ist der Hund begraben.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Flush

BeitragSo, Jul 22, 2018 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
@SpionAtom

Tut mir leid dass ich mich erst jetzt melden kann. Vielen Dank für Deine Antwort.
Ich hab den Code entsprechend geändert und es funktioniert. Nun versuche ich die Sache zu verstehen und hab noch eine Frage.

Es ist klar dass ich die Länge der Linie durch Länge = Ende - Anfang ==> Länge = X - (PosX + CosinusWerte[(iAngle + ZaehlerTestLine)Mod 359])
berechnen kann.

Das X bei Line ist eindeutig als Local X = 300 + PosX + ZaehlerTestLine initialisiert.
Das PosX bei Line ist eindeutig als PosX = 150 initialisiert.
Also steht im X beim Aufruf des Line Objekts X = 300 + 150 + ZaehlerTestLine.

BlitzBasic: [AUSKLAPPEN]

Line PosX + CosinusWerte[(iAngle + ZaehlerTestLine)Mod 359], PosY - SinusWerte[(iAngle + ZaehlerTestLine)Mod 359], X, Y

Beim Aufruf des Line Objekts wird durch X die Längenänderung erreicht.



Das X bei Rect ist eindeutig als Local X = 300 + PosX + ZaehlerTestRect initialisiert also identisch zu Line.
Das PosX bei Rect ist eindeutig als PosX = 150 initialisiert identisch zu Line.
Also steht im X beim Aufruf des Rect Objekts X = 300 + 150 + ZaehlerTestRect.

BlitzBasic: [AUSKLAPPEN]

Rect PosX + CosinusWerte[(iAngle + ZaehlerTestRect.)Mod 359], 10 + PosY - SinusWerte[(iAngle + ZaehlerTestRect.)Mod 359], X, 3

Beim Aufruf des Rect Objekts sollte durch X die Längenänderung erreicht werden dentisch zu Line.


Deine Lösung:
BlitzBasic: [AUSKLAPPEN]

Rect PosX + CosinusWerte[(iAngle + ZaehlerTestRect)Mod 359],PosY - SinusWerte[(iAngle + ZaehlerTestRect)Mod 359], 300 + ZaehlerTestRect - CosinusWerte[(iAngle + ZaehlerTestRect)Mod 359], 3

ist völlig richtig.

Aber warum müssen bei 2 völlig identischen Initialisierungen 2 unterschiedliche Angaben in den X Werten gemacht werden. X ist doch immer 300 + PosX + ZaehlerTestLine wobei Pos X = 150 ist.

Werden die X Angaben der Objekte (Rect & Line) irgendwie anders behandelt?
Bei Line ist der X-Wert eine Positionsangabe bei Rect eine Größenangabe der Breite?!

Zitat:
Da wird der Cosinuswert gar nicht mit einberechnet, da ist der Hund begraben.

Der Cosinuswert wir doch beim Line Objekt nur beim X für den Startpunkt mit einberechnet, weshalb brauche ich Ihn dann beim Rect Objekt im Endpunkt Embarassed !?

Ich hab versucht mich so klar und deutlich auszudricken wie es geht, ich hoffe Du/ Ihr versteht wo ich hängen bleibe Question Exclamation

Viele Grüße,
Flush
  • Zuletzt bearbeitet von Flush am So, Jul 22, 2018 18:44, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSo, Jul 22, 2018 17:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Rect hat kein Endpunkt.
Line verwendet zwei absolute Koordinaten (Anfangspunkt, Endpunkt).
Rect verwendet eine absolute Koordinate (Anfangspunkt) und zwei dazu relative Längen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Flush

BeitragSo, Jul 22, 2018 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres
Hmmm dann war mein Problem dass ich dachte die X_Angaben bei Line und Rect seien identisch!

Danke für Deine Hilfe.

Viele Grüße,
Flush

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group