Button right = Triangulation
Space = init
escape = quit
Code: Select all
;Button left = add point
;Button right = Triangulation
;Space = init
;escape = quit
;http://www.ai.univ-paris8.fr/~audibert/ens/11-Triangulation.pdf
;
;http://www.geom.uiuc.edu/~samuelp/del_project.html
InitSprite()
InitKeyboard()
InitMouse()
OpenScreen(1024, 768, 32, "Delaunay")
#Max = 2500
Global NombrePoints
Global Dim Points.point(#Max)
Global Dim voisins(#Max,#Max)
Global Dim longueur(#Max)
Global Dim envconv(#Max)
Declare AfficheSouris()
Declare AffichePoints()
Declare troppres(i)
Declare plusprochevoisin(i)
Declare voisinsuivantdroite(i, j)
Declare voisinsuivantgauche(i, j)
Declare Triangulation()
Declare AfficheTriangles()
;- Main loop
Repeat
ClearScreen(0)
ExamineKeyboard()
ExamineMouse()
If MouseButton(#PB_MouseButton_Left)
If mem = 0 And NombrePoints < #Max
mem = 1
Points(NombrePoints)\x = MouseX()
Points(NombrePoints)\y = MouseY()
NombrePoints + 1
EndIf
Else
mem = 0
EndIf
If MouseButton(#PB_MouseButton_Right)
Triangulation()
EndIf
If KeyboardReleased(#PB_Key_Space)
NombrePoints = 0
Global Dim Points.point(#Max)
Global Dim voisins(#Max,#Max)
Global Dim longueur(#Max)
Global Dim envconv(#Max)
EndIf
StartDrawing(ScreenOutput())
AfficheSouris()
AfficheTriangles()
AffichePoints()
StopDrawing()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End
Procedure AfficheSouris()
d = 10
Line(MouseX(),MouseY(), d, 1, RGB(255, 255, 255))
Line(MouseX(),MouseY(),-d, 1, RGB(255, 255, 255))
Line(MouseX(),MouseY(), 1, d, RGB(255, 255, 255))
Line(MouseX(),MouseY(), 1, -d, RGB(255, 255, 255))
EndProcedure
Procedure AffichePoints()
For i=0 To NombrePoints-1
Circle(Points(i)\x, Points(i)\y, 2,RGB(255, 0, 0))
Next
EndProcedure
Procedure plusprochevoisin(i)
distmin=900000000
For j=0 To NombrePoints-1
If i<>j
dist2=(Points(i)\x-Points(j)\x)*(Points(i)\x-Points(j)\x)+(Points(i)\y-Points(j)\y)*(Points(i)\y-Points(j)\y)
If (dist2<distmin)
distmin=dist2
jmin=j
EndIf
EndIf
Next
ProcedureReturn jmin
EndProcedure
Procedure voisinsuivantdroite(i, j)
numerovoisin=-1
Protected.d prodscal,longki2,longki,longkj2,longkj,coskij,cosmin,det
cosmin=1
For k=0 To NombrePoints-1
If k<>i And k<>j
v1x=Points(j)\x-Points(i)\x
v1y=Points(j)\y-Points(i)\y
v2x=Points(k)\x-Points(i)\x
v2y=Points(k)\y-Points(i)\y
det=v1x*v2y-v1y*v2x
If det<0 ; on cherche un point à droite
prodscal=(Points(i)\x-Points(k)\x)*(Points(j)\x-Points(k)\x)+
(Points(i)\y-Points(k)\y)*(Points(j)\y-Points(k)\y)
longki2 =(Points(i)\x-Points(k)\x)*(Points(i)\x-Points(k)\x)+
(Points(i)\y-Points(k)\y)*(Points(i)\y-Points(k)\y)
longkj2 =(Points(j)\x-Points(k)\x)*(Points(j)\x-Points(k)\x)+
(Points(j)\y-Points(k)\y)*(Points(j)\y-Points(k)\y)
longki=Sqr(longki2)
longkj=Sqr(longkj2)
coskij=prodscal/(longki*longkj); on veut le cosinus le plus petit possible
If (coskij<cosmin)
cosmin=coskij
numerovoisin=k
EndIf
EndIf
EndIf
Next
ProcedureReturn numerovoisin
EndProcedure
Procedure voisinsuivantgauche(i, j)
numerovoisin=-1
Protected.d prodscal,longki2,longki,longkj2,longkj,coskij,cosmin,det
cosmin=1
For k=0 To NombrePoints-1
If k<>i And k<>j
v1x=Points(j)\x-Points(i)\x
v1y=Points(j)\y-Points(i)\y
v2x=Points(k)\x-Points(i)\x
v2y=Points(k)\y-Points(i)\y
det=v1x*v2y-v1y*v2x
If det>0 ; on cherche un point à gauche
prodscal=(Points(i)\x-Points(k)\x)*(Points(j)\x-Points(k)\x)+
(Points(i)\y-Points(k)\y)*(Points(j)\y-Points(k)\y)
longki2=(Points(i)\x-Points(k)\x)*(Points(i)\x-Points(k)\x)+
(Points(i)\y-Points(k)\y)*(Points(i)\y-Points(k)\y)
longkj2=(Points(j)\x-Points(k)\x)*(Points(j)\x-Points(k)\x)+
(Points(j)\y-Points(k)\y)*(Points(j)\y-Points(k)\y)
longki=Sqr(longki2)
longkj=Sqr(longkj2)
coskij=prodscal/(longki*longkj); on veut le cosinus le plus petit possible
If (coskij<cosmin)
cosmin=coskij
numerovoisin=k
EndIf
EndIf
EndIf
Next
ProcedureReturn numerovoisin
EndProcedure
Procedure Triangulation()
For i=0 To NombrePoints-1 ; on prend chaque site
ppv=plusprochevoisin(i)
voisins(i,0)=ppv
longueur(i)=1
kk=0
Repeat
vsd=voisinsuivantdroite(i,voisins(i,kk))
longueur(i) + 1
voisins(i,kk+1)=vsd
kk+1
Until (vsd=ppv Or vsd=-1)
If vsd=-1
envconv(i)=1
Repeat
vsg=voisinsuivantgauche(i,voisins(i,0))
If vsg<>-1
For kkk=longueur(i)-1 To 0 Step -1
voisins(i,kkk+1)=voisins(i,kkk)
Next
voisins(i,0)=vsg
longueur(i)+1
EndIf
Until(vsg=-1)
EndIf
Next
EndProcedure
Procedure AfficheTriangles()
Color = RGB(0, 0, 255)
For i=0 To NombrePoints-1 ; dessin des triangles autour de i
For ii=0 To longueur(i)-2
If voisins(i,ii+1)<>-1
LineXY(Points(i)\x,Points(i)\y,Points(voisins(i,ii))\x,Points(voisins(i,ii))\y, Color)
LineXY(Points(i)\x,Points(i)\y,Points(voisins(i,ii+1))\x,Points(voisins(i,ii+1))\y,Color)
LineXY(Points(voisins(i,ii))\x,Points(voisins(i,ii))\y,Points(voisins(i,ii+1))\x,Points(voisins(i,ii+1))\y,Color)
EndIf
Next
Next
EndProcedure