BlitzQuiz - AUFLÖSUNG: Geheime Bild-Botschaften

Übersicht Sonstiges Projekte

Gehe zu Seite Zurück  1, 2, 3, 4, 5  Weiter

Neue Antwort erstellen

Sir Gauss der III

BeitragDo, Mai 19, 2011 0:35
Antworten mit Zitat
Benutzer-Profile anzeigen
die beiden interessieren mich auch mal.

Durch den anreiz, die schnellste Lösung zu finden, hab ich mich mal an die Aufgabe gemacht. Das erste programm benötigt ~120, das verbesserte dann ~60 Millisecs. Naja, für dir reine Prüfaufgabe. für alles zusammen so um die 350.

an die 30 bin ich nicht ran gekommen. Sad

Tipp: Debugger ausgeschaltet? das bringt so einiges.

Jetzt bin ich halt auf das Ergebniss gespannt

ToeB

BeitragDo, Mai 19, 2011 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich es über Rekursion löse, und ich für jeden Funktionsaufruf ca 6.7ms brauche, dauert es ohne Debugger bei mir ca 13.5 Sekunden -.-

Aber ich hab es auch denke ich mal ziemlich umständlich gelöst, ich denke mir mal ne neue Lösung aus ^^

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Der Eisvogel

BeitragDo, Mai 19, 2011 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab das heute mal in der Schule gemacht, und ich komme ohne Debugger ebenfalls auf 30ms. Jedoch denke ich, dass das auch stark mit der verwendeten Hardware zusammenhängt wie schnell das ist. Z.B.: Hat es auf meinen Schulrechnern, mit etwas älterer Hardware satte 110ms im Schnitt gedauert.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

darth

BeitragDo, Mai 19, 2011 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

genau aus solchen Gründen ergibt es auch überhaupt keinen Sinn die Laufzeit seines Programmes anzugeben. "Mein Programm braucht 50ms" ist eine völlig leere Aussage. Da kommts auf die Maschine an, was gerade läuft, die Temperatur und den Gemütszustand des Programmierers.
Viel interessanter wäre es, das LaufzeitVERHALTEN zu kennen. Das Bild ist schon ziemlich gross, vllt könnte man mit einem kleineren Bild beginnen und das dann immer grösser machen und sich einen Plot zeichnen lassen, wie sich die Laufzeit im Schnitt ändert. SOWAS wäre aussagekräftig.

MfG,
Darth
Diese Signatur ist leer.

grafe

BeitragFr, Mai 20, 2011 0:01
Antworten mit Zitat
Benutzer-Profile anzeigen
@Darth da hast du recht, deshalb
user posted image
Wink
Eine kleine Erklärung hierzu:
Die Breite des Graphen ist die Grösse des Bildes in der Höhe (1 bis 600)
Die Höhe des Graphen sind die Millisekunden die mein Programm gebraucht hat

Ich hab jetzt einfach die Bilder die er durchsucht aus dem vorgegebenem Bild von oben links weg herausgeschnitten.

Falls ihr noch höhere Werte wie bis zu einer Grösse von 800x600 Pixeln sehen wollt, brauch ich ein grösseres Bild Laughing .

mfg Grafe

Noobody

BeitragFr, Mai 20, 2011 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn wir schon dabei sind, Laufzeiten zu vergleichen: Mein Programm läuft in 0-1ms durch Razz

Zugegebenermassen habe ich es in BMax geschrieben, eine B3D-Version mache ich aber vielleicht noch zum Vergleich.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

skey-z

BeitragFr, Mai 20, 2011 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
@Noobody
Ich weiß ja, dass du (programmierteschnisch) ein Freak bist, aber 0-1 ms, in der Zeit lese ich das Bild gerade mal aus, da habe ich aber noch kein Rechteck gefunden (i3M330@2.13GHz, 4GB Ram)

Ich habe es bisher auch nur in BM versucht, da es mir für diesen Zweck auch schneller erscheint

[Edit]
Ok, 16ms, habe es mit eigenen Bildern überprüft und das Ergebnis müsste somit passen.

Verdammt, das Kleingedruckte überlesen, mein Code unterscheidet nciht zwischen Quadraten und Rechtecken, da muss ich wohl noch mal ran Wink
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

ToeB

BeitragFr, Mai 20, 2011 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Man ich will die Auflösung jetzt mal haben hier ich kann das nicht fassen oO

Und ich war so stolz auf meine Lösung !

Ich fang glaub ich nochmal in Bmax an ...


mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

mpmxyz

BeitragFr, Mai 20, 2011 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe jetzt auch einmal ein entsprechendes Programm in BlitzMax programmiert.
Der Algorithmus ohne das Laden des Bildes - hier lahmt die Festplatte - braucht etwa 10 ms.
Zum Vergleich: Mein PC braucht zum Durchiterieren des Bildes 2 bis 3 ms. (Schleifen ohne Inhalt)
Hier ist das Laufzeitverhalten:
user posted image
Eine Frage: Ist das Ergebnis eine runde Zahl? (Ich bin zu faul, mein Programm mit eigenen Bildern zu testen. Wink)
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

BlitzMoritz

BeitragFr, Mai 20, 2011 21:37
Antworten mit Zitat
Benutzer-Profile anzeigen
mpmxyz hat Folgendes geschrieben:
Eine Frage: Ist das Ergebnis eine runde Zahl?

Ich weiß nicht, welche Zahl für dich "rund" ist, vielleicht die 0 oder die 8? Laughing
Bitte keine Ergebnisse öffentlich vorzeitig verraten, habt doch wenigstens eine Woche Geduld. Viele haben mir ihr Ergebnis per PN geschickt, das kannst du ja dann auch machen.
Deine Frage nach der "runden Zahl" lässt die Insider vielleicht vermuten, dass du wie s-key eventuell nicht das Kleingedruckte zuende gelesen hast Wink

Noobody

BeitragFr, Mai 20, 2011 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
mpmxyz hat Folgendes geschrieben:
Zum Vergleich: Mein PC braucht zum Durchiterieren des Bildes 2 bis 3 ms. (Schleifen ohne Inhalt)


Folgender Code benötigt bei dir 2-3ms? BlitzMax: [AUSKLAPPEN]
For Local X:Int = 0 Until 800
For Local Y:Int = 0 Until 600
Next
Next
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

ToeB

BeitragFr, Mai 20, 2011 22:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich Frag mich wie ihr in 2-3ms das komplette Bild durchgehen könnt (einfach nur die Schleife ohne Auslesen etc.). Dieser Code braucht bei mir schon 17ms :
BlitzMax: [AUSKLAPPEN]
Global Image_Source:TPixmap = LoadPixmap( "BlitzQuiz-Quadrate.png" )

Local pix_x:Int, pix_y:Int, time_need:Int = MilliSecs( )
For pix_x = 0 To Image_Source.width-1
For pix_y = 0 To Image_Source.height-1
Next
Next
time_need = MilliSecs( ) - time_need
Print "Time : "+time_need


Mal davon abgesehen ob das der richtige Lösungsansatz ist oder nicht, wie krigt ihr diese Zeiten hin ?

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

skey-z

BeitragFr, Mai 20, 2011 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke, dass es daran liegt, dass du jedes mal auf eine Methode oder Funktion der Pixmap zufgreifst, zieht an der Performance, speichere die Werte vorher, so habe ich es auch gemacht.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

ToeB

BeitragFr, Mai 20, 2011 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, selbst der code :
BlitzMax: [AUSKLAPPEN]
Local pix_x:Int, pix_y:Int, time_need:Float = MilliSecs( )
Local a:Int = 100, i:Int

For i = 1 To a

For pix_x = 0 Until 799
For pix_y = 0 Until 599
Next
Next

Next
time_need = Float(MilliSecs( ) - time_need) / Float( a )
Print "Time : "+time_need


Gibt mir bei 100 durchläufen durschnittlich ~15ms zurück... Entweder mein Prozessor ist einfach zu Lahm oder iwas stimmt da wirklich nicht...

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Sir Gauss der III

BeitragSa, Mai 21, 2011 0:26
Antworten mit Zitat
Benutzer-Profile anzeigen
B3D (ka ob Bmax das auch so kann)

Code: [AUSKLAPPEN]
For a=0 to breite step x
...
next


benötigt ja schon mal wieder was weniger.

Denoch bin ich mal gespannt, wie hier so die enormen Zeiten zustande kommen

BlitzMoritz

BeitragSa, Mai 21, 2011 0:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich fasse 'mal die drei grundsätzlichen, bereits mehr oder weniger direkt genannten Gründe für mögliche Unterschiede in den gemessenen Geschwindigkeiten zusammen:

1.) Völlig unterschiedliche technische Gegebenheiten der Hardware und momentane Auslastungen verbieten den direkten Vergleich gemessener Millisekunden.
darth hat Folgendes geschrieben:
Da kommts auf die Maschine an, was gerade läuft, die Temperatur ...

2.) Die Effizienz des Lösungsalgorithmus
ToeB hat Folgendes geschrieben:
Aber ich hab es auch denke ich mal ziemlich umständlich gelöst, ich denke mir mal ne neue Lösung aus ^^

3.) Unterschiedliche Auffassungen darüber, ab wann die Zeitmessung zu beginnen hat. Manch' einer misst ganz zu Beginn beim Programmstart, ein anderer erst wenn das Bild geladen ist ...
mpmxyz hat Folgendes geschrieben:
Der Algorithmus ohne das Laden des Bildes - hier lahmt die Festplatte - braucht etwa 10 ms.
und ein dritter gar, wenn bereits alle Farbdaten in Arrays eingelesen wurden und erst danach die eigentliche Suche beginnt. Ich denke, da liegt der Hase im Pfeffer. Ohne Übereinkunft bzw. einsehbarer Code ist daher keine Vergleichbarkeit gegeben.

Nur Punkt 2) sollte das Potential zum Wetteifern haben - das wird sich dann mit den in drei Tagen (hoffentlich zahlreich Smile ) veröffentlichen Codes zeigen und diskutierbar sein.
Und damit sei der Geschwindigkeitsschwanzvergleich erst einmal in die Warteschleife gebracht, wobei hier ja umgekehrt gilt: je kürzer desto besser Laughing

__________________________________________________________________________
__________________________________________________________________________
Edit: Genau eine Woche ist vergangen, da will ich nun 'mal ganz still und heimlich bekanntgeben ....


Auflösung des zweiten Quiz' "Quadrate zählen":

Das Bild enthält insgesamt 2000 Rechtecke, von denen 659 die gesuchten Quadrate sind.
(Wer das rein-weiße Gesamtbild mitgezählt hat, kommt auf 2001 Rechtecke)

Hier mein eigener Lösungscode: Es lebe die rekursive Funktion, yeah Wink
BlitzMax: [AUSKLAPPEN]
Global RechtsX%, UntenY%, PM:TPixmap = LoadPixmap("BlitzQuiz-Quadrate.png")
Local PMWidth% = PixmapWidth(PM)
Local PMHeight% = PixmapHeight(PM)
Global ReadARGB%[PMWidth,PMHeight]
For Local i% = 0 Until PMWidth
For Local j% = 0 Until PMHeight
ReadARGB[i,j] = ReadPixel(PM, i, j)
Next
Next '... das war bisher nur das Einlesen der Daten ...
Local Quadratanzahl%, Rechteckanzahl%, time% = MilliSecs() 'die eigentliche Rechteck-Suche beginnt erst jetzt, ätsch ... Wink
For Local x% = 0 Until PMWidth
For Local y% = 0 Until PMHeight
If ReadARGB[x,y] <> -1 Then 'Falls die Pixelfarbe nicht rein weiß ist, hat man ein Rechteck aufgespürt
RechtsX = x
UntenY = y 'dessen Ausmaße man jetzt analysiert und gleichzeitig "ausradiert":
FarbflaechenRekursion(x, y, ReadARGB[x,y])
Rechteckanzahl:+1
If RechtsX - x = UntenY - y Then Quadratanzahl:+1
End If
Next
Next
Print "Nach " + (MilliSecs() - time) + " Millisekunden steht fest: Es gibt " + Rechteckanzahl + " Rechtecke, von denen " + Quadratanzahl + " Quadrate sind."
Function FarbflaechenRekursion(x%, y%, ARGB%) 'grenzt das gleichfarbige Areal ein und "radiert es weiß aus"
If ReadARGB[x,y] = ARGB Then 'falls die Pixelfarbe identisch ist, gehört sie anscheinend zum gleichen Viereck!
RechtsX = Max(RechtsX, x) 'Außenmaße aktualisieren
UntenY = Max(UntenY, y)
ReadARGB[x,y] = -1 'damit das gleiche Viereck nicht mehrmals gezählt wird, "färben wir es weiß"
FarbflaechenRekursion(x+1, y, ARGB) 'und suchen nach gleichfarbigen Nachbarpixeln, wobei es genügt,
FarbflaechenRekursion(x, y+1, ARGB) 'Rechts und Unten zu suchen, da es nur nicht-gedrehte Rechtecke gibt
End If 'und durch die Hauptschleife jedes Rechteck stets mit dem linken oberen Pixel aufgespürt wird.
End Function

Blitzprogger

BeitragDi, Mai 24, 2011 12:03
Antworten mit Zitat
Benutzer-Profile anzeigen
So ganz einfach editieren, dass niemand was mitkriegt - wie fies. Wink
Ich habe erst jetzt bemerkt, dass der Wettbewerb vorbei ist. Aber freuen tu ich mich, weil ich die richtige Lösung erhalten habe und möchte hier mal meinen sehr schlecht kommentierten Code präsentieren:
BlitzBasic: [AUSKLAPPEN]
AppTitle "Uber1337 Quadratezähler"
Graphics 800,600,32,2

Global nor,nog,nob,rgb
Global counterq,counterr,counter
Global pic = LoadImage ("BlitzQuiz-Quadrate.png")
Global time = MilliSecs ()

nor = 255
nog = 255
nob = 255
rgb = nor*$10000 + nog*$100 + nob

Local rgb3

SetBuffer ImageBuffer (pic)
LockBuffer ImageBuffer (pic)

For y = 1 To 599
For x = 1 To 799

rgb3 = ReadPixelFast (x,y)
r = (rgb3 And $FF0000)/$10000
g = (rgb3 And $FF00)/$100
b = rgb3 And $FF
If r = nor And nog = g And nob = b Then
Else
counter = counter + 1
Select ColorPart (x,y)
Case 1 counterq = counterq + 1
Case 0 counterr = counterr + 1
End Select
EndIf

Next
Next

UnlockBuffer ImageBuffer (pic)
SetBuffer FrontBuffer ()

DrawBlock pic,0,0

Color 0,0,0
Print "Anzahl Quadrate und Rechtecke: "+counter
Print "Anzahl Quadrate: "+counterq
Print "Anzahl Rechtecke: "+counterr
Print "Benötigte Zeit: "+(MilliSecs ()-time)
WaitKey ()
End

Function ColorPart (x,y)

Local rgb1,rgb2
Local r,g,b
Local width,length

rgb1 = ReadPixelFast (x,y)

endit = 0
Repeat
Repeat
rgb2 = ReadPixelFast (x+xx,y+yy,ImageBuffer (pic))
If rgb2 = rgb1 Then
WritePixelFast (x+xx,y+yy,rgb,ImageBuffer (pic))
If xx > width Then width = xx
If yy > length Then length = yy
;##################################################
;Diesen Teil entkommentieren um zu beobachten, wie der Code funktioniert
;##################################################
;UnlockBuffer ImageBuffer (pic)
;SetBuffer FrontBuffer ()
;DrawBlock pic,0,0
;Repeat
;Until KeyDown (28)
;SetBuffer ImageBuffer (pic)
;LockBuffer ImageBuffer (pic)
Else
r = (rgb2 And $FF0000)/$10000
g = (rgb2 And $FF00)/$100
b = rgb2 And $FF
If r = nor And g = nog And b = nob Then endit = 1
EndIf
ox = xx
xx = xx + 1
Until endit
If endit = 1 Then endit = 0
oy = yy
yy = yy + 1
xx = 0
rgb2 = ReadPixelFast (x,y+yy,ImageBuffer (pic))
If rgb2 = rgb1 Then
Else
r = (rgb2 And $FF0000)/$10000
g = (rgb2 And $FF00)/$100
b = rgb2 And $FF
If r = nor And g = nog And b = nob Then endit = 1
EndIf
Until endit

If width = length Then
Return 1
Else
Return 0
EndIf

End Function

Wenn hier noch die anderen ihren Code posten, sehe ich ihn mir gerne an, bin gespannt wie ihr das Rätsel gelöst habt!

mfg, Blitzprogger
Mein aktuelles Projekt, Irnithal: http://www.blitzforum.de/worklogs/415/

Unfreiwilliger Gewinner des BAC# 115. Wink

grafe

BeitragDi, Mai 24, 2011 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
So hier noch meinen Code:
BlitzMax: [AUSKLAPPEN]
SuperStrict


Local Image:TPixmap = LoadPixmap("BlitzQuiz-Quadrate.png")

Global Array:Int[PixmapWidth(Image), PixmapHeight(Image)]

Local tmpMilli:Int = MilliSecs()
Local tmpErgebniss:Int = SearchSquare(Image)
Local tmpZeit:Int = (MilliSecs() - tmpMilli)
Print "Es hat " + tmpErgebniss + " Quadrate auf dem Bild"
Print "Berechnungszeit: " + tmpZeit + " Millisekunden"

Function SearchSquare:Int(Image:TPixmap, X:Int = 0, Y:Int = 0, Art:Int = 0)
If X = 0 And Y = 0
For Local tmpX:Int = 0 Until PixmapWidth(Image)
For Local tmpY:Int = 0 Until PixmapHeight(Image)
Array:Int[tmpX, tmpY] = 0
Next
Next
End If

Local RectColor:Int = ReadPixel(Image, X, Y)
Local X2:Int = X
Local Y2:Int = Y

'#Region Rechteck Grösse ermitteln
Repeat
Local tmpColor:Int = ReadPixel(Image, X2, Y)
If tmpColor = RectColor
X2:+1
If X2 + 1 > PixmapWidth(Image)
Exit
EndIf
Else
Exit
EndIf
Forever

Repeat
Local tmpColor:Int = ReadPixel(Image, X, Y2)
If tmpColor = RectColor
Y2:+1
If Y2 + 1 > PixmapHeight(Image)
Exit
EndIf
Else
Exit
EndIf
Forever

Repeat
If X - 1 < 0
Exit
EndIf
Local tmpColor:Int = ReadPixel(Image, X - 1, Y)
If tmpColor = RectColor
X:-1
Else
Exit
EndIf
Forever

Repeat
If Y - 1 < 0
Exit
EndIf
Local tmpColor:Int = ReadPixel(Image, X, Y - 1)
If tmpColor = RectColor
Y:-1
Else
Exit
EndIf
Forever
'#End Region

Local tmpCount:Int
If Art = 0
If (X2 - X) = (Y2 - Y) Then tmpCount:+1 ' Falls Quadrat Zähler erhöhen
ElseIf Art = 1
If (X2 - X) <> (Y2 - Y) Then tmpCount:+1
ElseIf Art = 2
tmpCount:+1
EndIf
'#Region Neue Rechtecke Suchen


For Local tmpX:Int = X Until X2
For Local tmpY:Int = Y Until Y2
Local tmpColor:Int = ReadPixel(Image, tmpX, tmpY)
If tmpColor <> RectColor And Array[tmpX, tmpY] = 0
tmpCount:+SearchSquare(Image, tmpX, tmpY, Art)
EndIf
Next
Next
'#End Region

For Local tmpX:Int = X Until X2
For Local tmpY:Int = Y Until Y2
Array[tmpX, tmpY] = 1
Next
Next

Return tmpCount
End Function


Er ist nicht soo hübsch...

mfg Grafe

ToeB

BeitragDi, Mai 24, 2011 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab auch Rekursion Wink (FTW)
BlitzBasic: [AUSKLAPPEN]
Graphics 800, 600, 16, 2
SetBuffer BackBuffer( )

Global Image = LoadImage( "BlitzQuiz-Quadrate.png" ), Image_Buffer = ImageBuffer( Image )

Type Surface
Field x, y
Field w, h, d
Field col
Field quad
End Type

Global QuadCount = 0
Global RectCount = 0

LockBuffer Image_Buffer

Global Aufrufe = 0
Local ms = MilliSecs( )
GetSurfaces( Image_Buffer, 0, 0, ImageWidth( Image )-1, ImageHeight( Image )-1 )
ms = MilliSecs( ) - ms

UnlockBuffer Image_Buffer

Print "Time : "+ms+" ms"
Print "Calls : "+Aufrufe
Print "Time per Call : "+(Float(ms) / Float(Aufrufe))+" ms"

WaitKey( )

Local tmpSurface.Surface
Repeat
DrawBlock( Image, 0, 0, 0 )
Color( 255, 0, 0 )
For tmpSurface.Surface = Each Surface
Rect( tmpSurface\x, tmpSurface\y, tmpSurface\w, tmpSurface\h, 0 )
Next
Color( 0, 0, 0 )
Rect( 0, 0, 150, 40, 1 )
Color( 255, 255, 255 )
Text( 0, 0, "Quads : "+QuadCount )
Text( 0, 20, "Rects : "+RectCount )
Flip
Until KeyHit( 1 )
End


Function GetSurfaces( tmpBuffer, tmpX, tmpY, tmpW, tmpH, tmpBgColor=$FFFFFFFF, tmpD=0 )
;DebugLog "Suchtiefe momentan : "+tmpD+" {"+tmpX+"/"+tmpY+"}:{"+tmpW+"/"+tmpH+"} BGCOLOR : "+Hex( tmpBgColor )
Aufrufe = Aufrufe + 1

If tmpW < 3 Or tmpH <3 Or tmpD > 8 Then Return

Local tmpPixelX, tmpPixelY, tmpPixel, tmpSurface.Surface, tmpCheck=tmpBgColor
For tmpPixelX = tmpX To tmpW
For tmpPixelY = tmpY To tmpH
tmpPixel = ReadPixelFast( tmpPixelX, tmpPixelY, tmpBuffer )
If tmpPixel <> tmpBgColor Then
If tmpCheck = tmpBgColor Then
If CheckSurface( tmpPixelX, tmpPixelY, tmpPixel, tmpD ) Then
tmpSurface = GetRect( tmpBuffer, tmpPixelX, tmpPixelY, tmpPixel, tmpD )
GetSurfaces( tmpBuffer, tmpSurface\x, tmpSurface\y, tmpSurface\w, tmpSurface\h, tmpPixel, tmpD+1 )
tmpCheck = tmpPixel
EndIf
EndIf
Else
If tmpCheck <> tmpBgColor Then tmpCheck = tmpBgColor
EndIf
Next
Next

End Function

Function GetRect.Surface( tmpBuffer, tmpX, tmpY, tmpBgColor, tmpD )
Local tmpNX = tmpX
Local tmpNY = tmpY
Repeat
tmpNX = tmpNX + 1
Until ReadPixelFast( tmpNX, tmpY, tmpBuffer ) <> tmpBgColor
Repeat
tmpNY = tmpNY + 1
Until ReadPixelFast( tmpX, tmpNY, tmpBuffer ) <> tmpBgColor
Return AddSurface( tmpX, tmpY, tmpNX-tmpX, tmpNY-tmpY, tmpBgColor, tmpD )
End Function

Function AddSurface.Surface( tmpX, tmpY, tmpW, tmpH, tmpCol, tmpD )
Local tmpSurface.Surface = New Surface
tmpSurface\x = tmpX
tmpSurface\y = tmpY
tmpSurface\w = tmpW
tmpSurface\h = tmpH
tmpSurface\d = tmpD
tmpSurface\col = tmpCol
If tmpSurface\w = tmpSurface\h Then
tmpSurface\quad = True : QuadCount = QuadCount + 1
Else
tmpSurface\quad = False : RectCount = RectCount + 1
EndIf
Return tmpSurface
End Function


Function CheckSurface( tmpX, tmpY, tmpCol, tmpD )
Local tmpSurface.Surface
For tmpSurface = Each Surface
If tmpSurface\d = tmpD And tmpSurface\col = tmpCol Then
If RectsOverlap( tmpSurface\x, tmpSurface\y, tmpSurface\w, tmpSurface\h, tmpX, tmpY, 1, 1 ) Then
Return False
EndIf
EndIf
Next
Return True
End Function



;~IDEal Editor Parameters:
;~C#Blitz3D


Hierbei wird schritt für schritt gesucht. Es werden Pixelreihe für Pixelreihe durchgegangen, bis man auf einen Pixel stößt, der eine andere Farbe hat als der Hintergrund. Dann wid die Höhe und die Breite bestimmt und als Type hinzugefügt in eine Liste. In diesem gefundenem Rechteck wird erneut mit dem Selben Verfahren (deswegen Rekursion) nach Rechtecken gesucht, wenn welche gefunden wurden wieder usw.. Dann wird alles in der Liste gezählt und anschließend ausgewertet und angezeigt.

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Der Eisvogel

BeitragDi, Mai 24, 2011 14:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier ist meine Lösung:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Local pixmap:TPixmap = LoadPixmap("BlitzQuiz-Quadrate.png")

Local ms:Int = MilliSecs()
Local squares:Int, rectangles:Int
CountSquares(pixmap, squares, rectangles)
Notify("Es wurden " + rectangles + " Rechtecke gezählt, von denen " + squares + " Quadrate sind, in " + (MilliSecs() - ms) + "ms")


Function CountSquares(pixmap:TPixmap, squares:Int Var, rectangles:Int Var)
Local w:Int = PixmapWidth(pixmap)
Local h:Int = PixmapHeight(pixmap)

For Local y:Int = 0 Until h
For Local x:Int = 0 Until w
Global _rgb:Int = $FFFFFFFF

Local rgb:Int = ReadPixel(pixmap, x, y)

If rgb <> _rgb Then
If TopRight(pixmap, x, y, rgb) Then
If IsSquare(pixmap, x, y, rgb) Then squares:+1
rectangles:+1
EndIf
EndIf
_rgb = rgb
Next
Next
End Function


Function RectWidth:Int(pixmap:TPixmap, x:Int, y:Int, rgb:Int)
Local count:Int

While ReadPixel(pixmap, x, y) = rgb
count:+1
x:+1
If x >= PixmapWidth(pixmap) Then Exit
Wend

Return count
End Function

Function RectHeight:Int(pixmap:TPixmap, x:Int, y:Int, rgb:Int)
Local count:Int

While ReadPixel(pixmap, x, y) = rgb
count:+1
y:+1
If y >= PixmapHeight(pixmap) Then Exit
Wend

Return count
End Function


Function TopRight:Int(pixmap:TPixmap, x:Int, y:Int, rgb:Int)
Return (y = 0 Or ReadPixel(pixmap, x, y - 1) <> rgb)
End Function


Function IsSquare:Int(pixmap:TPixmap, x:Int, y:Int, rgb:Int)
Return RectWidth(pixmap, x, y, rgb) = RectHeight(pixmap, x, y, rgb)
End Function


Am Anfang hatte ich es auch über Rekursion gelöst, jedoch ist mir dann aufgefallen das es genau das selbe tut wie die jetzt Funktion.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Gehe zu Seite Zurück  1, 2, 3, 4, 5  Weiter

Neue Antwort erstellen


Übersicht Sonstiges Projekte

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group