Seite 1 von 2

Mathematik und ein Progger am Rande der Verzwe... [Erledigt]

Verfasst: 01.09.2006 23:17
von MCWulf
Hi Leute,

nachdem ich mich nun in PB wieder eingearbeitet habe, und mein Hauptmenü fertig ist, habe ich mich an den Editor für mein Spiel gemacht.

Man kann da mit der Maus Linien "verlegen", mit der Besonderheit, dass diese Linien immer zusammenhängen.

Bild

Die Linien selber habe ich in einer Linked List (ich glaube so heißt das Teil *g*) gespeichert, und zeichne die per ForEach auf meinen Bildschirm.

Soweit alles noch kein Problem, doch jetzt kommts zum schweren Teil.

Ich möchte nun parallel zu jeder Linie weitere Linien dranzeichnen, mit dem Abstand 1 Pixel. (Die Farbe der Linien fadet in die Hintergrundfarbe aus) Doch da so kleine "Pixellöcher" entstehen, habe ich mir folgendes überlegt:

Bild

Man fängt bei der äußersten Linie mim zeichnen an, macht rechts und links noch 2 Linien, welche die alte und die neue Linie verbinden, und füllt anschließend den Bereich dazwischen mit der neue-Linie-Farbe auf. Und dann bewegt man sich immer weiter ran, bis man wieder bei der eigentlichen Linie ist.

Bild
Bild
Bild

Hier ist schonmal meine ersten 2 Probleme...

Problem gelöst von Stargate :D
1. Wie kann ich überhaupt an die Koordinaten der neuen Linie kommen? Ich weis, welchen Abstand sie zur Urlinie haben, und ich kenn die Koordinaten der Urlinie.

Bild

Edit: Dieses Problem hab ich selber lösen können, hier mein Code: (Sehr übersichtlich <.<

Code: Alles auswählen

ForEach(Editor_Boden())
            LineXY(Editor_Boden()\x1,Editor_Boden()\y1,Editor_Boden()\x2,Editor_Boden()\y2,RGB(0,0,0))
            temp = Sqr(((Editor_Boden()\x2-Editor_Boden()\x1)*(Editor_Boden()\x2-Editor_Boden()\x1))+((Editor_Boden()\y2-Editor_Boden()\y1)*(Editor_Boden()\y2-Editor_Boden()\y1)))
            For i = 40 To 1 Step -1
              LineXY(Editor_Boden()\x1-(((Editor_Boden()\y2-Editor_Boden()\y1)/temp)*i),Editor_Boden()\y1+(((Editor_Boden()\x2-Editor_Boden()\x1)/temp)*i),Editor_Boden()\x2-(((Editor_Boden()\y2-Editor_Boden()\y1)/temp)*i),Editor_Boden()\y2+(((Editor_Boden()\x2-Editor_Boden()\x1)/temp)*i),RGB(200-(i*3.55),200-(i*1.425),200-(i*3.6)))
            Next
          Next
Ich hab schon etwas zusammengecoded, blos das funkt irgendwie vorne und hinten nicht. Je waagrechter die Urlinie ist, desto exakter sind die neuen Linien auch 1px voneinander entfernt. Je senkrechter die Urlinie wird, desto weiter entfernen sie sich voneinander.
[/color]
Problem gelöst von Stargate :D
2. Wie kann ich einen Punkt zwischen der neuen und der Urlinie herausfinden, über den ich dann den FillArea-Befehl ausführen kann?

Bild

So, und als wären diese Probleme noch nicht genug, hier gleich noch eins:

Ich sagte ja, dass die Urlinien aneinander hängen (sprich die 2. Linie hat die gleichen 1. Koordinaten wie bei der 1. Linie die 2. Koordinaten)

Bild

Jetzt will ich, dass wenn die 2 Urlinien nicht parallel zueinander sind, dass sich dann die neuen Linien auch miteinander verbinden, und nicht überlappen bzw eine Lücke entsteht.

Bild

Könnt ihr mir bei diesem Problem auch helfen?

Ich weiß, das sind viele Fragen auf einmal, aber ich probier hier nun schon seit Nachmittag rum, aber komm einfach nicht drauf. Ich dachte, mit dem Wissen, mit dem ich die Realschule vor n paar Monaten verlassen habe, schaff ich das alles, aber irgendwie ja dann doch nicht :-/

Ich würde mich sehr freuen, wenn ihr mir hier weiterhelfen könntet.

Vielen Dank!

P.S. Ich hoffe, ihr versteht den Text, und die Zeichnungen *g*

Verfasst: 02.09.2006 00:25
von STARGÅTE
1.

Code: Alles auswählen

       

b.f = 3.14159265/180
 
deX = x2-x1
deY = y2-y1
If deX = 0 :
 If deY <  0 : Winkel = -90 : EndIf
 If deY >= 0 : Winkel =  90 : EndIf
Else
 Winkel = ATan(deY/deX)/b
 If deX < 0 : Winkel + 180 : EndIf
EndIf

Winkel = Winkel + 90 

x1_Neu = x1+cos(Winkel*b)*Abstand
y1_Neu = y1+sin(Winkel*b)*Abstand
x2_Neu = y2+cos(Winkel*b)*Abstand
y2_Neu = y2+sin(Winkel*b)*Abstand

...
2.

Code: Alles auswählen

       
...

deX = x2_Neu-x1
deY = y2_Neu-y1
If deX = 0 :
 If deY <  0 : Winkel = -90 : EndIf
 If deY >= 0 : Winkel =  90 : EndIf
Else
 Winkel = ATan(deY/deX)/b
 If deX < 0 : Winkel + 180 : EndIf
EndIf

x_Zwischen = x1+cos(Winkel*b)*sqr(pow(x2_Neu-x1,2)+pow(y2_Neu-y1,2))/2
y_Zwischen = y1+sin(Winkel*b)*sqr(pow(x2_Neu-x1,2)+pow(y2_Neu-y1,2))/2

3.

Ich denke gerade drüber nach

Verfasst: 02.09.2006 01:00
von MCWulf
hi!

vielen dank für die schnelle Hilfe!

Das Ergebnis deines ersten Codes unterscheidet sich zwar nicht vom Ergebnis meinen Codes, trotzdem werde ich weiter deinen benutzen, da er irgendwie professioneller ausschaut ;)

Der 2. Code funktioniert auch wunderbar, blos leider zwingt er bei 40 Flächen zum Füllen pro Frame das Spiel ganz schön in die Knie. Gibts da irgendwas einfacheres vielleicht?

Vielen Dank für die tolle Hilfe!

(Lol, mir is noch nie aufgefallen, dass ich immer am anfang und ende von meinen posts fast das gleiche stehn hab xD)

Verfasst: 02.09.2006 01:09
von STARGÅTE
das hier verstehe ich aber nicht :
Je waagrechter die Urlinie ist, desto exakter sind die neuen Linien auch 1px voneinander entfernt. Je senkrechter die Urlinie wird, desto weiter entfernen sie sich voneinander.
dann liegt es vllt daran das du den Abstand falsch berechnest , könnte ich das mal sehen ?

Verfasst: 02.09.2006 01:13
von MCWulf
naja, das problem hab ich schon gelöst, war einfach nur n dummer leichtsinnsfehler von mir, wo ich vergessen hab x durch y zu ersetzen ^^ eigentlich haperts etz nur noch am 3. problem... -.- ich hätte in mathe echt besser aufpassen solln

Verfasst: 02.09.2006 01:39
von STARGÅTE
gut für das dritte habe ich schon was im kopf, ich bin aber total müde, habe schon die anderen Tage bis 2 gemacht und das in der Schulzeit :roll:

Meine Idee, die ich noch CODEN werden:
- von beiden Linien Winkel berechnen
- die Differenz duchr 2 teilen
- diesen Wert dann nehmen um die kleinen stückchen mit tan(Wert*b)*aktuellerAbstand

Dann würdest du bei jeder Zwischengerade ein Stückchen ranhängen damit es keine lücken gibt.

Wie gesagt ich schreibde di den CODE "heute" Nachmittag

Verfasst: 02.09.2006 01:41
von MCWulf
boar, vielen vielen dank!! du weißt gar ned, wie viel du mir damit hilfst! freu mich schon :)

Verfasst: 02.09.2006 14:24
von STARGÅTE
könntest du mir mal den Teil von dir schicken wo du die Zwischen geraden machst ?

Das brauche ich damit ich diesen CODE verändern kann, sonst wird das nur so ne stückellei ^^

Verfasst: 02.09.2006 16:05
von MCWulf
zwischengeraden? :? kp was du damit meinst, aber ich hab jetzt ein anderes system genommen, und zwar hab ich den boden als sprite geladen, ihn in ein sprite3d umgewandelt, und transform ihn nun immer an die richtigen stellen. sprich jetzt brauch ich nur noch 4 punkte, 2 hab ich ja schon, die anderen 2 müssen irgendwie berechnet werden, damit sich die ränder auch richtig treffen...

Verfasst: 02.09.2006 16:14
von ts-soft
PS: Ab und zu mal Return wäre nett, der Thread ist ja schon 2 Meter breit :wink: