Editor - Problem

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Cedric30003

Betreff: Editor - Problem

BeitragDo, Aug 18, 2011 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey!

Ja ich weiß viele werden jetzt wieder Rolling Eyes Rolling Eyes machen, aber ich habe mich in coorperation mit PhilllipB an einem Streckeneditor versucht, welcher nun vorgefertigt "Splines" (wenn man es so nennen darf) nutzt.

Nun, in erster Linie wollen wir so verfahren, dass man mit der Maus die einzelnen Fahrstraßen-Teile aneinandersetzt, und welche - wenn die Endpunkte nah genug beieinander liegen - dort "einrasten".

SPäter sollen die einzelnen Fahrstraßen (alle WayPoints untereinander) in einer txt gespeichert werden.


Nun stellt sich (leider Gottes) noch ein Problem auf:
Bei der Überfahrt von einer Weiche kommt man ja auf eine Gegenfahrspur (bei einer Kehranlage), solange bis man wieder auf einer richtigen Fahrspur ist oder zurück fährt.

Ähnlich ist es beim zurücksetzen:
Dann müssen die WayPoints ja auch wieder in Gegenrichtung gelesen werden.

Ich hoffe mal dass dies hier einigermaßten verständlich war, da es etwas blöde ist, es zu formulieren.

Danke im Voraus

MfG Cedric
Windows 7 Enterprise (x64) | AMD Athlon II X4 620 (4x2,61GHz) | 8GB RAM | nVIDIA GeForce 9500GT (1024MB)

Xeres

Moderator

BeitragDo, Aug 18, 2011 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
An welcher Stelle kommt es da zu welchem Problem?
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)
 

Cedric30003

BeitragDo, Aug 18, 2011 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja Der Denkansatz dazu fehlt einfach, wie man das am besten anfängt, wir haben jetzt zwar schon nee Stunde überlegt aber sind im Endeffekt nur zu folgendem ergebnis gekommen:

Code: [AUSKLAPPEN]

Type Schiene
   Field ID ;selbsterklärend
   Field Rot_start ;Rotationsgrad am Anfang des Gleises
   Field Rot_ende  ;Rotationsgrad am  Ende  des Gleises
   Field Rast_start;Ob dieses Gleis an ein vorheriges angehängt ist oder es ein neues "Fresitehendes" ist
   Field Rast_ende ;Ob am Ende des Gleises ein weiteres eingerastet ist
End Type

Graphics3D 1366,768,32,1
SetBuffer BackBuffer()
FPSTimer = CreateTimer(30)
Global cam1 =CreateCamera()
licht = CreateLight()
AppTitle "Editor"
Kachel = LoadMesh("Kachel.3ds")
PositionEntity cam1,0,3.5,0
10er = LoadMesh ("10m.3ds")
HideEntity 10er

Function Kamera()
;Kamera drehen
   If MouseDown (2)
      TurnEntity cam1,-MouseYSpeed()/4,0,0
      TurnEntity cam1,0,-MouseXSpeed()/4,0,1
      MoveMouse GraphicsWidth()/4,GraphicsHeight()/2
   EndIf
   ;[Block] Freie Kamerabewegung
;bewegen
   If KeyDown(17) And KeyDown (42) Then
      MoveEntity cam1, 0, 0, +0.5
   EndIf
   If KeyDown(17) Then
      MoveEntity cam1, 0, 0, +0.02
   EndIf
   If KeyDown(31) Then
      MoveEntity cam1, 0, 0, -0.02
   EndIf
   If KeyDown(32) Then
      MoveEntity cam1, +0.02, 0, 0
   EndIf
   If KeyDown(30) Then
      MoveEntity cam1, -0.02, 0, 0
   EndIf
;Kamera hoch und runter
   If KeyDown(16) Then
      TranslateEntity cam1, 0, 0.05, 0
   EndIf
   
   If KeyDown(18) Then
      TranslateEntity cam1, 0, -0.05, 0
   EndIf
   ;[End Block]
   ;[Block] Perspektiven
   
;Fahrersicht
   If KeyDown (2) Then
      PositionEntity cam1,0,3.5,84
      RotateEntity cam1,0,0,0
   End If
;IBIS Sicht
   If KeyDown (3) Then
      PositionEntity cam1,-2,2,88
      RotateEntity cam1,0,0,0
   End If
   ;[End Block]
   
End Function
While Not KeyHit (1)
   Kamera()
   
   
   
   UpdateWorld
   RenderWorld
   WaitTimer (FPSTimer)
   Flip 0
Wend
End


Und da hängt es halt.

Der Grundstein dazu fehlt, warauf man dann weiteres aufbaut.

Wir wissen einfach nicht genau wie man dies umsetzen kann, wir haben jetzt nur Teilstücke uns überlegt, welche aber nicht umsetzbar sind, da man sie auf das jetzig bestehende nicht anwenden kann.

Bitte seid uns nicht böse aber es ist mal wieder so eine typische "Denksperre" wie man so (un-)schön sagt. Embarassed

Danke für deine bisjetzige Stellungnahme.



MfG Cedric&PhillipB
Windows 7 Enterprise (x64) | AMD Athlon II X4 620 (4x2,61GHz) | 8GB RAM | nVIDIA GeForce 9500GT (1024MB)

ZEVS

BeitragDo, Aug 18, 2011 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Typ Schiene ist definitiv unvollständig. Auf jeden Fall fehlen noch solche Dinge wie Koordinaten und Mesh.

Probiert doch einfach mal, einzelne Teile des Codes auszukommentieren oder regelmäßig DebugLog zu schreiben (z.B. nach jeder Kameraüberprüfung). Wenn es dann hängt, schaut ihr im DebugLog nach dem letzten Eintrag und wisst, dass das Problem zwischen diesem und dem nächsten liegt und das Problem ist eingegrenzt. So kommt man bei Hängern weiter.

ZEVS

Xeres

Moderator

BeitragDo, Aug 18, 2011 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Geht es darum die Teile ein zu rasten, die Waypoints richtig zu erstellen, oder sich anhand der Waypoints zu bewegen?
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)
 

Cedric30003

BeitragDo, Aug 18, 2011 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal geht es daraum dass die Schiene einrastet, weiteres wird dann später darauf aufgebaut.
Windows 7 Enterprise (x64) | AMD Athlon II X4 620 (4x2,61GHz) | 8GB RAM | nVIDIA GeForce 9500GT (1024MB)

Midimaster

BeitragDo, Aug 18, 2011 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
meine Gedanken dazu:

So wie ich das aus dem Code lese, enthält der Typ "Schiene" lediglich die verschiedenen möglichen Gleisstücke, wie bei einer Modelleisenbahn?

Dann fehlt euch aber noch der Typ "Strecke", der die WayPoints repräsentiert und als eines seiner Fields ein Array "Verbindungen()" enthalten sollte.

Eine "Weiche" ist dann zwar optisch von Typ "Schiene" aber logisch 3 Waypoints A1 B1 B2 die mit zwei Verbindungen A1-B1 und A1-B2 verbunden sind.

Nun ist es vollkommen unerheblich, ob der Zug von A1 via B1 nach C1... und irgendwann nach S1 kommt, oder ob er der Zug von A1 via B2 nach C2...und irgendwann über eine Weiche R2 wieder auf S1 kommt.


Die Schienen sind übrigens nicht Bilder die man den WayPoints zuordnen sollte , sonder Bilder der "Verbindung". Möglicherweise dort wieder einen Typ anlegen, der die aktuelle Ausrichtung der Schiene in dieser spez. Verbindung festhält.

Xeres

Moderator

BeitragDo, Aug 18, 2011 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Am besten gibt es eine "ausgewähltes Stück"-Variable (wahl z.B. durch CameraPick) an die man das nächste Stück mathematisch exakt ansetzen kann. Wenn die Meshes alle gleich groß (bzw. lang) sind, sollte das kein Problem sein. Denk dir eine Tilemap bzw. eine würfel-unterteilung der Umgebung, dann ist immer klar, wo was hingehört.
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)
 

Cedric30003

BeitragDo, Aug 18, 2011 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja gut, soweit hatten wir das mittlerweile auch schon wieder interprettiert, Aber es gibt ja Kurven, wo der Endpunkt ja nicht in die genau gleiche Richtung zeigt:

user posted image

Ich denke mal das sagt mehr als dass ich jez die tastatur qualmend tippe

MfG Cedric

Edit: Ich entschuldiuge mich für die Rechtschreibfehler im Bild
Windows 7 Enterprise (x64) | AMD Athlon II X4 620 (4x2,61GHz) | 8GB RAM | nVIDIA GeForce 9500GT (1024MB)

Xeres

Moderator

BeitragDo, Aug 18, 2011 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum macht ihr ein große Kurve nicht aus einem großen Mesh? Oder wie wolltet ihr kurven realisieren?
Die Ausrichtung der Waypoints lässt sich ja aus dem vorhergehendem Teil berechnen.
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)
 

Cedric30003

BeitragDo, Aug 18, 2011 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja es sind mehrere vorgefertigtre Mesh Objekts die im 3DS Format vorliegen.
Und diese Objekte sollen ineinader einrasten
Windows 7 Enterprise (x64) | AMD Athlon II X4 620 (4x2,61GHz) | 8GB RAM | nVIDIA GeForce 9500GT (1024MB)

ZEVS

BeitragDo, Aug 18, 2011 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Eventuell solltet ihr zu jeder Schiene die vorherige Speichern. Da findet ihr immer die nächste Schiene und könnt beliebig vorwärts und rückwärts fahren. Die Position des nächsten Streckenabschnittes erhält man dann mithilfe des vorhergehenden und ein paar Winkelfunktionen.

Eine Frage: Soll die Strecke 3D oder 2D sein?

ZEVS

Xeres

Moderator

BeitragDo, Aug 18, 2011 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann gibt es doch keine Probleme. Die Abmessungen der Meshes sind bekannt, ggf. gibt es für eine Kurve mehrere Waypoints deren Position auch bekannt ist. Sobald man das neue Teil dazu setzt, wird die Fahrrichtung für die Waypoints berechnet - oder im Editor sind wie Waypoints sowieso nochmal sicht- und einstellbar.
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)
 

Cedric30003

BeitragDo, Aug 18, 2011 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
3D
(Sonst würden wir keine .3ds dateien laden;))

@Xeres:

SOrry, aber ich habe mir das jetzt zum 10. mal durchgelesen, und werde daraus nicht schlau.

Ich weiß, es ist nicht gerne gesehen: aber wäre ein Beispiel möglich, welches ncihtmal lauffähig sein muss, sondern einfach nur die Struktur bzw vorgehensweise wiedergibt.
Kopieren würde ich es eh nicht können, da ja eh alles angepasst werden müsste.

Danke im Voraus

MfG
Windows 7 Enterprise (x64) | AMD Athlon II X4 620 (4x2,61GHz) | 8GB RAM | nVIDIA GeForce 9500GT (1024MB)

Midimaster

BeitragDo, Aug 18, 2011 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
ich halte es für einen Fehler, wenn man den Schienen schon eine Fahrrichtung gibt. Letztendlich ist es doch für den Zug so, dass er die Schiene am einen Ende "betritt" und dann natürlich am anderen Ende wieder verlässt. Dort wird er an die nächste Schiene übergeben.

Es ist klug von Euch, den Winkel jedes Schienenstück zu wissen, damit man dann imemr weiß, in welchem Winkel das nächste Stück gedreht werden muss, um an das vorherige zu passen.

Setzt man an eine gerades Stück, das in Richtung 0° läuft eine Kurve mit 30°, dann werden die nächsten anzusetzenden Schienen um 30° gedreht dort angesetzt. Ein Gerades, dass ja selbst 0° hat, kommt dann auch am Ende wieder mit 30° raus und. Eine Kurve mit wieder 30° wird am Ende also bei 60° rauskommen, was bedeutet, dass das nächste Stück diesmal um 60° gedreht eingebaut werden muss, damit es passt.

Ein gerades Stück kann übrigens an n° und an n+180° angebaut werden und passt trotzdem. Wird also ein gerades Stück bei 260° eingebaut, kann man sein Ende auch wie 80° betrachten und darf daher an ein entgegenkommendes Gleis mit 80° angeschlossen werden. Entwickelt daraus ein kurzes "Sondergleis" für Kehrschleifen.

Später aus der Sicht des Zuges betritt er jedes Schienenstück mit 0° und dreht dann während des Schienenstück um die Gradzahl der Schiene. Da spielen Kehrschleifen keine Rolle mehr. Der Zug wird also bei dem "Sondergleis", die Richtung 260° beibehalten. Er fährt ja auch in Gegenrichtung.

Xeres

Moderator

BeitragDo, Aug 18, 2011 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Lass mich das nochmal im Detail wiederholen:
Gehen wir mal kurz von einem bestehenden Teilstück Strecke aus. Ich klicke eine Maustaste, CameraPick wählt dieses eine Teilstück als Aktiv aus. Dann setzte ich mit der anderen Maustaste ein neues Stück daran. Aus der Position & Größe des erstens Stücks und der Größe des zweiten wird die zweite Position errechnet. Der 1. Waypoint bekommt seine korrekte Ausrichtung durch das ansetzen des 2. Stücks, da jetzt wie Richtung festgelegt ist. Das neue Teilstück wird automatisch als Aktiv ausgewählt.
Jetzt kann man z.B. eine komplett gerade Strecke hintereinander setzen, und alles funktioniert prima.
Jedes Modell-Objekt muss die Informationen über mögliche Ansatzpunkte erhalten - über Childs/Joints oder aus einer Datei geladen - und ggf.wo relativ zum Modell die Waypoints verlaufen.

Ansonsten: Versuche beim BPS #11 mit zu machen oder achte zumindest auf die Ergebnisse.
Das Thema ist in seiner Gesamtheit schon etwas komplexer, da werde ich zumindest nicht mal eben ein Beispiel her zaubern.
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)
 

Cedric30003

BeitragDo, Aug 18, 2011 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Deine Erklärung war sicher besser als ein Beispiel, da hast du recht.

Wir werden das mal versuchen, sowie Xeres beschrieben hat, umzusetzen.

Weitere Fragerei wäre Laufen ohne fortzukommen Very Happy

MfG Cedric

Edit: Gibt es eine Möglichkeit, genau Winkelkurven mit einem 3D Programm zu erstellen? Oder vllt auch mit blitz3D?!?
Im Anim8or is mir keine gute Funktion bekannt.
Windows 7 Enterprise (x64) | AMD Athlon II X4 620 (4x2,61GHz) | 8GB RAM | nVIDIA GeForce 9500GT (1024MB)

Midimaster

BeitragFr, Aug 19, 2011 2:38
Antworten mit Zitat
Benutzer-Profile anzeigen
hier mal eine spielerei von mir.

das Programm setzt aus 3 Grundelementen eine Strecke zusammen. Man muss nur 3 Dinge angeben:

- eigene Objekt-Nr

- Verwendetes Grundelement

- Objekt an das angeschlossen wird


BlitzBasic: [AUSKLAPPEN]
Graphics 1000,800
SetBuffer BackBuffer()

Const GERADE%=1 , KURVE%=2 , GEGENKURVE%=3

Type SchieneTyp
Field Art% , Lang# , Radius# , Winkel#

End Type

Type GleisTyp
Field X1# , Y1# , X2#, Y2# , Art% , Richtung%
Field GehtNach% , KommtVon% , Lang# ,ID%
End Type


Dim Schiene.SchieneTyp(10)

Dim Strecke.GleisTyp(100)



Schiene(1)= New SchieneTyp
Schiene(1)\Art= GERADE
Schiene(1)\Lang=100

Schiene(2)=New SchieneTyp
Schiene(2)\Art= KURVE
Schiene(2)\Radius=-100
Schiene(2)\Winkel=-30


Schiene(3)=New SchieneTyp
Schiene(3)\Art= KURVE
Schiene(3)\Radius=100
Schiene(3)\Winkel=60



Strecke(0) = New GleisTyp
Strecke(0)\X1=300
Strecke(0)\Y1=300
Strecke(0)\X2=300
Strecke(0)\Y2=300
Strecke(0)\Richtung=90


AddGleis 1,GERADE,0
AddGleis 2,KURVE,1
AddGleis 21,GEGENKURVE,2
AddGleis 22, GERADE, 21
AddGleis 3,GERADE,2
AddGleis 9,GERADE,1
AddGleis 4,GEGENKURVE,3
AddGleis 6,KURVE,4
AddGleis 5,GERADE,6

AddGleis 8,GEGENKURVE,5
AddGleis 9,GEGENKURVE,8
AddGleis 10,GEGENKURVE,9

AddGleis 11,GERADE,10
AddGleis 12,GERADE,11
AddGleis 13,GERADE,12
For loc.GleisTyp = Each GleisTyp
Color Rand(0,2)*125 , Rand(0,2)*125 , Rand(0,2)*125

Text (loc\X1 + loc\x2)/2 , loc\y1+20 , "L="+loc\Lang
Text (loc\X1 + loc\x2)/2 , loc\y1+10 , "ID" + loc\Id
Line loc\x1 , loc\y1 , loc\x2 , loc\y2
Next
Flip
Print WoIst(800)

WaitKey




Function AddGleis (Nr% , Art% , An%)
loc.GleisTyp = New GleisTyp
loc\Art=Art
loc\Id=Nr
loc\KommtVon = An
Strecke(An)\GehtNach=Nr
loc\X1=Strecke(An)\X2
loc\Y1=Strecke(An)\Y2

If loc\Art=GERADE
loc\Richtung=Strecke(An)\Richtung
Xadd = Schiene(Art)\Lang * Sin(loc\Richtung)
Yadd = Schiene(Art)\Lang * Cos(loc\Richtung)
loc\X2 = loc\X1 + Xadd
loc\Y2 = loc\Y1 + Yadd
loc\Lang=Schiene(Art)\Lang
Else
MitteRx = loc\X1 + Cos(Strecke(An)\Richtung) * Schiene(Art)\Radius
MitteRy = loc\Y1 - Sin(Strecke(An)\Richtung) * Schiene(Art)\Radius
Oval MitteRx , MitteRy , 5,5
DebugLog "MITTE= " + mitterx + " " + mittery
If Schiene(Art)\Winkel>0
For x=0 To Schiene(Art)\Winkel
Plot mitteRx - Cos(Strecke(An)\Richtung+x) * Schiene(Art)\Radius , mitteRy + Sin(Strecke(An)\Richtung+x) * Schiene(Art)\Radius
Next
Else
For x=0 To -Schiene(Art)\Winkel
Plot mitteRx - Cos(Strecke(An)\Richtung-x) * Schiene(Art)\Radius , mitteRy + Sin(Strecke(An)\Richtung-x) * Schiene(Art)\Radius
Next
EndIf
loc\X2 = mitteRx - Cos(Strecke(An)\Richtung+Schiene(Art)\Winkel) * Schiene(Art)\Radius
loc\Y2 = mitteRY + Sin(Strecke(An)\Richtung+Schiene(Art)\Winkel) * Schiene(Art)\Radius
loc\Richtung=Strecke(An)\Richtung + Schiene(Art)\Winkel
loc\Lang=2 * Schiene(Art)\Radius * Pi / 360 * Schiene(Art)\Winkel
EndIf
DebugLog xadd + " " + yadd
Strecke(NR)= loc
End Function



Function WoIst(km#)
Print "Frage: Wo ist km "+ km + "?"
Local sum#
Aktgleis=0
Repeat
sum#=sum + Strecke(AktGleis)\Lang
Print "Summe=" + sum + " am Ende von Gleis" + AktGleis + " Lang= " + Strecke(AktGleis)\Lang
AktGleis=Strecke(AktGleis)\GehtNach
Until sum>km
Print "Antwort: In Abschnitt " + (AktGleis-1)
Return AktGleis-1
End Function


vielleicht könnt ihr es ja irgendwie brauchen....
  • Zuletzt bearbeitet von Midimaster am Fr, Aug 19, 2011 17:31, insgesamt 2-mal bearbeitet

PhillipB

BeitragFr, Aug 19, 2011 10:15
Antworten mit Zitat
Benutzer-Profile anzeigen
@Midimaster: Ein großes Lob !
Bis zur Funktion hab ich alles verstanden.
Fehlt da eigentlich nicht noch die Gleis ID ? Wie werden die Gleise sonst zusammen gefügt?
Könntest du villt. so nett sein Die einzelnen Schritte in der Funktion zu kommentieren, dann würden wir noch ein Stück weiter kommen.

mfg
STRINGS - Einige tragen sie|wir programmieren sie! Very Happy

Midimaster

BeitragFr, Aug 19, 2011 10:50
Antworten mit Zitat
Benutzer-Profile anzeigen
ich dachte mir gleich, dass ihr nach genau sowas sucht.

Was du hier siehst, ist die Logik zum Zusammensetzen der Schienen. Die Funktion macht genau das. Du muss nur sagen, welches Schienenstück du an welches setzen möchtest und schon wird es korrekt ausgerichtet und erhält auch gleich noch eine ID.
BlitzBasic: [AUSKLAPPEN]
AddGleis 401,GERADE,299

der erste Parameter ist die ID, die das neue Gleisstück erhalten soll. Der zweite Parameter zeigt auf eine Schiene einer Schienensammlung mit best. Grundelementen. Der dritte Parameter legt fest, mit welchem Element das neue Schienenstück verknüpft werden soll.

Hier mal die Funktion mit mehr Kommentaren:

BlitzBasic: [AUSKLAPPEN]
Function AddGleis (Nr% , Art% , An%)

; ein neues Gleisstück wird erschaffen und mit den einfach zu berechnenden Werten vorbelegt:
loc.GleisTyp = New GleisTyp
loc\Art=Art

;hier wird es an das bestehende Schienennetz angeknüpft:
loc\KommtVon = An
Strecke(An)\GehtNach=Nr

;der 0-Punkt des Schienenstücks ist das Ende des vorherigen:
loc\X1=Strecke(An)\X2
loc\Y1=Strecke(An)\Y2

; ab jetzt wird Ausrichtung und Endpunkte gerechnet
If loc\Art=GERADE
; für gerade Schienen ist es einfach:
; gleiche Richtung wie vorheriges
loc\Richtung=Strecke(An)\Richtung

;die wirklichen X und Y Anteile der Schiene aufgrund der Richtung und Länge
Xadd = Schiene(Art)\Lang * Sin(loc\Richtung)
Yadd = Schiene(Art)\Lang * Cos(loc\Richtung)
loc\X2 = loc\X1 + Xadd
loc\Y2 = loc\Y1 + Yadd
Else
; für Kurven wirds komplizierter
; zunächst muss der wirkliche Mittelpunkt des Radius dieser Kurve so gefunden werden, dass der Kreis
; sich auch mit dem vorherigen Stück verbinden würde:
MitteRx = loc\X1 + Cos(Strecke(An)\Richtung) * Schiene(Art)\Radius
MitteRy = loc\Y1 - Sin(Strecke(An)\Richtung) * Schiene(Art)\Radius
Oval MitteRx , MitteRy , 5,5
DebugLog "MITTE= " + mitterx + " " + mittery

; das dient nur dem Zeichnen eines Bogenstücks:
; (kann später raus, wiel ja mit 3D-Objekten gemalt wird)
If Schiene(Art)\Winkel>0
For x=0 To Schiene(Art)\Winkel
Plot mitteRx - Cos(Strecke(An)\Richtung+x) * Schiene(Art)\Radius , mitteRy + Sin(Strecke(An)\Richtung+x) * Schiene(Art)\Radius
Next
Else
For x=0 To -Schiene(Art)\Winkel
Plot mitteRx - Cos(Strecke(An)\Richtung-x) * Schiene(Art)\Radius , mitteRy + Sin(Strecke(An)\Richtung-x) * Schiene(Art)\Radius
Next
EndIf

;das Ende des Bogenstücks ist genau das Ende der Schiene
loc\X2 = mitteRx - Cos(Strecke(An)\Richtung+Schiene(Art)\Winkel) * Schiene(Art)\Radius
loc\Y2 = mitteRY + Sin(Strecke(An)\Richtung+Schiene(Art)\Winkel) * Schiene(Art)\Radius

; die neue Richtung ist die alte Richtung plus der Winkel des neuen Stücks:
loc\Richtung=Strecke(An)\Richtung + Schiene(Art)\Winkel
EndIf
DebugLog xadd + " " + yadd
; neues Gleistück ins Array
Strecke(NR)= loc
End Function

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group