Addpathcurve: insérer des points

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Addpathcurve: insérer des points

Message par blendman »

salut

savez-vous comment insérer/ajouter des points dans une forme (shape) créée avec addpathcurve() ?

Mon code :

Code : Tout sélectionner

#G_canvasVector=0
Global Dim pt.Point(8)

; add some point to begin
t$ = "134/212/117/283/252/350/310/324/348/309/300/199/351/219/351/140/133/139/"
For i= 0 To ArraySize(pt())
    pt(i)\x = Val(StringField(t$,i*2+1,"/"))
    pt(i)\y = Val(StringField(t$,i*2+2,"/"))
Next

LoadFont(0, "arial", 20)

Procedure Drawcanvas(x=-100,y=-100,ok=0,insert=0)
       
    If StartVectorDrawing(CanvasVectorOutput(0))
       
        ; gray background
        AddPathBox(0,0, GadgetWidth(0),GadgetHeight(0))
        VectorSourceColor(RGBA(200,200,200,255))
        FillPath()
               
        ; draw points
        For i =0 To ArraySize(pt())           
            MovePathCursor(pt(i)\x,pt(i)\y)
             VectorFont(FontID(0), 25)

            VectorSourceColor(RGBA(0, 0, 0, 80))

            DrawVectorText(Str(i))
        Next
       
        MovePathCursor(pt(0)\x,pt(0)\y)
        For i =0 To ArraySize(pt())
            ;AddPathLine(pt(i)\x, pt(i)\y)
           

            If Mod(i,3)=0                   
                AddPathBox(pt(i)\x-5,pt(i)\y-5,10,10)
                VectorSourceColor(RGBA(255,0,0,100))
                FillPath()
            Else
                If Mod(i,3)=1
                    u = i-1
                    If u<0
                        u = ArraySize(pt())
                    EndIf
                    MovePathCursor(pt(i)\x,pt(i)\y)
                    AddPathLine(pt(i)\x, pt(i)\y)
                    AddPathLine(pt(u)\x, pt(u)\y)
                    VectorSourceColor(RGBA(0,0,0,100))
                    StrokePath(1)
                Else
                    u = i+1
                    If u>ArraySize(pt())
                        u = 0
                    EndIf
                    MovePathCursor(pt(i)\x,pt(i)\y)
                    AddPathLine(pt(i)\x, pt(i)\y)
                    AddPathLine(pt(u)\x, pt(u)\y)
                    VectorSourceColor(RGBA(0,0,0,100))
                    StrokePath(1)
                EndIf
               
                AddPathCircle(pt(i)\x,pt(i)\y,5)
                VectorSourceColor(RGBA(255,255,0,100))
                FillPath()
            EndIf
        Next
       
        ; Draw the shape
        MovePathCursor(pt(0)\x,pt(0)\y)
        For i =0 To ArraySize(pt()) Step 3
           
            u = 1+i
            If u > ArraySize(pt())
                u =0
            EndIf
            v = u+1
            If v > ArraySize(pt())
                v =0
            EndIf
            w = v+1             
            If w > ArraySize(pt())
                w=0
            EndIf
            ;AddPathLine(pt(u)\x, pt(u)\y)
            ;AddPathLine(pt(v)\x, pt(v)\y)
            AddPathCurve(pt(u)\x, pt(u)\y,pt(v)\x,pt(v)\y,pt(w)\x,pt(w)\y)
        Next
        VectorSourceColor(RGBA(0,0,0,120))
        FillPath()
        StopVectorDrawing()
       
    EndIf
EndProcedure

