Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - S. P. Gardebiter

#1
Nichts für Ungut aber das ist Stoff den man in der Mittelstufe (8. bis 10. Schulklassen) lernt.
Gerade für 2D Sachen ist es empfehlenswert da fit zu sein. In vielen Fällen kommt man nicht drum herum oder nur mit sehr komplizierten Algorithmen.
Falls du Schwierigkeiten beim Verständnis hast, kannst du ggf. hier nachlesen:
https://www.gut-erklaert.de/mathematik/x-y-koordinatensystem-mit-punkte.html
https://www.gut-erklaert.de/mathematik/satz-des-pythagoras.html

Es gibt mit Sicherheit auch mathematisch elegantere Wege das Ganze zu lösen. Wenn es sich dabei jedoch um eine Tabelle mit Entfernungen soll die in sich logisch ist, würde ich ad-hoc stark vermuten, dass es zumindest keinen simpleren Weg gibt.

Vielleicht hilft dir ja etwas Code. Da ich in GLB etwas eingerostet bin, hier Pseudocode:
Code (glbasic) Select

size = 10

FOR n = 0 TO size - 1
     px[n] = RND(10)
     py[n] = RND(10)
NEXT

FOR n1 = 0 TO size - 1
     FOR n2 = 0 TO size - 1
          IF n1 <> n2 THEN
               IF d[n2, n1] > 0 THEN
                    d[n1, n2] = d[n2, n1]
               ELSE
                    d[n1, n2] = SQR(POW(px[n1] - px[n2], 2) + POW(py[n1] - py[n2], 2))
               ENDIF
          ENDIF
     NEXT
NEXT


Liebe Grüße.
#2
Ich würde dir zu einer geometrischen Lösung raten, da sie einfach nachvollziehbar ist.
Zunächst solltest du zufällige x und y Koordinaten zu deinen Punkten generieren.

Dann kannst du die Distanz zwischen zwei Punkten wie folgt ausrechnen:

d = √((x1 - x2)² + (y1 - y2)²)

Es handelt sich hierbei um die Pythogoras Formel (a² + b² = c²):
Die Länge der Seite a ist hierbei die Differenz zwischen den beiden x-Werten deiner Punkte und die Länge der Seite b ist die Differenz zwischen den y-Werten.
Kurz gesagt, bei dir ist a = x1 - x2 und b = y1 - y2.
Zum Schluss kannst du die Punkte quadrieren, addieren und danach die Wurzel ziehen, dann hast du deinen Wert für c, was bei dir die Distanz zwischen den beiden Punkten ist.

Die Logik dahinter: Du konstruierst ein Dreieck anhand deiner beiden Punkte und kannst so die Distanz über die Ermittlung der dritten, längsten Seite deines Dreiecks ausrechnen.

Wenn du jetzt deine Schleife programmierst, kannst du noch folgende Optimierungen vornehmen:

  • Wenn deine beiden Punkte gleich sind (beide Schleifenvariablen haben den selben Wert), dann ist die Distanz immer 0, das ist die Diagonale in deiner Tabelle.
  • Du kannst die beiden Schleifenvariablen als Indizes vertauschen und schauen ob in deiner Tabelle bereits ein Wert vorhanden ist, wenn ja, dann brauchst du die Distanz nicht neu ausrechnen, sondern nur innerhalb der Tabelle kopieren (von A nach B ist die selbe Distanz wie von B nach A).

Ich hoffe ich konnte dir helfen.

Liebe Grüße.
#3
Danke, jetzt müsste es funktionieren.
#4
Gibts schon irgendwas neues?
Solange ich das nicht hinkriege, liegt mein Projekt auf Eis. :/

Code (glbasic) Select
// --------------------------------- //
// Project: BesEngine
// Start: Tuesday, September 20, 2011
// IDE Version: 10.113

GLOBAL DebugMode% = TRUE
GLOBAL EditMode% = TRUE
GLOBAL NetMode% = TRUE
GLOBAL ScreenW% = 640
GLOBAL ScreenH% = 480
GLOBAL Zoom% = 1
GLOBAL Fullscreen% = FALSE
GLOBAL FPS% = 60
GLOBAL GameTime%


SETSCREEN ScreenW, ScreenH, Fullscreen // Setup Screen
SYSTEMPOINTER TRUE // Disable Mousepointer
LIMITFPS FPS // Limit FPS
AUTOPAUSE FALSE


GLOBAL NetSocket%
GLOBAL NetSocket_Listen%
GLOBAL NetPort% = 49152
GLOBAL NetMessage$
GLOBAL NetLength% = 256
GLOBAL NetRecieve%
GLOBAL NetError$
GLOBAL NetIP%


IF NetMode% = TRUE
IF SOCK_INIT() = FALSE
END
ELSE
NetSocket_Listen% = SOCK_TCPLISTEN(NetPort%)
IF NetSocket_Listen% = -1 THEN END
ENDIF
ENDIF


WHILE TRUE

NetSocket% = SOCK_TCPACCEPT(NetSocket_Listen%, NetIP%)

IF NetSocket% <> -1

NetRecieve% = SOCK_RECV(NetSocket%, NetMessage$, NetLength%)

PRINT NetSocket_Listen%, 16, 16
PRINT NetMessage$, 16, 32
PRINT NetRecieve%, 16, 48

ENDIF

IF NetSocket% = -1 THEN NetError$ = NETGETLASTERROR$()

PRINT NetError$, 16, 64
PRINT NetSocket%, 16, 80

SHOWSCREEN

WEND

IF NetMode% = TRUE
SOCK_CLOSE(NetSocket%)
SOCK_SHUTDOWN
ENDIF

END


Wieso gibt SOCK_TCPACCEPT immer nur -1 raus und nie was anderes und das obwohl VB.NET mir sagt, es konnte sich verbinden? :S
#5
Quote from: Ocean on 2011-Sep-20hast Du das denn schon gelöst? Dies erscheint mir schwieriger als die IPC über TCP/IP...

Du machst wohl Witze O:

Code (glbasic) Select
        Dim MyGame As New Process

        ' Prozessinformationen
        With MyGame.StartInfo
            .FileName = "D:\GLBasic\Games\MyGame\MyGame.exe"
            .UseShellExecute = True
            .Verb = "open"
        End With

        ' Starte Prozess
        MyGame.Start()
        MyGame.WaitForInputIdle()

        ' Programm in das Panel des Splitcontainers einbetten
        SetParent(MyGame.MainWindowHandle, sct_main.Panel2.Handle)

        ' Fenster Maximieren
        SendMessage(MyGame.MainWindowHandle, WM_SYSCOMMAND, SC_MAXIMIZE, 0)


Voher noch in einem Modul folgendes importieren:

Code (glbasic) Select
    ' Api Funktionen
    Public Const WM_SYSCOMMAND As Integer = 274
    Public Const SC_MAXIMIZE As Integer = 61488
    Declare Auto Function SetParent Lib "user32.dll" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As Integer
    Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer


Und fertig ist die Kiste :) Kinderleicht das ganze.

Quote from: backslider on 2011-Sep-20Wenn ich nachher eine Lösung habe, sage ich bescheid... Verspreche aber nichts. ;)

Das ist nett, danke :)
#6
Habs versucht und bin gescheitert - Fehler 10057.
Ich weiß nichtmal wie ich das ganze anstellen soll, die Hilfe ist da eher verwirrend für mich, überall werden irgendwelche Sockets wiedergegeben für irgendwas und ich habe keine Ahnung worum es überhaupt geht. Zuerst mach ich ein SOCK_INIT, danach ein SOCK_TCPLISTEN - funktioniert nicht.

Mit VB.NET hab ich da weniger Probleme, da kann mein Programm sich zumindest verbinden :x (Da hab ich nur einen Client mit Stream und sende alles über einen Streamwriter)

Quote from: backslider on 2011-Sep-20Wieso zeichnest du deine GUI nicht erstmal in deinem VB.Net Programm und schreibst erst beim exportieren den GLB-Code dafür?

Ich habe ein fertiges VB.NET Programm und ein fertiges GLBasic Programm. Das VB.NET Programm bietet die GUI und bindet das GLBasic Programm in ein Panel ein. Die Programme sollen dann miteinander kommunizieren können, damit das VB.NET Programm dem GLBasic Programm sagen kann, was es zutun hat.
#7
Ich kann ja notfalls eine DLL über Inline C importieren.
Ich bin mir sicher, dass die NetBIOS Version in VB.NET auch nicht ohne externe DLL funktioniert ;)

Quote from: Schranz0r on 2011-Sep-19In den Prozess einklinken?

Wie jetzt?

