Mausklick in unregelmässige Flächen erkennen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Mausklick in unregelmässige Flächen erkennen

Beitrag von Dostej »

Hallo
Also, hier ist ein Schnipsel, das eine Methode zeigt, wie man einen Mausklick in unregelmässige Felder erkennen kann.
Es ist vermutlich nicht die beste und schon gar nicht die schnellste Variante, aber immerhin eine, die geht.

Das Prinzip ist, das die Fläche eine Randfarbe hat, und ein Klick in die Fläche mit einem FillArea-Befehl verbunden ist. Für jede Fläche ist ein Punkt gespeichert (Datasection), der sicher innerhalb der Fläche liegt. Nach dem Fill-en wird nur noch überprüft, ob der Punkt nun die Füllfarbe hat. Wenn Ja, wurde das entsprechende Feld geklickt.
Wenn jemand ne einfachere/schnellere Lösung weiss, wäre ich interessiert.


In dem Beispielbild (hier zu finden: http://www.vsurf.de/Dostej-KarteAnzeige.png ) sind es die Provinzen des mittelalterlichen Japans.

Code: Alles auswählen

; PureBasic Visual Designer v3.93 build 1480 (PB4Code) 

UsePNGImageDecoder() 

;{Konstanten und Variablen 
Enumeration 
  #Sprite1 
  #File1 
EndEnumeration 
Enumeration 
  #Window 
EndEnumeration 
#MaxProvinz = 64 

;EnableExplicit 
Define mx.l, my.l 
path.s = "" 
Global Dim Mittelpunkte(64, 1) 
Restore Mittel 
For k=1 To #MaxProvinz 
  Read Mittelpunkte(k, 0) 
  Read Mittelpunkte(k, 1) 
Next 

;} 
;{ Enviroment 
If InitSprite() 
Else 
  MessageRequester("Fehler", "Init nicht möglich") 
  End 
EndIf 
;} 

;{Proceduren 
Procedure DrawScreen() 
  DisplaySprite(#Sprite1, 0, 0) 
  ;{ zum plazieren der Mittelpunkte 
  If StartDrawing(ScreenOutput()) 
    DrawingMode(#PB_2DDrawing_Transparent) 
    For x = 1 To #MaxProvinz 
      DrawText(Mittelpunkte(x, 0), Mittelpunkte(x, 1), Str(x), RGB(0,0,255)) 
    Next 
    StopDrawing() 
    FlipBuffers() 
  EndIf 
  ;} 
EndProcedure 
;} 


;{ Fenster aufbauen 
If OpenWindow(#Window, 0, 0, 1024, 748 , "Anzeiger",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar) 
  If Not OpenWindowedScreen(WindowID(#Window), 5, 5, 900, 451, 0, 0, 0) 
    MessageRequester("Fehler", "Screen nicht möglich") 
    End 
  EndIf 
EndIf 
;} 

;{ Medien laden 
If Not LoadSprite(#Sprite1, Path + "KarteAnzeige.png") 
  MessageRequester("Fehler", "Sprite konnte nicht geladen werden") 
  End 
EndIf 
;} 

;{ Laufschleife 
DrawScreen() 
Repeat ; Start of the event loop 
  
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows 
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures 
  GadgetID = EventGadget() ; Is it a gadget event? 
  EventType = EventType() ; The event type 
  
  ;{ Mausaktionen in Screen 
  mx = WindowMouseX(#Window)-5 
  my = WindowMouseY(#Window)-5 
  
  If mx > 0 And mx < 900 
    If my > 0 And my < 451 
      If Event = 514 
        ; die Farbe unter dem Mauspunkt ermitteln 
        If StartDrawing(ScreenOutput()) 
          color = Point(mx, my) 
                    If color = RGB(192,192,192) 
            FillArea(mx, my, RGB(0,0,255), RGB(255,255,0)) 
            ; Durchsuche alle Mittelpunkte 
            For x = 1 To #MaxProvinz 
              ; welcher davon ist nun gelb? 
              If Point(Mittelpunkte(x, 0), Mittelpunkte(x, 1)) = RGB(255,255,0) 
                Debug x ; Ergebnis anzeigen 
                Break 
              EndIf 
            Next 
            
          EndIf 

          
          StopDrawing() 
          ; Ansicht neu aufbauen 
          FlipBuffers() 
          Delay(500) 
          DrawScreen() 
          
        EndIf 
      EndIf 
    EndIf 
  EndIf 
  
  ;} 
  
Until Event = #PB_Event_CloseWindow ; End of the event loop 
;} 

End 
DataSection 
Mittel: 
Data.l 795 
Data.l 157 
Data.l 763 
Data.l 125 
Data.l 663 
Data.l 199 
Data.l 695 
Data.l 253 
Data.l 701 
Data.l 281 
Data.l 666 
Data.l 326 
Data.l 660 
Data.l 358 
Data.l 640 
Data.l 374 
Data.l 638 
Data.l 238 
Data.l 626 
Data.l 303 
Data.l 604 
Data.l 338 
Data.l 581 
Data.l 365 
Data.l 589 
Data.l 314 
Data.l 564 
Data.l 271 
Data.l 559 
Data.l 337 
Data.l 548 
Data.l 220 
Data.l 555 
Data.l 177 
Data.l 510 
Data.l 226 
Data.l 522 
Data.l 242 
Data.l 507 
Data.l 272 
Data.l 526 
Data.l 338 
Data.l 495 
Data.l 329 
Data.l 495 
Data.l 308 
Data.l 481 
Data.l 240 
Data.l 460 
Data.l 272 
Data.l 460 
Data.l 316 
Data.l 438 
Data.l 249 
Data.l 429 
Data.l 290 
Data.l 447 
Data.l 308 
Data.l 452 
Data.l 339 
Data.l 416 
Data.l 262 
Data.l 396 
Data.l 279 
Data.l 423 
Data.l 319 
Data.l 410 
Data.l 303 
Data.l 391 
Data.l 317 
Data.l 386 
Data.l 353 
Data.l 425 
Data.l 229 
Data.l 383 
Data.l 226 
Data.l 378 
Data.l 256 
Data.l 356 
Data.l 207 
Data.l 350 
Data.l 221 
Data.l 344 
Data.l 248 
Data.l 315 
Data.l 194 
Data.l 328 
Data.l 253 
Data.l 287 
Data.l 191 
Data.l 308 
Data.l 234 
Data.l 239 
Data.l 200 
Data.l 266 
Data.l 228 
Data.l 186 
Data.l 206 
Data.l 214 
Data.l 225 
Data.l 365 
Data.l 301 
Data.l 314 
Data.l 282 
Data.l 308 
Data.l 311 
Data.l 239 
Data.l 282 
Data.l 245 
Data.l 306 
Data.l 152 
Data.l 225 
Data.l 163 
Data.l 276 
Data.l 126 
Data.l 317 
Data.l 122 
Data.l 220 
Data.l 118 
Data.l 238 
Data.l 122 
Data.l 262 
Data.l 88 
Data.l 240 
Data.l 67 
Data.l 330 
Data.l 83 
Data.l 355 


EndDataSection
----
edited bobobo
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

geiles Teil :mrgreen:

aber stell mal das OriginalBild (vermutlich ein 256Farb-BMP) ins Netz (mit dem jpg funzt das nicht)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

Theoretisch gerne. Es ist ein png-Bild mit 20k (man muss im code dann nur 2 zeilen ändern - den decoder und die Endung des Bilddatei)
Ich hab nur Probleme mit dem Uploaden. Wenn Du (oder jemand anders) nen klein bischen Platz hat, kann ich es mailen. Oder wenn es sonst jemand will.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

hab's oben schon editiert :wink:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

Dann hast du vermutlich die Randfarbe bei Fillarea angepasst und auch die Schriftfarbe für die Zahlen, da ich nen roten Rand hatte.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

ja .. nun passt alles zusammen :)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

Muchas Gracias, Senor... :)

Ich hoffe jemand kann mit dem Code was anfangen...
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

vermutlich nur mittelalterliche Japaner :lol:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

HA ha :lol:
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

die Japaner fühlen sich aber wohl etwas gekippt :wink:
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Antworten