w=800
h=600
OpenWindow(0,0,0,w,h,"insert point",#PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_SystemMenu)

CanvasGadget(0,0,0,w,h)
 Drawcanvas()

Repeat
   
    event =WaitWindowEvent()
   
    If event = #PB_Event_Gadget
        If EventGadget() = 0
           
            If EventType() = #PB_EventType_LeftButtonDown Or
               (EventType() = #PB_EventType_MouseMove And                         
                GetGadgetAttribute(#G_canvasVector, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
               
                If StartVectorDrawing(CanvasVectorOutput(#G_canvasVector))
                    x = GetGadgetAttribute(#G_canvasVector, #PB_Canvas_MouseX)
                    y = GetGadgetAttribute(#G_canvasVector, #PB_Canvas_MouseY)
                   
                    If EventType() = #PB_EventType_LeftButtonDown
                         move = 0
                        For i= 0 To ArraySize(pt())                       
                            If x >= pt(i)\x-5 And x<=pt(i)\x-5+10 And y>=pt(i)\y-5 And y<=pt(i)\y-5+10
                                k1 = i
                                move = 1
                                Break
                            EndIf                       
                        Next
                    EndIf
                   
                    StopVectorDrawing()
                   
                    Drawcanvas(x,y,1)
                    If move = 1                       
                        pt(k1)\x = x
                        pt(k1)\y = y
                        Debug "point "+i+" : "+x+"/"+y
                    Else
                        ; we don't move, but we have made a cli : add the point here !
                        If clic = 0
                            clic = 1
                            ; InsertPt(k,x,y)
                        EndIf
                    EndIf
                EndIf
                               
            ElseIf EventType() = #PB_EventType_MouseMove   
               
                If StartVectorDrawing(CanvasVectorOutput(#G_canvasVector))
                    x = GetGadgetAttribute(#G_canvasVector, #PB_Canvas_MouseX)
                    y = GetGadgetAttribute(#G_canvasVector, #PB_Canvas_MouseY)
                    StopVectorDrawing()
                    Drawcanvas(x,y,move)
                EndIf
               
            ElseIf EventType() = #PB_EventType_LeftButtonUp
                Drawcanvas()
                move = 0
                clic = 0
            EndIf
           
        EndIf
    EndIf
       
Until event = #PB_Event_CloseWindow
Par exemple, dans cette exemple, j'aimerai insérer un nouveau (donc 3 pt() en réalité) entre le point 0 et le 3 ou entre le 3 et le 6 , etc...
Auriez-vous une idée ?
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Addpathcurve: insérer des points

Message par falsam »

Génial ce code et sans scintillement. Merci Blendman.

Faineasse quand même le codeur ^^

Code : Tout sélectionner

; add some point to begin
t$ = "134/212/117/283/252/350/310/324/348/309/300/199/351/219/351/140/133/139/"
For i= 0 To ArraySize(pt())
    pt(i)\x = Val(StringField(t$,i*2+1,"/"))
    pt(i)\y = Val(StringField(t$,i*2+2,"/"))
Next
Une petite structure point x/y ça aurait bien.


Tu as bien bossé et merci encore de partager.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Addpathcurve: insérer des points

Message par Mesa »

Tu ne peux pas pour l'instant. Mais c'est quelque chose à poster sur la wishlist du forum anglais car ce ne sera pas très difficile pour le créateur de la lib d'ajouter cette fonction.

Tu ne peux qu'ajouter des addpathcurve().

M.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Addpathcurve: insérer des points

Message par blendman »

Mesa a écrit :Tu ne peux pas pour l'instant. Mais c'est quelque chose à poster sur la wishlist du forum anglais car ce ne sera pas très difficile pour le créateur de la lib d'ajouter cette fonction.
ok, je vais poster ça dans les features request alors ^^.

J'avais vu qu'un gars avait posté un algorithme De CastelJau (pour obtenir les points sur une courbe justement)
http://www.purebasic.fr/english/viewtop ... 04#p483004

mais je ne vois pas trop comment l'utiliser pour ajouter un point (j'ai bien essayé mais je n'ai pas encore réussi).
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Addpathcurve: insérer des points

Message par Mesa »

Disons que cet algo permet de créer une courbe de bézier à la main.

Ici, danilo a fait tout le travail: http://www.purebasic.fr/english/viewtop ... 12&t=49814
J'ai testé ses exemples et ça fonctionne bien quoiq'un peu plus lent que addpathcurve.
L'exemple 2 correspond à ce que tu cherches (je crois)
http://danilo.purearea.net/BezierCurve/BezierCurve.zip

M.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Addpathcurve: insérer des points

Message par blendman »

Merci, j'ai testé l'exemple 2, mais ça ne correspond pas à ce que je cherche ^^.
Je souhaite insérer un point entre deux points existant, l'exemple 2 ajoute un point à la fin de la liste. D'ailleurs, ça je sais déjà le faire c'est assez facile, mais insérer un point parmi des points existants c'est plus compliqué, car il faut trouvé les points proche du clic souris, etc...
J'ai bricolé un petit truc mais ça ne marche pas à tous les coups hélas.
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Addpathcurve: insérer des points

Message par Fig »

c'est résolu ou toujours d'actualité ?

Ce que veut dire Mesa, il me semble, c'est qu'il faut utiliser l'algo de traçage de courbe de bezier, à partir des points de control que tu as, pour que le programme parcours les courbes pour trouver le point le plus proche du clic sur celles-ci.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Addpathcurve: insérer des points

Message par blendman »

C'est toujours d'actualité ;)
Répondre