Page 2 sur 2
Re: Canva avec forme personnalisable
Publié : mer. 26/avr./2017 9:48
par kwandjeen
Petite procédure pour savoir si l'on est dans un cercle
Code : Tout sélectionner
Procedure is_inside_circle(*m.point,*c.point,rayon)
distance = Sqr(Pow((*c\x - *m\x),2) + Pow((*c\y - *m\y),2))
If distance<=rayon
ProcedureReturn 1
EndIf
ProcedureReturn 0
EndProcedure
h\x = mousex ;position x de la souris
h\y = mousey ;position y de la souris
a\x = \centre_x ;du cercle
a\y = \centre_y ;du cercle
If is_inside_circle(@h,@a,\tx/2) ;point souris, centre du cercle, rayon du cercle
debug "sur le cercle"
EndIf
Voilà à vous de l'arranger pour votre programme.
PS : Sherman avait déjà répondu je viens de le voir
Re: Canva avec forme personnalisable
Publié : mer. 26/avr./2017 11:49
par falsam
■
Distance entres deux points.
Code : Tout sélectionner
;Distance entres deux points (2D)
Procedure.d Distance(*p.Point, *q.Point)
Protected Distance.d, dx.d, dy.d
;Distance horizontale
dx = *p\x - *q\x
;Distance verticale
dy = *p\y - *q\y
;Théoréme de Pythagore
Distance.d = Sqr(dx*dx + dy*dy )
ProcedureReturn Distance
EndProcedure
;Définition du point A (Par exemple le centre du cercle)
A.point
A\x = 3
A\y = 2
;Définition du point B (Par exemple les coordonnées de la souris )
B.point
B\x = 7
B\y = 8
Debug "Distance entre A et B " + Distance(A, B)
■ Mise en pratique avec ce code.
Code : Tout sélectionner
EnableExplicit
Global Button.point, Radius = 40
Button\x = 50
Button\y = 50
;Plan de l'application
Declare Start()
Declare onEnter()
Declare.d Distance(*p.Point, *q.Point)
Declare Exit()
Start()
Procedure Start()
OpenWindow(0, 0, 0, 800, 600, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CanvasGadget(0, 100, 100, 100, 100)
StartDrawing(CanvasOutput(0))
With Button
Circle(\x, \y, Radius, RGB(50, 205, 50))
EndWith
StopDrawing()
;Triggers
BindEvent(#PB_Event_CloseWindow, @Exit())
BindGadgetEvent(0, @onEnter())
Repeat : WaitWindowEvent() : ForEver
EndProcedure
Procedure onEnter()
Protected mouse.point
mouse\x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
mouse\y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
If Distance(Mouse, Button) <= Radius
Debug "dans le cercle"
EndIf
EndProcedure
;Distance entres deux points (2D)
Procedure.d Distance(*p.Point, *q.Point)
Protected Distance.d, dx.d, dy.d
;Distance horizontale
dx = *p\x - *q\x
;Distance verticale
dy = *p\y - *q\y
;Théoréme de Pythagore
Distance = Sqr(dx*dx + dy*dy )
ProcedureReturn Distance
EndProcedure
Procedure Exit()
End
EndProcedure
Re: Canva avec forme personnalisable
Publié : mer. 26/avr./2017 12:17
par GallyHC
Bonjour
J'ai repris le code de Falsam et adapter pour un triangle.
Code : Tout sélectionner
EnableExplicit
Global Dim triangle.Point(3)
triangle(0)\x = 50
triangle(0)\y = 10
triangle(1)\x = 10
triangle(1)\y = 90
triangle(2)\x = 90
triangle(2)\y = 90
;Plan de l'application
Declare Start()
Declare onEnter()
Declare.i GetInTriangle(Array triangle.Point(1), *point.Point)
Declare Exit()
Start()
Procedure Start()
OpenWindow(0, 0, 0, 800, 600, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CanvasGadget(0, 100, 100, 100, 100)
StartDrawing(CanvasOutput(0))
LineXY(triangle(0)\x, triangle(0)\y, triangle(1)\x, triangle(1)\y, $00ff00)
LineXY(triangle(1)\x, triangle(1)\y, triangle(2)\x, triangle(2)\y, $00ff00)
LineXY(triangle(2)\x, triangle(2)\y, triangle(0)\x, triangle(0)\y, $00ff00)
FillArea(triangle(0)\x, triangle(0)\x + 5, $00ff00, $00ff00)
StopDrawing()
;Triggers
BindEvent(#PB_Event_CloseWindow, @Exit())
BindGadgetEvent(0, @onEnter())
Repeat : WaitWindowEvent() : ForEver
EndProcedure
Procedure onEnter()
Protected mouse.point
mouse\x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
mouse\y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
If GetInTriangle(triangle(), mouse)
Debug "dans le triangle"
EndIf
EndProcedure
; Savoir si la souris est dans un triangle.
Procedure.i GetInTriangle(Array triangle.Point(1), *point.Point)
;
Protected.b bresult = #False
Protected.i xu1, xu2, xu3, yu1, yu2, yu3
Protected.i ax1, ax2, ax3, c1, c2, c3, p1, p2, p3
;
If ArraySize(triangle()) = 3
;
xu1 = triangle(1)\x - triangle(0)\x
yu1 = triangle(1)\y - triangle(0)\y
c1 = triangle(0)\y * xu1 - triangle(0)\x * yu1
P1 = triangle(2)\x * yu1 - triangle(2)\y * xu1 + c1
ax1 = *point\x * yu1 - *point\y * xu1 + c1
;
xu2 = triangle(2)\x - triangle(1)\x
yu2 = triangle(2)\y - triangle(1)\y
c2 = triangle(1)\y * xu2 - triangle(1)\x * yu2
P2 = triangle(0)\x * yu2 - triangle(0)\y * xu2 + c2
ax2 = *point\x * yu2 - *point\y * xu2 + c2
;
xu3 = triangle(0)\x-triangle(2)\x
yu3 = triangle(0)\y-triangle(2)\y
c3 = triangle(2)\y * xu3 - triangle(2)\x * yu3
P3 = triangle(1)\x * yu3 - triangle(1)\y * xu3 + c3
ax3 = *point\x * yu3 - *point\y * xu3 + c3
;
If Sign(ax1) = Sign(P1) And Sign(ax2) = Sign(P2) And Sign(ax3) = Sign(P3)
bresult = #True
EndIf
EndIf
;
ProcedureReturn bresult
EndProcedure
Procedure Exit()
End
EndProcedure
Re: Canva avec forme personnalisable
Publié : mer. 26/avr./2017 13:11
par Micoute
C'est très bon ça, merci pour le partage.
Re: Canva avec forme personnalisable
Publié : mer. 26/avr./2017 13:22
par falsam
Joli Gally.
Re: Canva avec forme personnalisable
Publié : mer. 26/avr./2017 14:35
par Ar-S
Je reviens sur les couleurs mais c'est tellement plus simple..
Et ça marchera sur toutes les formes.
Certes il faut que les couleurs du bouton diffèrent du fond mais c'est bien le but lorsqu'on veut simuler un bouton non carré...
Code : Tout sélectionner
Declare Start()
Declare onEnter()
Declare Exit()
Start()
Procedure Start()
OpenWindow(0, 0, 0, 800, 600, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CanvasGadget(0, 100, 100, 100, 100)
StartDrawing(CanvasOutput(0))
LineXY(50, 10, 10, 90, $00ff00)
LineXY(10, 90, 90, 90, $00ff00)
LineXY(90, 90, 50, 10, $00ff00)
FillArea(50, 50 + 5, $00ff00, $00ff00)
StopDrawing()
;Triggers
BindEvent(#PB_Event_CloseWindow, @Exit())
BindGadgetEvent(0, @onEnter())
Repeat : WaitWindowEvent() : ForEver
EndProcedure
Procedure onEnter()
If EventType() <> #PB_EventType_MouseLeave
StartDrawing(CanvasOutput(0))
Mx = GetGadgetAttribute(0, #PB_Canvas_MouseX)
My = GetGadgetAttribute(0, #PB_Canvas_MouseY)
COL = Point(Mx,My)
If COL = $00ff00
Debug "dans le triangle"
Else
Debug "hors triangle"
EndIf
StopDrawing()
EndIf
EndProcedure
Procedure Exit()
End
EndProcedure
Re: Canva avec forme personnalisable
Publié : mer. 26/avr./2017 14:45
par GallyHC
@Ar-S > oui une détection par détection de couleur peut être utile aussi. Au moins, cela ajoute un exemple de plus et une autre méthode, même si chaque méthode a ses limites ou ses propres contre-indications.
Cordialement,
GallyHC
Re: Canva avec forme personnalisable
Publié : mer. 26/avr./2017 15:43
par Shadow
Merci pour ces nombreux exemples
Re: Canva avec forme personnalisable
Publié : ven. 28/avr./2017 10:40
par microdevweb
Petit exemple d'un simple rond.
Esc pour quitter
Windows only
Code : Tout sélectionner
Procedure Exit()
CloseWindow(0)
End
EndProcedure
Procedure Open()
Protected w,h
OpenWindow(0,0,0,800,600,"MainForm",#PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Maximize)
w=WindowWidth(0)
h=WindowHeight(0)
CanvasGadget(0,0,0,w,h,#PB_Canvas_Keyboard|#PB_Canvas_Container)
SetWindowColor(0,RGB(255,0,0))
SetWindowLongPtr_(WindowID(0), #GWL_EXSTYLE, #WS_EX_LAYERED | #WS_EX_TOPMOST)
SetLayeredWindowAttributes_(WindowID(0),RGB(255,0,0),0,#LWA_COLORKEY)
SmartWindowRefresh(0,#True)
AddKeyboardShortcut(0,#PB_Shortcut_Escape,1)
BindEvent(#PB_Event_Menu,@Exit(),0,1)
StartDrawing(CanvasOutput(0))
Box(0,0,GadgetWidth(0),GadgetHeight(0),RGB(255,0,0))
Circle(250,250,100,RGB(0,255,0))
StopDrawing()
EndProcedure
Open()
Repeat
WaitWindowEvent()
ForEver