Christian+ hat geschrieben:Dabei kam der folgende Quellecode raus

Gefällt mir besser als mein eigener.

Ich habe noch ein paar kleine Änderungsvorschläge für die Prozedur
FindSquares().
Eine kosmetische Änderung:
Hier würde ich nicht den Standardtyp auf
.i setzen, weil anschließend die folgenden Variablen ohnehin einzeln als
.Point deklariert werden. Meines Erachtens besser lesbar:
oder
Hier ist eine kleine Zeitersparnis möglich:
Code: Alles auswählen
;schauen ob Punkt c im Array
For c = a+1 To n
;Punkt c berechnen
z\x = p(b)\x-vektor\y
z\y = p(b)\y+vektor\x
Die Berechnung muss nicht bei jedem Schleifendurchlauf neu erfolgen, sie braucht nur 1x vor Beginn der
For/Next-Schleife ausgeführt zu werden. (Weil
z aber auch noch später für den Vergleich mit
p(d) verwendet wird, braucht man dafür eine zusätzliche Variable.)
Insgesamt sieht das bei mir dann so aus:
Code: Alles auswählen
EnableExplicit
Macro ShowSquare
LineXY(p(a)\x, p(a)\y, p(b)\x, p(b)\y, RGB(0,0,255))
LineXY(p(b)\x, p(b)\y, p(c)\x, p(c)\y, RGB(0,0,255))
LineXY(p(c)\x, p(c)\y, p(d)\x, p(d)\y, RGB(0,0,255))
LineXY(p(d)\x, p(d)\y, p(a)\x, p(a)\y, RGB(0,0,255))
Debug "Quadrat:"
Debug "A(" + Str(p(a)\x) + "|" + Str(p(a)\y) + ")"
Debug "B(" + Str(p(b)\x) + "|" + Str(p(b)\y) + ")"
Debug "C(" + Str(p(c)\x) + "|" + Str(p(c)\y) + ")"
Debug "D(" + Str(p(d)\x) + "|" + Str(p(d)\y) + ")"
Debug ""
EndMacro
Procedure FindSquares (Array p.Point(1))
Protected.i a, b, c, d ; Punkte eines Quadrats
Protected.Point vektor, c_, d_
Protected.i n = ArraySize(p())
For a = 0 To n-1
For b = a+1 To n ; für alle noch nicht geprüften Punkte
; Vektor von a nach b ermitteln
vektor\x = p(b)\x - p(a)\x
vektor\y = p(b)\y - p(a)\y
; Punkt c_ berechnen
c_\x = p(b)\x - vektor\y
c_\y = p(b)\y + vektor\x
; schauen ob Punkt c_ im Array ist
For c = a+1 To n
If p(c)\x = c_\x And p(c)\y = c_\y
; Punkt d_ berechnen
d_\x = p(a)\x - vektor\y
d_\y = p(a)\y + vektor\x
; schauen ob Punkt d_ im Array ist
For d = a+1 To n
If p(d)\x = d_\x And p(d)\y = d_\y
ShowSquare
Break 2 ; nächsten Punkt B prüfen
EndIf
Next d
EndIf
Next c
Next b
Next a
EndProcedure
Define.i image, i
Dim p.Point(29)
p(0)\x = 100 : p(0)\y = 80
p(1)\x = 80 : p(1)\y = 180
p(2)\x = 80 : p(2)\y = 220
p(3)\x = 260 : p(3)\y = 160
p(4)\x = 240 : p(4)\y = 180
p(5)\x = 160 : p(5)\y = 240
p(6)\x = 100 : p(6)\y = 40
p(7)\x = 80 : p(7)\y = 200
p(8)\x = 180 : p(8)\y = 140
p(9)\x = 80 : p(9)\y = 60
p(10)\x = 120 : p(10)\y = 140
p(11)\x = 260 : p(11)\y = 80
p(12)\x = 40 : p(12)\y = 260
p(13)\x = 220 : p(13)\y = 60
p(14)\x = 200 : p(14)\y = 260
p(15)\x = 40 : p(15)\y = 160
p(16)\x = 60 : p(16)\y = 200
p(17)\x = 260 : p(17)\y = 200
p(18)\x = 160 : p(18)\y = 160
p(19)\x = 100 : p(19)\y = 200
p(20)\x = 80 : p(20)\y = 260
p(21)\x = 140 : p(21)\y = 160
p(22)\x = 40 : p(22)\y = 220
p(23)\x = 200 : p(23)\y = 220
p(24)\x = 260 : p(24)\y = 180
p(25)\x = 160 : p(25)\y = 220
p(26)\x = 160 : p(26)\y = 200
p(27)\x = 220 : p(27)\y = 80
p(28)\x = 60 : p(28)\y = 160
p(29)\x = 40 : p(29)\y = 100
OpenWindow(#PB_Any, 100, 100, 300, 300, "Quadrate finden")
image = CreateImage(#PB_Any, 300, 300)
StartDrawing(ImageOutput(image))
Box(0, 0, 300, 300)
FindSquares(p())
For i = 0 To ArraySize(p())
Circle(p(i)\x, p(i)\y, 1, RGB(0,0,0))
Next
StopDrawing()
ImageGadget(0, 0, 0, 300, 300, ImageID(image))
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Christian+ hat geschrieben:da ich denke dass das eventuell schneller sein sollte auch wenn das nicht so wichtig ist da allzu große Mengen an Punkten ich der Funktion nicht als Input geben werde
Ja OK, aber vielleicht hat später mal jemand anderes Bedarf für solchen Code, und derjenige muss evtl. doch größere Mengen an Punkten verarbeiten. Immerhin steigt momentan die Laufzeit ungefähr mit der 4. Potenz der Punktanzahl, das ist ziemlich ungünstig. Ich habe noch eine Idee zur Beschleunigung des Codes, aber die will ich erstmal prüfen.
Grüße, Nino