Quote from: Schranz0r on 2011-Sep-19Sollen beide programme von dir sein?

Ja.

Edit: Es gibt doch NetBIOS Befehle in VB.NET, nagut, dann aber die anderen Sachen nicht :P
#8
Quote from: Kitty Hello on 2011-Sep-191. mach einen Port auf localhost auf und kommuniziere über TCP/IP.

Daran hatte ich auch schon gedacht. Allerdings ist das für mich wesentlich komplizierter als z.B. einen Weg über eine DLL zu gehen oder mit Shared Memory zu arbeiten. Ich kenne mich mit Sockets z.B. überhaupt nicht aus und verstehe von Netzwerk Programmierung noch nicht soviel. In VB.NET hatte ich schonmal etwas einfaches gemacht aber mit GLBasic noch nie. (Ausser mit den NET Befehlen)

Gibts vielleicht noch eine andere Möglichkeit? D:

Quote from: Kitty Hello on 2011-Sep-192. Mach AUTOPAUSE FALSE

Ah, danke. Das hatte ich völlig vergessen o:
#9
Hallo.
Ich arbeite momentan an einer Engine. Da es mit GLBasic schwierig ist und lange dauert, gute, saubere GUIs zu programmieren, möchte ich den entsprechenden Editor mit VB.NET schreiben und dann für Graphik das entsprechende GLBasic Programm einbinden. Der Editor und die Engine in Kombination müssen nur auf Windows lauffähig sein. (Anders sieht aus, wenns ums Spielen geht, dass sollte auch auf Linux und Mac möglich sein)

Jedenfalls habe ich momentan 2 Probleme:

1. Wie kann ich ein VB.NET Programm und GLBasic Programm kommunizieren lassen? (Shared Memory?)
2. Mit GLBasic kompilierte Programme sind nicht unbedingt für den Fenstermodus geeignet z.B. wird der Bildschirm komplett weiß, wenn das Fenster keinen Fokus hat. Und wenn man das Fenster wieder fokusiert, dauert es einige Zeit, bis das ganze lädt und wieder flüssig rendert. Der Cursor springt, wenn man auf das Programm in der Taskleiste klickt, etc. etc. Gibts da eine Möglichkeit, das ganze für den Fenstermodus etwas zu optimieren?
#10
Mit Version 10 funktioniert alles super, musste nichtmal was in meinem Spiel ändern.
Vielen dank Gernot :)

Allerdings sind exe Dateien in Version 10 auch über 100 kb größer O:
Mein Programm mit 460 Befehlen ist bereits über 1,3 MB groß. Naja, 'seis drum.
#11
Hi.
Sorry für die späte Antwort, die letzten beiden Wochen waren extrem stressig.

Bei mir funktioniert das leider garnicht :/ Der nimmt garkeinen Tastendruck von mir an, zumindest solange da eine For/Next Schleife drin ist.

Wenn ich die Schleife rausnehme, nimmt der komischerweise immernoch nicht alle Anschläge an sondern verschluckt viele einfach ganz :/ Sogar wenn ich Sleep auf 1 setze.

Edit: Irgendwas stimmt mit Inkey$ nicht, wenn ich meine (schlechte) selbstgeschriebene "Nachahmungsfunktion" benutze, funktioniert alles bestens.
#12
Nein, genau das gleiche wie eben auch O:

Edit: So, hab mal meine Funktion "getuned", hier ist das Ergebnis:

(zur besseren Übersicht entfernt)

Korrekt müsste es heißen: "Hallo, ich bin S. P. Gardebiter"
Manchmal verschluckt er auch noch mehr.
Wahrscheinlich hatte Schranzor recht, ich schaffe bestimmt keine 2 Zeichen pro Frame. Aber dennoch verschluckt er einiges. Wie lange brauch er denn um den Buffer zu leeren?


Edit edit: Vergesst es, ich bin dumm. Der Buffer von INKEY$ funktioniert nicht korrekt, INKEY$ gibt immer nur eine Taste raus und das kann ich auch beweisen:
Ich habe mir gerade eine schrottige Funktion geschrieben die ähnlich wie INKEY$ funktioniert: Sie überprüft ob eine Taste gedrückt worden ist und gibt dann die jeweiligen Buchstaben zurück.
Hier war es genau das gleiche Problem wie bei INKEY$, es wurden Tastaturanschläge verschluckt, also dachte ich mir, anstatt die Buchstaben gleich zurück zu geben, speichere ich sie nacheinander in eine Variable und gebe sie dann aus.
Ergebnis war folgendes:

http://tile44.org/files/Console.log

Ok, beim ersten Satz ein paar Tippfehler sonst aber völlig okay, was jetzt schon auffällt ist aber: Ich schaffe es tatächlich manchmal 2 Buchstaben pro Frame zu schreiben. Auch sind teilweise die Abstände zwischen 2 Buchstaben nur 2 Frames groß.

Nun wird es aber interessant:

"SPG~0: viel zu shcnell"

Nein, diesmal kein Tippfehler. Ich überprüfe die "h" Taste vor der "c" Taste und da ich beide in einem Frame geschrieben habe wird das h einfach vor das c gesetzt wegen des Codes.

"SPG~0: ich tipe zu schnell"

Da, wieder, kein Tippfehler. Das "p" ist nur einmal da und da ich keinen Buffer bei der Funktion benutzt habe, weiß ich nicht wie oft das "p" in einem Frame benutzt wurde. Daher wird auch nur eins angefügt.

"SPG~0: viel zu schnel"

Das gleiche, nur diesmal mit dem "l".
Das erklärt auch die auffallend hohe Fehlerquote bei Wörten die zwei gleiche Buchstaben nebeneinander haben: Hier kann ich viel schneller reagieren und es durchaus in einem Frame schaffen zwei Buchstaben hintereinander zu schreiben. Bei den anderen Dingen war es halt mehr oder weniger Glück wenn ich es geschafft habe, d.h.: Der Buffer von INKEY$ ist verbuggt.
#13
Ah, okay, mit dem neuen Code funktioniert es schonmal viel besser, allerdings noch nicht perfekt. Wenn das nächste Update draußen ist, werden wir es ja sehen :)
Danke für eure Hilfe.

Edit: Ich bin mir nicht mehr so sicher ob das überhaupt etwas verändert hat. Ich habe mir eine Funktion geschrieben, mit der ich überprüfen kann wie oft er die Schleife durchläuft. Wenn ich zähle wie oft er durchläuft komme ich oft nur auf "1", selten mal auf "2". Habe auch überprüft ob die Schleife jeden Frame durchläuft und das tut sie. Sicher, dass der Buffer oder irgendwas ähnliches nicht verbuggt ist? o: Wenn ich zwei Tasten gleichzeitig drücke wird nur einer der beiden Buchstaben auf den Bildschirm geschrieben.
#14
Quote from: Schranz0r on 2011-May-30Ich kann mir nur vorstellen, das dein Code ab und an mal das Schreiben überspringt?

Das halte ich zu 100% für ausgeschlossen. o:
Dann könnte es nämlich nur an meiner KeyHit Funktion liegen und wenn die rumspinnt, würde er die Eingabe automatisch bestätigen.

Quote from: Schranz0r on 2011-May-30Spiel doch mal mit den FPS rum, LIMITFPS -1 und teste es nochmal, oder ich liege falsch und du musst mit den FPS runter?!

Ich komme leider nicht über 72 FPS, obwohl ich es eigentlich müsste. (Früher gings ja auch) Mein Spiel läuft standardmäßig auf 60 FPS. Wenn ich die FPS erhöhe müsste sich aber eigentlich auch der INKEY$ Buffer schneller leeren, also beweist das nicht unbedingt irgendwas.

Edit: Bei mir ist die länge von INKEY$ auch immer nur 1, höchstens, mehr als einen Char scheint er nicht raus zu geben o:
Warum funktioniert eigentlich "^" so komisch mit INKEY$? Er gibt nur ein "^" raus wenn ich zweimal auf die Taste drücke und wenn ich einmal draufdrücke und dann auf eine andere z.B. auf die 1, dann gibt er anstatt "^1", garnichts raus.
#15
Uh but the problem is I tend to stay on the "safe side" so to say. I can sell programs created with GLBasic itself because I bought it and therefor Gernot grants me that right. But when it comes to the modificated version of the libary Moru is the author and that's why he owns the rights, aslong as he didn't released it as PD (or something simular) or handling the rights over to Gernot. Same for PeeJay. Means: If I'm ever going change my mind and sell my game I either have to ask all the owners of the 3rd party libaries and make some kind of contract or I don't use any libaries from the beginning O: