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

Für allgemeine Fragen zur Programmierung mit PureBasic.
MCWulf
Beiträge: 23
Registriert: 21.03.2005 23:26
Kontaktdaten:

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

Beitrag 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*
Zuletzt geändert von MCWulf am 02.09.2006 21:42, insgesamt 3-mal geändert.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
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
MCWulf
Beiträge: 23
Registriert: 21.03.2005 23:26
Kontaktdaten:

Beitrag 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)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ?
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
MCWulf
Beiträge: 23
Registriert: 21.03.2005 23:26
Kontaktdaten:

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
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
MCWulf
Beiträge: 23
Registriert: 21.03.2005 23:26
Kontaktdaten:

Beitrag von MCWulf »

boar, vielen vielen dank!! du weißt gar ned, wie viel du mir damit hilfst! freu mich schon :)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ^^
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
MCWulf
Beiträge: 23
Registriert: 21.03.2005 23:26
Kontaktdaten:

Beitrag 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...
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

Beitrag von ts-soft »

PS: Ab und zu mal Return wäre nett, der Thread ist ja schon 2 Meter breit :wink:
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
Antworten