| Autor |
Beitrag |
t.norge
      
Beiträge: 48
Win XP
D5 Enterpr., D7 Prof., D8 Prof.
|
Verfasst: Do 24.06.04 16:20
Hallo Zusammen,
ich habe mal eine, zumindest für mich, sehr sehr komplizierte Frage.
Ich habe vor Strassenkreuzungen dynamisch aus einer Vielzahl von Attributen zu erstellen.
d.h. ich habe xy-Koordinaten des Kreuzungsmittelpunktes und xy-Koordinaten der anliegenden Strassen. Wenn ich also einfach mit "lineto" die Koordinaten mit dem Mittelpunkt verbinde habe ich schon sowas wie eine Kreuzung, nur sieht die natürlich dann ziemlich 'billig' aus. Was ich aber gerne erstellen möchte ist eine schöne Kreuzung mit weißen Fahrbahnmarkierungen, Mittellinien, etc. Die Attribute für die Spurenanzahl je Richtung werden auch übergeben. Jede Kreuzung sieht natürlich anders aus...
Kann mir jemand einen Tipp oder Denkanstoß geben, wie ich so eine Graphik dynamisch erstellen kann?
t.norge
|
|
Segelflieger
      
Beiträge: 124
WinXP Pro
D7 Prof
|
Verfasst: Do 24.06.04 16:32
Die Kreuzung selbst stellt ja ohne die anliegenden Straßen ein Rechteck dar.
Die Seitenlängen dieses Rechtecks richten sich nach den Spurbreiten der Straßen. Jetzt musst du dir eine vernünftige Linienführung auf der Kreuzung ausdenken, was natürlich ziemlich kompliziert werden könnte, wenn die Straßen unterschiedlich breit sind. Am einfachsten wäre es sicherlich, die Fahrstreifenbegrenzungslinien nur geradeaus laufen zu lassen. Bei unterschiedlich breiten Straßen würde es aber sicher eher was hermachen, wenn du auch Streifen für mehrspuriges Abbigen einbaust.. da wirds dann halt kompliziert.
Wenn sich zwei 2-Spurige Straßen kreuzen, kann die Kreuzungsfläche ja ganz leer bleiben.
Wieviele unterschiedliche Kreuzungstype gibt es denn? vielleicht reicht es ja, sie als BitMap zu erstellen.
_________________ Früher hatten die Menschen Angst vor der Zukunft. Heute muss die Zukunft Angst vor den Menschen haben.
|
|
t.norge 
      
Beiträge: 48
Win XP
D5 Enterpr., D7 Prof., D8 Prof.
|
Verfasst: Fr 25.06.04 08:38
Hallo Segelflieger,
erstmal vielen Dank für die Unterstützung!
Und zu deiner Frage, es ist leider so, dass alle Arten von Kreuzungen vorkommen können, d.h. bis zu maximal acht anliegende Strassen (was aber sicher nicht, oder nur selten vorkommen wird), alle Straßen können unterschiedlich viele Spuren haben. d.h. z.B. eine dreispurige (+ 1 x Gegenspur) mit einzelnen Abbiegevorschriften trifft auf eine einfache Zweispurige, etc. Einfach alle möglichkeiten, welche es in Natura gibt.
Mit den Bitmap hatte ich mir auch schon überlegt, aber das wäre, glaube ich, noch komplizierter, da die da entsprechend gedreht werden, angepasst und was nicht noch alles müssen. Im Moment ist mein Versuch, die Koordinaten mit breiten LineTo in Weiß zu ziehen und oben drauf einen ganz wenig dünneren grauen LinTo ziehen ( Die breite will ich dann an die Spuranzahl anpassen ) , damit hätte ich zumindest schonmal die äußeren Begrenzungslinien, die Linien, die dann die Spuren kennzeichnen, hmm, soweit bin ich noch nicht. Und ob das klappen wird... da bin ich nicht sicher...
Aber wenn Du oder jemand anderes einen besseren Vorschlag oder Ergänzungen hat, dann wäre ich sehr dankbar.
Schöner Gruß
Torge
|
|
sourcehunter
      
Beiträge: 482
Win XP | Suse 10.1
Delphi 2005 Pers.
|
Verfasst: Mo 28.06.04 18:46
Hi!
Ein interessantes Problem hast du da. Aber erstmal muss ich Segelflieger sagen, dass die Kreuzungsfläche nicht immer eine rechteckige Fläche ist, die ist sogar nur in 1 Ausnahmen der Fall, wenn alle ankommenden Straßen senkrecht aufeinander stehen, dies begrenzt die Anzahl der anliegenden Straßen auf maximal 4, also bleiben 2 Kreuzungstypen von den vielen übrig, für die das gilt. Jetzt zu deinem Problem t.norge. Durch die Anzahl der Spuren hast du die Breite jeder Straße. Wie man die Mittellinie einer Straße Zeichnet hast du ja selbst beschrieben. Dann zeichnest du einfach in der Entfernung einer halben Straßenbreite zwei Linie, die parallel zu der Mittellinie verläuft. Somit hast du die Grundzüge deiner Kreuzung fertig. Dann sorgst du noch für eine geschlossene Fläche und kannst das ganze dann mit Canvas.FloodFill ausmalen. Die Fahrbahnmarkierungen kannst du einfach darüber zeichnen.
Noch eine Frage, kennst du dich in der Mathematik, vor Allem Analytische Geometrie aus?
MfG
Didi
_________________ Linux und OpenSource rulez!
|
|
sourcehunter
      
Beiträge: 482
Win XP | Suse 10.1
Delphi 2005 Pers.
|
Verfasst: Mo 28.06.04 22:38
Ich hab jetzt eine Ideenskizze auf server.freewebspace....bspace/sourcehunter/ verfügbar gemacht. Schreib mir, wenn sie dir zusagt, oder du Probleme damit hast.
_________________ Linux und OpenSource rulez!
|
|
ähM_Key
      
Beiträge: 88
Windows XP Professional
D7 Enterprise
|
Verfasst: Mo 28.06.04 22:47
Finde auch, dass das ne sehr interessante Problematik ist; würde ich am liebsten selber proggen
Dann noch Autos dazu und los geht der Spass!
Aber irgendwie ist dein Webspace Megalahm...sogar für ISDN  ...zumindest jetzt!
Grüße; ähM_Key
_________________ Alles geht ni! Aber ein bissl' was muss!
|
|
t.norge 
      
Beiträge: 48
Win XP
D5 Enterpr., D7 Prof., D8 Prof.
|
Verfasst: Di 29.06.04 08:24
Hallo SourceHunter!
Dir erstmal vielen Dank für Deine Ideen, in etwa so habe ich es bis jetzt auch gelöst, meine Variante bislang ist eine Verbindung von x1/y1 zum Kreuzungsmittelpunkt in dreifacher Ausgabe. d.h. ich zeichne die Verbindung zunächst mit einem breiten grauen/strassenfarbenden Pen, dann nochmal mit einem etwas dünneren weißen Pen und zum Abschluß nochmal mit einem grauen/strassenfarbenden Pen. so habe ich jetzt schonmal die Fahrebahnrandmarkierungen auf die Straße gebracht. Bei den Mittellinien, da wirds was schwerer, da ich bei einer weder wagerecht-, noch senkrechtlaufenden Strasse nicht einfach x bzw y um einen fixen wert verschieben kann, da versagen nämlich gerade leider meine erinnerungen an die Schulzeit, welche eigentlich noch garnicht soo lange her ist... der fixWert für die verschiebung muß sich ja auf den abstand zur mittellinie beziehen, dabei hapert es noch was an der berechnung. Wenn das zum Thema analytische Geometrie gehört, hmm, dann ist mein wissen leider gut eingerostet
Schöner Gruß
Torge
|
|
sourcehunter
      
Beiträge: 482
Win XP | Suse 10.1
Delphi 2005 Pers.
|
Verfasst: Di 29.06.04 21:49
@ähm_key
Erstmal danke für den Hinweis, aber das habe ich Mittlerweile selbst herausgefunden. Das Ding hat aber den Vorteil, dass ich da unbegrenzt Webspace und Trafic habe, der Einzige Haken dabei ist, dass die Bandbreite auf 7KB begrenzt ist. Mal sehen, vieleicht finde ich was besseres.
@t.norge
Vieleicht hast du dir mal den Quellcode angeguckt, oder nicht? Da findest du folgende Zeilen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| x1:=(-y+starty)*Sqrt(Sqr(strbreite)/(Sqr(x-startx)+Sqr(y-starty)))+startx; if strbreite>0 then x1:=-x1+2*startx; x2:=(-y+starty)*Sqrt(Sqr(strbreite+buf.breite)/(Sqr(x-startx)+Sqr(y-starty)))+startx; if strbreite+buf.breite>0 then x2:=-x2+2*startx; x3:=(-y+starty)*Sqrt(Sqr(strbreite)/(Sqr(x-startx)+Sqr(y-starty)))+x; if strbreite>0 then x3:=-x3+2*x; x4:=(-y+starty)*Sqrt(Sqr(strbreite+buf.breite)/(Sqr(x-startx)+Sqr(y-starty)))+x; if strbreite+buf.breite>0 then x4:=-x4+2*x; y1:=(x-startx)*Sqrt(Sqr(strbreite)/(Sqr(x-startx)+Sqr(y-starty)))+starty; if strbreite>0 then y1:=-y1+2*starty; y2:=(x-startx)*Sqrt(Sqr(strbreite+buf.breite)/(Sqr(x-startx)+Sqr(y-starty)))+starty; if strbreite+buf.breite>0 then y2:=-y2+2*starty; y3:=(x-startx)*Sqrt(Sqr(strbreite)/(Sqr(x-startx)+Sqr(y-starty)))+y; if strbreite>0 then y3:=-y3+2*y; y4:=(x-startx)*Sqrt(Sqr(strbreite+buf.breite)/(Sqr(x-startx)+Sqr(y-starty)))+y; if strbreite+buf.breite>0 then y4:=-y4+2*y; |
Die bewirken eine Verschiebung der Koordinaten parallel zu der Mittellinie. Das ließe sich sicher noch um einiges Einfacher gestalten, aber für eine Ideenskizze reichts.
Übrigens: zur analytischen Geometrie gehört alles, was sich mit Berechnungen von Geometrischen gebilden beschäftigt, also zum Bespiel Punkte, geraden und so was.
Achso, ich hätt's beinahe vergessen, deine Idee ist garnicht so verkehrt. Ich habe mir gedacht, dass du, wenn du die Straße gezeichnet hast einfach die Mittelstreifen drüberzeichnest. Es gibt sogar Möglichkeiten unter Delphi gestrichelte Linien auszugeben. Du musst dir natürlich überlegen, wo die Linie anfagen soll, denn direkt in der Mitte geht ja nicht, dabei sollte beachtet weden, dass der Kreuzungsbereich ein Polygon ist, aber das ist dann schon wieder Mathematik.
_________________ Linux und OpenSource rulez!
|
|
t.norge 
      
Beiträge: 48
Win XP
D5 Enterpr., D7 Prof., D8 Prof.
|
Verfasst: Mi 30.06.04 07:36
Hallo Didi!
Zu deiner ersten Frage mit dem Sourcecode, ja, habe ich versucht aber nach einiger Zeit dann aufgegeben... Der Bildschirm hat sich net aufgebaut... Zum Thema analytische Geometrie, ja, denke ich bin in Mathe und Geometrie Dingen recht gut, war ich zumindest zur Schulzeit  , dauert nur ein wenig länger bis ich wieder auf den richtigen Weg komme, ist halt schon was eingerostet...
Aber erstmal möchte ich vielen Dank für Deine Unterstützung sagen, echt Klasse! Deinen Sourcecode werde ich mir gleich mal zu Gemüte führen. Bin ja mal gespannt wie's wird!
Rein interessehalber hätte ich noch eine weitere Frage, in einem alten Projekt habe ich Strecken mit einer PolyBezier-linie dargestellt, das damalige Projekt ist abgeschlossen, aber eine Frage daraus ist mir für immer offen geblieben, kann man die länge eines Polybeziers berechnen? fürs Projekt haben damals ca. Werte genügt, aber irgendwie läßt mich das nicht so recht los...
Schöner Gruß
Torge
|
|
ähM_Key
      
Beiträge: 88
Windows XP Professional
D7 Enterprise
|
Verfasst: Mi 30.06.04 09:18
Hi!
Also bei mir warn's nicht mal 7KB
Und wegen den Mathe Problemen könnte ich ev. auch helfen...hab vor 3 Wochen mein MatheAbi mit 15 Punkten geschrieben ... [/angebmodus]
...also wenn ihr ein Problem habt...
Ich würde das alles schön mit Hilfe von Vektoren und Normalvektoren usw. lösen.
Dürfte einfacher sein, als wie ich's (denk ich zumindest  ) im QT erkannt habe über Pythagoras, auch wenn's im Endeffekt natürlich das selbe ist
Grüße; ähM_Key
_________________ Alles geht ni! Aber ein bissl' was muss!
|
|
t.norge 
      
Beiträge: 48
Win XP
D5 Enterpr., D7 Prof., D8 Prof.
|
Verfasst: Mi 30.06.04 09:35
Hallo Ähm_Key,
dann erzähl mal deinen Vorschlag. Was ich habe ist der Kreuzungsmittelpunkt (Kreuzungsfenster.width div 2 - gilt für x1 und y1) und eben die Endpunkte der anliegenden Strassen (x2,y2; x3,y3; ...) wie würdest du vorgehen wenn du nun die strecke zwischen Koordinate(X1,Y1) und (x2,Y2) parallel um 10PKT verschieben möchtest?
Schöner Gruß
Torge (der sein Abi nicht mit 15 PKT gemacht hat  er musste sich mit 14 begnügen  *lach* )
ach ja, Glückwunsch zum ABI!
|
|
umpani
      
Beiträge: 389
|
Verfasst: Mi 30.06.04 13:46
Hallo zusammen,
Ich beschäftige mich jetzt schon längere Zeit mit diesem Problem. Habe auch schon ein kleines Programm erstellt:
Bei Interesse kann ich den Quelltext mal Online stellen.
Gruß Umpani
_________________ Lernen, ohne zu denken, ist eitel; denken, ohne zu lernen, ist gefährlich. Konfuzius
|
|
ähM_Key
      
Beiträge: 88
Windows XP Professional
D7 Enterprise
|
Verfasst: Mi 30.06.04 18:12
Moin!
Also als Ausgang haben wir eine Strecke zwischen P(x1/y1) und Q(x2/y2). {das "/" ist kein 'durch' sondern trennt X- und Y-Werte!}
Diese soll also um N Pixel (?!) parallel dazu verschoben werden.
Zuerst würde ich den Vektor PQ ermitteln. V(x2-x1/y2-y1)
Jetzt braucht man nen orthogonalen Vektor W; das Skalarprodukt muss 0 sein (cos(0)=90°).
Also am besten W(y2-y1/-[x2-x1]) -> W(y2-y1/x1-x2).
Daraus zauber man nun nen Einheitsvektor W0 indem man W durch den absoluten Betrag dividiert W0=W/sqrt([y2-y1]^2+[x1-x2]^2) also im Endeffekt W0=([ (y2-y1)/sqrt([y2-y1]^2+[x1-x2]^2) ]/[ (x1-x2)/sqrt([y2-y1]^2+[x1-x2]^2) ]) {gibt's 'nen Unterschied zw. sqrt und sqr?}
...hilfe das erkenne ja ich fast ni mehr...also vielleicht besser:
a:=y2-y1
b:=x1-x2
c:=sqrt(a^2+b^2)
W0=([a/c] / [b/c])
So, den Einheistvektor W0 muktipliziert man mit der gewünschten Verschiebung N...N*W0.
Um Punkt R zu bekommen (Der neben Q parallel verschoben) setzt man einfach N*W0 an Q an, also R({x2+N*[a/c]} / {y2+N*[b/c]}) ...ich will das lieber nicht ausgeschrieben sehen
Na und um auf S zu kommen (neben P) braucht man an R nur noch den Gegenvektor von V ansetzen (also QP).
S=R+(-V)
...na und dann einfach die Strecke RS zeichen! Fertsch!
Ich weiß zwar, dass das ev. bissl' sinnlos war, aber ich hab es wenigstens noch mal wiederholt
Grüße; ähM_Key
_________________ Alles geht ni! Aber ein bissl' was muss!
|
|
sourcehunter
      
Beiträge: 482
Win XP | Suse 10.1
Delphi 2005 Pers.
|
Verfasst: Mi 30.06.04 19:15
@ähm_key
Genau so habe ich das auch gemacht, nur sieht es bei mir etwas wirr aus, weil ich das ganze in eine "Computerform" gebracht habe, weil mein Computer nicht mit Vektoren rechnen kann.
@t.norge
Im Prinzip ist der Quellcode nicht sehr komplizier, wenn man sich mit der Objektorientierten Programmierung angefreundet hat (das sind die ganzen Klassen). Wie du vieleicht bemerkt hast, habe ich noch einige Quellcodezeilen auskommentiert, die sollten dir eine Hilfe geben, wie das ganze weiter aussehen könnte. Das mit Bezier-Linien, klingt für mich nach einem Streckenintegral, vieleicht kann dir ähm_key mit seinen 15 Punkten weiter helfen  , denn ich hab noch ein Jahr Schule vor mir  .
@umpani
Könntest du kurz erklären, was dein Programm macht? Ich wäre auch am Quellcode interessiert.
_________________ Linux und OpenSource rulez!
|
|
ähM_Key
      
Beiträge: 88
Windows XP Professional
D7 Enterprise
|
Verfasst: Mi 30.06.04 20:05
| sourcehunter hat folgendes geschrieben: | | Genau so habe ich das auch gemacht, nur sieht es bei mir etwas wirr aus, weil ich das ganze in eine "Computerform" gebracht habe, weil mein Computer nicht mit Vektoren rechnen kann. |
Meiner auch nicht
| sourcehunter hat folgendes geschrieben: | vieleicht kann dir ähm_key mit seinen 15 Punkten weiter helfen , denn ich hab noch ein Jahr Schule vor mir |
Jetzt hack doch nicht auf mir so rum...von nem Streckenintegral hab ich in meinem Leben noch nix gehört! (Na bei dem Tutor kein Wunder  )
...auch so, und viel Spass mit Stochastik, falls ihr's nciht schon habt  *g*
Grüße; ähM_Key
_________________ Alles geht ni! Aber ein bissl' was muss!
|
|
umpani
      
Beiträge: 389
|
Verfasst: Mi 30.06.04 20:33
Hallo,
@sourcehunter
Mein Programm ist dafür gedach, Verkehrsunfallskizzen am Computer zu erstellen (braucht man bei einer Verkehrsunfallaufnahme - Polizeitätigkeit).
Dafür kann man sich verschiedene Kreuzungen, Einmündungen, Straßen, Kurven am PC "zusammenklicken" und auch andere "Verkehrsobjekte" einfügen. Das ganze ist exakt im Maßstab 1:200.
Also eher ein Programm, mit dem der "normale" PC-benutzer nicht so viel anfangen kann.
Gruß Umpani
_________________ Lernen, ohne zu denken, ist eitel; denken, ohne zu lernen, ist gefährlich. Konfuzius
|
|
sourcehunter
      
Beiträge: 482
Win XP | Suse 10.1
Delphi 2005 Pers.
|
Verfasst: Do 01.07.04 19:26
Da muss t.norge entscheiden ob das was für ihn ist oder nicht, aber warscheinlich eher weniger, weil er eine Funktion haben wollte, die ihm die Kreuzung zeichet.
_________________ Linux und OpenSource rulez!
|
|
t.norge 
      
Beiträge: 48
Win XP
D5 Enterpr., D7 Prof., D8 Prof.
|
Verfasst: Fr 02.07.04 08:52
Hallo nochmal Zusammen,
ist ja echt klasse, was für eine Unterstützung so ein Forum für solch Projekte ist!
Also Euch erstmal vielen Dank für dieVorschläge bezüglich der Kreuzung! Bislang habe ich es aus zeitlichen Gründen nicht geschafft die Algos einzubauen, werde das aber sicher Anfang nächste Woche mal versuchen.
Habt erstmal tausend Dank
Schöner Gruß
t.norge
|
|
umpani
      
Beiträge: 389
|
Verfasst: Fr 02.07.04 13:28
@sourcehunter
Das ist richtig. Aber ich kann dir versprechen. Irgendwo in meinem Sourcecode ist ein code versteckt, der ein Kreuzung variabel zeichnet.
Gruß Umpani
_________________ Lernen, ohne zu denken, ist eitel; denken, ohne zu lernen, ist gefährlich. Konfuzius
|
|
sourcehunter
      
Beiträge: 482
Win XP | Suse 10.1
Delphi 2005 Pers.
|
Verfasst: Fr 02.07.04 19:58
@t.norge
Falls du mit deinem Programm irgendwann mal fertieg wirst  , würde ich es gerne mal sehen, falls es dir nicht zu große Umstände bereitet.
_________________ Linux und OpenSource rulez!
|
|
|