Maus klick auf "Raute"

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: Maus klick auf "Raute"

BeitragDo, Feb 26, 2015 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
hat jemand eine ahnung wie man evtl so ein zeichen mit der maus abfragen kann?
user posted image

was ich nun genau meine ist, ob man mit der maus im roten geklickt hat.

wie ich nun ein kreis und ein 4 eck abfragen kann weiss ich Very Happy aber ich habe 0 ahnung wie ich das machen sollte.
es handelt sich hierbei nicht um iso, sondern alles gleich winklig.

z.b. beim 4 eck frage ich es so ab

Code: [AUSKLAPPEN]
if mousedown(1) and mousex()>X and mouseX()<x+W and mousey()>Y and mousey()<y+H then


nur habe ich eben 0 plan wie man dies mathematisch umsetzt.
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Holzchopf

Meisterpacker

BeitragDo, Feb 26, 2015 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Als erstes fragst du das umschreibende Quadrat ab. Davon schneidest du dann die Ecken ab: bei Höhe 0 wäre links und rechts je die halbe Grösse des Rhombus abzuschneiden, bei Höhe = halbe Grösse wären links und rechts je 0 abzuschneiden und bei Höhe = Grösse wäre links und rechts wieder je die halbe Grösse abzuschneiden. Oder anders ausgedrückt Code: [AUSKLAPPEN]
dy = y
cx = Abs(SIZE/2 -y)

wobei y die Höhe angibt (also wie viele Pixel sich der gesuchte Punkt vom oberen Rand befindet) und cx wie viel links und rechts abgeschnitten werden muss.

Und in einem Beispiel BlitzMax: [AUSKLAPPEN]
SuperStrict

Const RHOMBUS_SIZE:Int = 23
Const RHOMBUS_POSX:Int = 100
Const RHOMBUS_POSY:Int = 100

Graphics(400,300)
Global timer:TTimer = CreateTimer(20)

While Not AppTerminate()
Cls
Local mx:Int = MouseX()
Local my:Int = MouseY()
If PointInRhombus(mx,my, RHOMBUS_POSX,RHOMBUS_POSY, RHOMBUS_SIZE) Then
SetColor 0,255,0
Else
SetColor 255,0,0
End If
For Local y:Int = 0 Until RHOMBUS_SIZE
For Local x:Int = 0 Until RHOMBUS_SIZE
' fake mouse coordinates
Local fmx:Int = x +RHOMBUS_POSX
Local fmy:Int = y +RHOMBUS_POSY
If PointInRhombus(fmx,fmy, RHOMBUS_POSX,RHOMBUS_POSY, RHOMBUS_SIZE) Then
Plot(fmx, fmy)
End If
Next
Next

WaitTimer(timer)
Flip 0
Wend

Rem
checks if point (pPx, pPy) is in rhombus at (pX, pY) to (pX +pSize, pY +pSize)
end rem

Function PointInRhombus:Int(pPx:Int, pPy:Int, pX:Int, pY:Int, pSize:Int)
' project point to rhombus start
pPx :- pX
pPy :- pY
' out of bounding box
If pPx < 0 Or pPx > pSize Then
Return False
End If
' out of bounding box
If pPy < 0 Or pPy > pSize Then
Return False
End If
' cut edges ...
' y diff from top edge
Local dy:Int = pPy
' how much to cut (from left and right)
Local cx:Int = Abs(pSize/2 -dy)
' check line on y diff
If pPx >= cx And pPx < pSize -cx Then
Return True
End If
Return False
End Function


mfG
Holzchopf

PS: Die bounding box Prüfung könnte auch weggelassen werden, aber ich find's schöner mit.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Mathias-Kwiatkowski

BeitragDo, Feb 26, 2015 21:19
Antworten mit Zitat
Benutzer-Profile anzeigen
vielen dank!
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group