FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Logiciel de planétarium.
Encadrement Emptypar Jack Aujourd'hui à 10:03

» Un autre pense-bête...
Encadrement Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
Encadrement Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
Encadrement Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
Encadrement Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
Encadrement Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
Encadrement Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
Encadrement Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
Encadrement Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
Encadrement Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
Encadrement Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
Encadrement Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
Encadrement Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
Encadrement Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
Encadrement Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
-55%
Le deal à ne pas rater :
Friteuse sans huile – PHILIPS – Airfryer HD9200/90 Série 3000
49.99 € 109.99 €
Voir le deal

 

 Encadrement

Aller en bas 
+2
jjn4
JL35
6 participants
AuteurMessage
JL35




Nombre de messages : 7112
Localisation : 77
Date d'inscription : 29/11/2007

Encadrement Empty
MessageSujet: Encadrement   Encadrement EmptySam 13 Avr 2019 - 18:26

Pour encadrer et isoler une partie d'image, portrait ou autre:
On charge une image, puis on trace l'ellipse cadre à la souris (clic le coin supérieur gauche, descendre, relâcher).
Code:
' Cadre ovale autour d'une partie d'image
LABEL Chf,Chf1,Svf,Decoupe,Deplace
DIM kgf$,bh%,bv%,f$,fm$,fr$,p%,w%,h%,wd%,hd%,mg%,i%,cr%,cb%,c%,r,t,tp,a,b,x%,y%,n%
DIM dp%,min0%,im%,sv%,bt%
fm$ = "Z:\Im.bmp": ' Fichier de manoeuvre temporaire, à ajuster
kgf$ = "C:\PANORAMIC\KGF\KGF.dll": ' à ajuster
BORDER_SMALL 0: FONT_SIZE 0,9: FONT_BOLD 0
bh% = WIDTH(0)-WIDTH_CLIENT(0): bv% = HEIGHT(0)-HEIGHT_CLIENT(0): ' bordures
min0% = 520
WIDTH 0,min0%: HEIGHT 0,640: color 0,0,255,255
ALPHA 1: TOP 1,3: CAPTION 1,"Image :"
EDIT 2: LEFT 2,40: WIDTH 2,240: TEXT 2," (clic)": ON_CLICK 2,Chf
' OPEN_DIALOG 3: FILTER 3,"Image JPG,BMP|*.jpg;*.bmp"
OPEN_DIALOG_PIC 3: FILTER 3,"Image JPG,BMP|*.jpg;*.bmp"
ALPHA 4: TOP 4,-1: LEFT 4,LEFT(2)+WIDTH(2)+5: COLOR 4,255,255,0
  FONT_SIZE 4,9: CAPTION 4," Nb de"+CHR$(10)+"cercles: "
SPIN 5: TOP 5,1: LEFT 5,LEFT(4)+50: WIDTH 5,45: POSITION 5,80
CONTAINER_OPTION 6: LEFT 6,LEFT(5)+50: WIDTH 6,60: HEIGHT 6,25: COLOR 6,255,255,0
  OPTION 7: PARENT 7,6: TOP 7,-2: LEFT 7,5: CAPTION 7,"Noir": MARK_ON 7
  OPTION 8: PARENT 8,6: TOP 8,TOP(7)+12: LEFT 8,LEFT(7): CAPTION 8,"Blanc"
bt% = 10
BUTTON bt%: LEFT bt%,WIDTH_CLIENT(0)-55: WIDTH bt%,50: CAPTION bt%,"Tracer"
  ON_CLICK bt%,Decoupe

p% = 50: PICTURE p%: TOP p%,30
im% = p%+1: IMAGE im%
sv% = 15
PANEL sv%: HIDE sv%: WIDTH sv%,WIDTH(0)-bh%: HEIGHT sv%,30: COLOR sv%,164,255,255
ALPHA sv%+1: PARENT sv%+1,sv%: TOP sv%+1,0: CAPTION sv%+1,"Enregistrer sous (bmp):"
EDIT sv%+2: PARENT sv%+2,sv%: TOP sv%+2,2: LEFT sv%+2,140: WIDTH sv%+2,280
  TEXT sv%+2," (clic)": ON_CLICK sv%+2,Svf
SAVE_DIALOG sv%+3: FILTER sv%+3,"Fichier BMP|*.bmp"

' Boutons de déplacement de l'image source
PANEL 20: WIDTH 20,150: HEIGHT 20,20: TOP 20,TOP(p%)+HEIGHT(p%)-20: ' H
  LEFT 20, LEFT(p%)+WIDTH(p%)/2-75: FONT_NAME 20,"Wingdings": FONT_SIZE 20,12
  HIDE 20
BUTTON 21: PARENT 21,20: CAPTION 21,CHR$(231)
BUTTON 22: PARENT 22,20: LEFT 22,WIDTH(21): CAPTION 22,CHR$(232)
  ON_CLICK 21,Deplace: ON_CLICK 22,Deplace
PANEL 30: HIDE 30: WIDTH 30,20: HEIGHT 30,150: TOP 30,TOP(p%)+HEIGHT(p%)/2-75: ' V
  LEFT 30,WIDTH(0)-bh%/2-20: FONT_NAME 30,"Wingdings": FONT_SIZE 30,12: HIDE 30
BUTTON 31: PARENT 31,30: WIDTH 31,20: HEIGHT 31,75: CAPTION 31,CHR$(233)
BUTTON 32: PARENT 32,30: TOP 32,75: WIDTH 32,20: HEIGHT 32,75: CAPTION 32,CHR$(234)
  ON_CLICK 31,Deplace: ON_CLICK 32,Deplace
END
' ==============================================================================
Chf:
  ' Choix du fichier image source
  f$ = FILE_NAME$(3): TEXT 2,f$
  FILE_LOAD p%,f$: FILE_SAVE p%,fm$
  FILEBIN_OPEN_READ 1,fm$: ' dimensions de l'image
      FILEBIN_POSITION 1,18: w% = FILEBIN_READ(1)+256*FILEBIN_READ(1)
      FILEBIN_POSITION 1,22: h% = FILEBIN_READ(1)+256*FILEBIN_READ(1)
  FILEBIN_CLOSE 1: FILE_DELETE fm$
Chf1:
  WIDTH 0,w%+bh%: HEIGHT 0,h%+90: IF WIDTH(0)<min0% THEN WIDTH 0,min0%
  IF WIDTH(0) > SCREEN_X THEN WIDTH 0,SCREEN_X
  iF HEIGHT(0) > (SCREEN_Y-30) THEN HEIGHT 0,SCREEN_Y-30
  WIDTH p%,w%: HEIGHT p%,h%
  TOP sv%,TOP(p%)+HEIGHT(p%)
  IF w%>(WIDTH(0)-bh%)
      TOP 20,HEIGHT(0)-55: LEFT 20,WIDTH(0)/2-80: SHOW 20
  END_IF
  IF h%>(HEIGHT(0)-60)
      TOP 30,HEIGHT(0)/2-80: LEFT 30,WIDTH(0)-bh%-20: SHOW 30
  END_IF
  FILE_LOAD p%,f$
  CAPTION bt%,"Tracer": ON_CLICK bt%,Decoupe
RETURN
' ==============================================================================
Svf:
  ' Sauvegarde du résultat (avec étourage noir pour SCENE2D)
  fr$ = FILE_NAME$(sv%+3): TEXT sv%+2,fr$: FILE_SAVE p%,fr$
RETURN
' ==============================================================================
Decoupe:
  ' Découpe elliptique dans l'image source
  Selzone(p%,1): ' tracé = ellipse
  PEllipse(wi%,hi%)
  2D_TARGET_IS p%
  DEGREES
  a = wi%/2: b = hi%/2: ' 1/2 axes de l'ellipse
  n% = POSITION(5): ' nb de cercles périphériques (à moduler ...)
  tp = 360/n%: r = c%/(2*n%): ' rayon des cercles
  2D_FILL_ON: 2D_FILL_COLOR 255,255,255: ' couleur de remplissage des cercles
  FOR t = 90 TO 449 STEP tp
      x% = xc%+a*COS(t): y% = yc%+b*SIN(t)
      2D_CIRCLE x%,y%,r
  NEXT t
  mg% = 10: ' marge périphérique
  wd% = wi%+2*r+2*mg%: hd% = hi%+2*r+2*mg%
  2D_IMAGE_COPY im%,xc%-wd%/2,yc%-hd%/2,xc%+wd%/2,yc%+hd%/2
  WIDTH 0,wd%+bh%: HEIGHT 0,hd%+95: IF WIDTH(0)<min0% THEN WIDTH 0,min0%
  TOP p%,30: LEFT p%,0
  WIDTH p%,wd%: HEIGHT p%,hd%: TOP sv%,TOP(p%)+HEIGHT(p%)
  2D_IMAGE_PASTE im%,0,0
  IF CHECKED(7) = 1
      cr% = 0: ' remplissage noir (transparence pour SCENE2D)
  ELSE
      cr%=65536*255+256*255+255: ' remplissage blanc
  END_IF 
  cb% = 0: ' couleurs contour
  CLIPBOARD_COPY p%
  DLL_ON kgf$
      i% = DLL_CALL0("LoadPicture"): ' image presse-papier -> image interne
      i% = DLL_CALL4("FloodfillPictureToBorderColor",2,2,cr%,cb%)
      i% = DLL_CALL0("SavePicture"): ' image interne -> presse-papier
  DLL_OFF
  CLIPBOARD_PASTE p%
  CAPTION sv%+1,"Enregistrer sous (bmp) :"+CHR$(10)+" ( "+STR$(wd%)+" x "+STR$(hd%)+" pixels)"
  SHOW sv%
  CAPTION bt%,"Refaire": ON_CLICK bt%,Chf1
RETURN
' ==============================================================================
Deplace:
  ' Déplacement de l'image source (cas des images grande taille)
  i% = NUMBER_CLICK
  dp% = 20
  SELECT i%
    CASE 21: LEFT p%,LEFT(p%)+dp%
    CASE 22: LEFT p%,LEFT(p%)-dp%
    CASE 31: TOP p%,TOP(p%)+dp%
    CASE 32: TOP p%,TOP(p%)-dp%
  END_SELECT
RETURN
' ==============================================================================
SUB Selzone(p%,typ%)
  ' Sélectionner à la souris une zone rectangulaire: typ%=0 ou elliptique: typ%=1
  ' dans le picture p%.
  DIM_LOCAL x1,y1,x2,y2,i%
  IF VARIABLE("wi%") = 0 THEN DIM wi%
  IF VARIABLE("hi%") = 0 THEN DIM hi%
  IF VARIABLE("xc%") = 0 THEN DIM xc%
  IF VARIABLE("yc%") = 0 THEN DIM yc%
  i% = MOUSE_LEFT_DOWN(p%): i% = MOUSE_LEFT_UP(p%): ' Réinit
  WHILE MOUSE_LEFT_DOWN(p%) = 0: PAUSE 100: END_WHILE: ' attente clic gauche
  x1 = MOUSE_X_LEFT_DOWN(p%): y1 = MOUSE_Y_LEFT_DOWN(p%)
  CLIPBOARD_COPY p%: ' sauvegarde du fond
  2D_TARGET_IS p%: 2D_PEN_COLOR 255,0,255: 2D_PEN_WIDTH 1: 2D_FILL_OFF
  WHILE MOUSE_LEFT_UP(p%) = 0: ' attente relâchement
      x2 = MOUSE_X_POSITION(p%): y2 = MOUSE_Y_POSITION(p%)
      CLIPBOARD_PASTE p%
      IF typ% = 0
          2D_RECTANGLE x1,y1,x2,y2
      ELSE
          2D_ELLIPSE x1,y1,x2,y2
      END_IF
      PAUSE 100
  END_WHILE
  CLIPBOARD_PASTE p%
  xc% = x1+(x2-x1)/2: yc% = y1+(y2-y1)/2: ' centre de l'ellipse ou du rectangle
  IF typ% = 1 THEN 2D_PEN_COLOR 0,0,0: 2D_ELLIPSE x1,y1,x2,y2
  wi% = ABS(x2-x1): hi% = ABS(y2-y1): ' dimensions de la sélection 
END_SUB 
' ==============================================================================
SUB PEllipse(w%,h%)
  ' Périmètre de l'ellipse de dimensions w% x h% -> c% (pixels)
  IF VARIABLE("c%") = 0 THEN DIM c%
  DIM_LOCAL a,b
  a = w%/2: b = h%/2: ' 1/2 axes
  c% = 2*PI*SQR((a*a+b*b)/2)
END_SUB 
' ==============================================================================
Un exemple ("Les Jardiniers", de Gustave Caillebotte):
Encadrement Pano11

C'est une ébauche, il y a plusieurs choses à ajuster à sa configuration.
On peut imaginer des variantes, c'est plutôt une base de départ.

Le détourage est au noir, pour être utilisé dans un Scene2d, et en faire une image à fond blanc, ou l'intégrer dans une autre image.
On peut varier le nombre de cercles périphériques, leur couleur, etc.

Edit 14/04 ajout de flèches de navigation pour le cas d'images plus grandes que l'écran.
Re Edit! ajout de la possibilité de fixer le nombre de cercles périphériques, et de refaire la manoeuvre d'encadrement.
Edit 15/04 Maj suite à une suggestion judicieuse de silverman.


Dernière édition par JL35 le Mar 16 Avr 2019 - 8:33, édité 6 fois
Revenir en haut Aller en bas
jjn4

jjn4


Nombre de messages : 2747
Date d'inscription : 13/09/2009

Encadrement Empty
MessageSujet: +++   Encadrement EmptySam 13 Avr 2019 - 19:50

Oh, joli !
Voilà qui peut toujours servir,
pour les cartes de vœux ou de Noël...!
cheers
Revenir en haut Aller en bas
http://jjn4.e-monsite.com
JL35




Nombre de messages : 7112
Localisation : 77
Date d'inscription : 29/11/2007

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptySam 13 Avr 2019 - 20:21

Ou pour encadrer le portrait d'un être aimé (belle-mère, ou autre...)
PS j'ai fait quelques ajustements là-haut.

J'ai un trou de mémoire, je ne sais plus comment on fait pour mettre des barres de défilement dans un picture si l'image dépasse les dimensions de l'écran...
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptySam 13 Avr 2019 - 22:19

Citation :
J'ai un trou de mémoire, je ne sais plus comment on fait pour mettre des barres de défilement dans un picture si l'image dépasse les dimensions de l'écran...
Aucune idée. C'est bien pour cela que j'ai créé mon objet ScrollImage...

La solution "brutale" serait de créer un picture dépassant les dimensions de la fenêtre et utiliser les ascenseurs de ls fenêtre.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
JL35




Nombre de messages : 7112
Localisation : 77
Date d'inscription : 29/11/2007

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptySam 13 Avr 2019 - 22:52

Merci Klaus pour ta réponse.
J'ai déjà eu ce problème et il me semblait avoir eu une solution.
Ta suggestion c'est effectivement ce que j'ai dû faire, il faudra que je recherche dans mes archives...
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptySam 13 Avr 2019 - 23:12

Autre possibilité, plus complexe à mettre en oeuvre:
- placer le picture dans un container
- mettre de grandes dimensions au picture, pas au container ==> pas d'ascenseurs automatiques
- placer une scroll_bar verticale à droite du container
- placer une scroll_bar horizontale en-dessous du container
- dans les routines ON_CHANGE de ces scroll_bars, déplacer le picture en rapport aux positions des curseurs des scroll_bars
- pour que ça marche bien, mettre la valeur maximale des scroll_bars à la dimension correspondante du picture, en déduisant la hauteur/largeur du container.

Ainsi, le picture semble "glisser" derrière le cadre de vision représenté par le container.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyDim 14 Avr 2019 - 1:52

Voici un exemple de la procédure que j'ai indiquée ci-dessus. Le programme est conçu pour des images de jusqu'à 3000x2000 pixels (tu peux facilement agrandir s'il le faut):
Code:
' demo_picture_avec_scroll_bars.bas

label change_vertical, change_horizontal, charger_image
dim img$

width 0,600 : height 0,600
panel 1 : top 1,10 : left 1,10 : width 1,400 : height 1,300
picture 2 : parent 2,1 : width 2,3000 : height 2,2000
scroll_bar 3 : vertical 3 : top 3,10 : left 3,left(1)+width(1)+2 : height 3,height(1)
  min 3,0 : max 3,height(2)-height(1) : on_change 3,change_vertical
scroll_bar 4 : horizontal 4 : top 4,top(1)+height(1)+2 : left 4,10 : width 4,width(1)
  min 4,0 : max 4,width(2)-width(1) : on_change 4,change_horizontal
button 5 : top 5,top(4)+height(4)+20 : left 5,10 : caption 5,"Fichier" : on_click 5,charger_image
open_dialog 6 : filter 6,"Images|*.bmp;*.jpg"

end

change_vertical:
  top 2,0-position(3)
  return
  
change_horizontal:
  left 2,0-position(4)
  return

charger_image:
  img$ = file_name$(6)
  if img$="_" then return
  if file_exists(img$)=0
    message "Fichier non trouvé"
    return
  end_if
  off_change 3
  position 3,0
  on_change 3,change_vertical
  off_change 4
  position 4,0
  on_change 4,change_horizontal
  left 2,0
  top 2,0
  file_load 2,img$
  return
  

EDIT

Si tu as un moyen de connaître les dimensions réelles de l'image chargée dans le picture, tu peux aussi remplacer la ligne 10 par
Code:
 inactive 3 : on_change 3,change_vertical
et la ligne 12 par
Code:
 inactive 4 : on_change 4,change_horizontal
et insérer, après la ligne 41:
Code:
if hauteur_reelle%<height(1)
  inactive 3
else
  active 3 : max 3,height(2)-height(1)
end_if
if largeur_reelle%<width(1)
  inactive 4
else
  active 4 : max 4,width(2)-width(1)
end_if
Ainsi, les ascenseurs s'adaptent automatiquement aux dimensions réelles de l'image et ne seront pas actifs si l'image tient intégralement dans le panel (verticalement et horizontalement séparé).
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
JL35




Nombre de messages : 7112
Localisation : 77
Date d'inscription : 29/11/2007

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyDim 14 Avr 2019 - 12:06

Merci Klaus pour tes suggestions qui m'ont inspiré.

Finalement, pour le cas d'images dépassant la surface de l'écran, j'ai opté pour 4 boutons-flèches superposés au picture, 2 à droite pour le déplacement vertical, 2 en bas pour le déplacement horizontal, c'est très simple à mettre en oeuvre et ma foi ça me paraît satisfaisant comme ça.

Revenir en haut Aller en bas
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyDim 14 Avr 2019 - 12:33

Bonjour à tous !

C'est super, JL35 ! Bravo !

Pour une ébauche, c'est déjà très bien !
J'ai deux petites remarques :

- Sous W10, la barre d'enregistrement est tronquée. (voir photo)
Encadrement 166


- Le raccord de la frise autour de l'image n'est pas parfait.
Je suggère la modification de la ligne 56 par :
FOR t = 90 TO 449 STEP tp
Spoiler:

Encore merci et bonne continuation !

Merci aussi à Klaus pour son partage !
Revenir en haut Aller en bas
silverman

silverman


Nombre de messages : 970
Age : 52
Localisation : Picardie
Date d'inscription : 18/03/2015

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyDim 14 Avr 2019 - 13:05

J'ai fait ça il y a longtemps pour déplacer une image plus grande que l'écran, à la souris:
Code:
maximize 0
'
label load_image_dans_container_my_image,bouge2
dim null,container_my_image,my_image,lastX,lastY,pastX,pastY,imx,imy,taille_imx,taille_imy

' génère une image
container_my_image=1000
my_image=2000
gosub load_image_dans_container_my_image

' déplace l'image dans le container_my_image
on_mouse_move container_my_image,bouge2


END
load_image_dans_container_my_image:
' ****************** fabrique une image pour la démonstration : debut **********
create_hide
  picture 123 : width 123,1000 : height 123,1000  :' fabrique un picture temporaire pour générer une image de container_my_image*container_my_image
create_show
color 123,0,0,0
dim i,x1,y1,x2,y2,r,g,b
2d_target_is 123
for i=1 to 100
  x1=int(rnd(500))
  y1=int(rnd(500))
  x2=int(rnd(500)+500)
  y2=int(rnd(500)+500)
  r=int(rnd(255))
  g=int(rnd(255))
  b=int(rnd(255))
  2d_pen_color r,g,b
  2d_fill_color r,g,b
  2d_rectangle x1,y1,x2,y2
next i
clipboard_copy 123
2d_target_is 0 : delete 123  :' plus besoin du picture temporaire
' ****************** fabrique une image pour la démonstration : fin ************

image my_image
clipboard_paste my_image :' image de démonstration
' on peut charger une image à partir du disque dur
' file_load my_image,"Mon_image.bmp"

' dimension de my_image
taille_imx=1000
taille_imy=1000

' le container; en fait c'est un picture
picture container_my_image : width container_my_image,550 : height container_my_image,550 : top container_my_image,50 : left container_my_image,150 :' un container_my_image de taille 550*550
2d_target_is container_my_image : 2d_image_paste my_image,0,0                                                                                      :' colle l'image dans le picture

return

bouge2:
off_mouse_move container_my_image
  '
  null=scancode :' rafraichir le scancode
  if scancode=1
      2d_clear
      pastX=mouse_x_position(container_my_image)
      pastY=mouse_y_position(container_my_image)
      imx=imx+(pastx-lastx)
      imy=imy+(pasty-lasty)
      if imx<width(container_my_image)-taille_imx then imx=width(container_my_image)-taille_imx    :' <--- taille_imx
      if imx>0 then imx=0
      if imy<height(container_my_image)-taille_imy then imy=height(container_my_image)-taille_imy  :' <--- taille_imy
      if imy>0 then imy=0
      2d_image_paste my_image,imx,imy
      lastx=pastx
      lasty=pasty
  else
      lastX=mouse_x_position(container_my_image)
      lastY=mouse_y_position(container_my_image)
  end_if
  '
on_mouse_move container_my_image,bouge2 :' pb(bug?) avec bouton gauche: si le bouton est enfoncé dans le container_my_image, l'évènement est
                                        :' détecté même si la souris est en dehors du container_my_image!!! Pas génant mais bon à connaitre
return

Il faudra que je pense à poster ce code dans les utilitaires... bounce
Revenir en haut Aller en bas
JL35




Nombre de messages : 7112
Localisation : 77
Date d'inscription : 29/11/2007

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyDim 14 Avr 2019 - 13:40

Merci Marc pour tes re-Marc,euh... remarques.
Je suis toujours sous W7, avec des dimensions de bordures différentes de W10, alors effectivement il faut adapter, j'essaie en général de faire quelque chose d'universel pour les deux, mais ce n'est pas toujours évident...
Effectivement, la répartition des cercles ne serait régulière que sur un cercle, plus l'ellipse est allongée et plus c'est serré aux extrémité.
On pourrait sans doute le faire régulier, mais au prix d'un calcul compliqué, sans doute (angles différents en fonction de l'inclinaison).
Déjà mon calcul du périmètre de l'ellipse est une approximation.
Je note ta suggestion, pour les angles -> c'est fait !
On peut facilement modifier le nombre de cercles, pour faire des essais, pour voir.
Ici n% = 60, à varier. A ce propos il faut modifier la ligne suivante tp = 360/60 en tp = 360/n%
(c'est fait aussi là-haut).

@Silverman,
Merci pour ta solution, en effet c'est un problème (image qui dépasse) qui se pose de temps en temps et ça fera un utilitaire bien... utile.
Pour le moment je garde ma dernière solution, qui me convient bien et qui est assez simple
(deux Panels avec chacun 2 boutons flèches, verticales et horizontales, positionnés aux bords droit et bas du Form contenant le Picture, avec déplacement du Picture dans la direction voulue sur clic)

PS ta solution est séduisante et très souple, déplacement du picture avec la souris, mais dans mon cas il y aurait un conflit puisque j'attends justement un clic souris pour démarrer la délimitation du découpage.
Revenir en haut Aller en bas
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyDim 14 Avr 2019 - 14:30

JL35 a écrit:
Je suis toujours sous W7, avec des dimensions de bordures différentes de W10, alors effectivement il faut adapter, j'essaie en général de faire quelque chose d'universel pour les deux, mais ce n'est pas toujours évident...

Effectivement, les largeurs de bordures sont différentes suivant le système d'exploitation utilisé.
Pour s'affranchir de ce problème, il ne faut jamais utiliser WIDTH(0) et HEIGHT(0).
Tout doit être référencé et calculé à partir de WIDTH_CLIENT(0) et HEIGHT_CLIENT(0).

JL35 a écrit:
Effectivement, la répartition des cercles ne serait régulière que sur un cercle, plus l'ellipse est allongée et plus c'est serré aux extrémité.
Je ne parlais pas de l'écart des cercles tout au long de l’ellipse, mais uniquement du raccord final de la boucle : défaut de superposition du dernier cercle dessiné. J'ai profité du fait que les cercles ne se touchent pas en haut et bas pour proposer de démarrer la boucle à 90° par rapport au 0 trigonométrique.


@Silverman : J'ai testé ta suggestion et donc ton source : super !  Merci du partage !

Bonne continuation à tous !
Revenir en haut Aller en bas
Marc

Marc


Nombre de messages : 2466
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyDim 14 Avr 2019 - 17:27

Une idée pour obtenir un écart constant entres les "billes" de l'ellipse :

Code:
DIM t%,x%,y%,x1,x2,y1,y2,pas,distance,r,a,b
DEGREES
x%=300 : ' coordonnée x% du centre de l'ellipse
y%=200 : ' coordonnée y% du centre de l'ellipse
a=180  : ' largeur de l'ellipse
b=80   : ' hauteur de l'ellipse
r=5    : ' diamètre des billes
pas=11 : ' distance entre 2 billes

FOR t% = 90 TO 450
    x1 = x%+a*COS(t%)
    y1 = y%+b*SIN(t%)

    distance = SQR((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
      
    IF distance > pas
        2D_CIRCLE x1,y1,r
        x2=x1
        y2=y1
    END_IF
NEXT t%
END

Encadrement 169

Malheureusement, il y aura toujours le problème de "raccord".
Pour cette démonstration, le raccord est en bas et pour qu'il soit presque parfait, j'ai pris une distance entre billes de 11.

a+
Revenir en haut Aller en bas
JL35




Nombre de messages : 7112
Localisation : 77
Date d'inscription : 29/11/2007

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyDim 14 Avr 2019 - 17:53

Effectivement c'est plus joli avec un écart constant, et c'est simple, mais il faut toujours un peu tricher d'une façon ou d'une autre.
Ce qui n'est pas grave du tout, il suffit de faire des essais successifs !
Je ne vois pas de solution 'absolue', cad purement mathématique.
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyDim 14 Avr 2019 - 20:39

JL35 a écrit:
Déjà mon calcul du périmètre de l'ellipse est une approximation.

Tu sais parfaitement que le calcul du périmètre de l’ellipse n’est pas du gâteau !
Je posterais tout à l’heure un code montrant différentes formules d’approximations du calcul de la circonférence de l’ellipse.
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
JL35




Nombre de messages : 7112
Localisation : 77
Date d'inscription : 29/11/2007

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyDim 14 Avr 2019 - 21:54

Tu penses bien mon ami matheux que j'avais regardé ça sur le web et que je me suis contenté de la formule approximative la plus précise.. et la plus simple. surtout que l'usage qui en est fait ici n'est quand même pas vital.
Cela dit ton intervention à côté est intéressante, mais ça montre bien la complexité de la chose, hors de proportion avec ce que je voulais faire ici, qui est purement décoratif.

J'ai ajouté là-haut la possibilité de modifier le nombre de cercles périphériques, et de refaire plusieurs fois la manoeuvre en essayant des contours et des nombre de cercles différents. Ça permet de trouver des solutions plus harmonieuses (entre autres pour éviter des chevauchements intempestifs de cercles en fin de tracé, n'est-ce pas Marc...).
Encadrement Im10
Attention, il faut bien cliquer d'abord sur le bouton 'Tracer' avant de cliquer dans le picture pour le détourage, sinon ça fait n'importe quoi.

On peut aussi modifier la couleur des cercles, la couleur de remplissage externe, ou autres (épaisseur des traits, etc), c'est très simple mais il faut intervenir dans le programme.
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyLun 15 Avr 2019 - 0:39

Cliquez  Crying or Very sad :
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
JL35




Nombre de messages : 7112
Localisation : 77
Date d'inscription : 29/11/2007

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyLun 15 Avr 2019 - 12:59

C'est vague... image trop grande ? mémoire insuffisante ? pas très parlant comme erreur...
(Monastir joli, j'y suis allé, autrefois...)

Ceci dit, il y a un truc que je ne comprends pas.
Normalement je lance l'attente du clic souris dans le picture image par appui sur le bouton 'Tracer', qui lance la sub Selzone.
Or, si on clique (par erreur) dans le picture avant de cliquer le bouton Tracer, ce clic est mémorisé et fausse la suite.
Je ne comprends pas pourquoi, ça devrait être ignoré, il n'y a pas de on_clic sur ce picture...
Revenir en haut Aller en bas
silverman

silverman


Nombre de messages : 970
Age : 52
Localisation : Picardie
Date d'inscription : 18/03/2015

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyLun 15 Avr 2019 - 15:16

J'ai la même erreur que papydall, c'est '2D_IMAGE_COPY im%,xc%-wd%/2,yc%-hd%/2,xc%+wd%/2,yc%+hd%/2' dans 'decoupe:' qui provoque ça.
jl35 a écrit:
Or, si on clique (par erreur) dans le picture avant de cliquer le bouton Tracer, ce clic est mémorisé et fausse la suite.
C'est normal, la variable système 'MOUSE_LEFT_UP(p%)' dans 'selzone()' vaut 1 puisqu'il y a eu un clic dans l'objet p%. Pour la remettre à 0 avant de la tester dans la boucle, place avant la boucle : "null = 'MOUSE_LEFT_UP(p%)"
Par contre:
Code:
Chf:
  ' Choix du fichier image source
  f$ = FILE_NAME$(3): TEXT 2,f$
  FILE_LOAD p%,f$: FILE_SAVE p%,fm$
  FILEBIN_OPEN_READ 1,fm$: ' dimensions de l'image
      FILEBIN_POSITION 1,18: w% = FILEBIN_READ(1)+256*FILEBIN_READ(1)
      FILEBIN_POSITION 1,22: h% = FILEBIN_READ(1)+256*FILEBIN_READ(1)
  FILEBIN_CLOSE 1: FILE_DELETE fm$
Chf1:
  WIDTH 0,w%+bh%: HEIGHT 0,h%+80: IF WIDTH(0)<min0% THEN WIDTH 0,min0%
  IF WIDTH(0) > SCREEN_X THEN WIDTH 0,SCREEN_X
  iF HEIGHT(0) > (SCREEN_Y-30) THEN HEIGHT 0,SCREEN_Y-30
  WIDTH p%,w%: HEIGHT p%,h%
  TOP 10,TOP(p%)+HEIGHT(p%)
  IF w%>(WIDTH(0)-bh%)
      TOP 20,HEIGHT(0)-55: LEFT 20,WIDTH(0)/2-80: SHOW 20
  END_IF
  IF h%>(HEIGHT(0)-60)
      TOP 30,HEIGHT(0)/2-80: LEFT 30,WIDTH(0)-bh%-20: SHOW 30
  END_IF
  FILE_LOAD p%,f$
  exec% = 0: CAPTION 6,"Tracer": ON_CLICK 6,Decoupe
  ' GOSUB Decoupe
RETURN
1 'on_click' par labels pour seul 1 return  confused  affraid
Je ne m'y risquerais pas, c'est un coup à plantage ça...
Revenir en haut Aller en bas
JL35




Nombre de messages : 7112
Localisation : 77
Date d'inscription : 29/11/2007

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyLun 15 Avr 2019 - 15:55

Merci silverman,

Pour le plantage de papydall j'en étais arrivé à la même conclusion.
Le 2D_IMAGE_COPY n,x1,y1,x2,y2 plante si x2 ou y2 sont inférieurs à x1 ou y1 ...

Concernant le clic sur picture qui reste mémorisé, ton idée de réinitialisation est géniale ! je ne savais pas qu'on pouvait faire ça !
J'ai donc ajouté en tête de la sub Selzone
 i% = MOUSE_LEFT_DOWN(p%): i% = MOUSE_LEFT_UP(p%): ' Réinit
et ça marche, plus de problème, tu me soulages d'un grand poids, merci !

Par contre je ne vois pas l'autre problème: bouton qui change de label et d'adresse de branchement (on_click), suivant les circonstances... apparemment ça ne me pose pas de problème !
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyLun 15 Avr 2019 - 17:39

Salut tout le monde!

Petite question toute bête ( à la Papydall, quoi !) : pourquoi choisir des cercles pour le contour de l’ellipse avec le micro problème que ça pose ? A mois que l'on tienne à une guirlande de perles !
Ne vaut-il pas mieux de tracer le contour à l’aide de … simples points ?
Ligne 85, changer
Code:

2D_CIRCLE x%,y%,r


Par

Code:

2d_point x%,y%


Moche  Evil or Very Mad :


Esthétique  king :
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
JL35




Nombre de messages : 7112
Localisation : 77
Date d'inscription : 29/11/2007

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyLun 15 Avr 2019 - 17:46

Question de goût mon cher ami, on peut imaginer tout un tas de fantaisies !

Mais des points ? autant se contenter de l'ellipse de départ sans rien mettre dessus, il y a déjà les ploints !
Par contre pour les cercles on peut faire choisir d'autres épaisseurs de trait, ça peut être plus esthétique.
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyLun 15 Avr 2019 - 18:08

C'est vrai : "il y a déjà les ploints !"


Spoiler:
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
silverman

silverman


Nombre de messages : 970
Age : 52
Localisation : Picardie
Date d'inscription : 18/03/2015

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyLun 15 Avr 2019 - 20:00

@jl35
C'est dommage de ne pas utiliser l' OPEN_DIALOG_PIC pour un logiciel des dessin Laughing

Instant nostalgie:
J'ai retrouvé ça dans mes archives. C'est un code de klaus a posté suite à un bug que tu subissais à l'époque, et modifié par mes soins geek
Code:
label down, move
dim x%, y%, x1%, y1%, file$
picture 1 : height 1,height_client(0)-40 : width 1,width_client(0): top 1,40
open_dialog_pic 50 : filter 50,"Image JPG,BMP|*.jpg;*.bmp"
file$=file_name$(50)
if file$<>"_"
 file_load 1,file$
else
 ' image par défaut
 file_load 1,"C:\Program Files\Panoramic Editor V 0.9.25\Rainbow.bmp"
end_if
image 2
option 11 : top 11,10 : left 11,10 : caption 11,"Dessin libre"
option 12 : top 12,10 : left 12,100 : caption 12,"Rectangle"
option 13 : top 13,10 : left 13,190 : caption 13,"Rectangle plein"
mark_on 12
2d_target_is 1
2d_pen_color 255,255,0
on_mouse_down 1,down

END
down:
off_mouse_down 1
  x% = mouse_x_left_down(1)
  y% = mouse_y_left_down(1)
  caption 0,"down "+str$(x%)+","+str$(y%)     :' affichage position souris
  2d_poly_from x%,y%
  if checked(11)=0 :' si ce n'est pas du dessin libre, sauvegarde le background
     2d_image_copy 2,0,0,width(1),height(1)
  end_if
  on_mouse_move 1,move
return

move:
off_mouse_move 1
 if mouse_left_up(1)=0 :' bouton gauche de la souris pas relaché
    x1% = mouse_x_position(1)
    y1% = mouse_y_position(1)
    caption 0,"move "+str$(x1%)+","+str$(y1%) :' affichage position souris
    if checked(11)=1   :' dessin libre
      2d_poly_to x1%,y1%
    end_if
    if checked(12)=1   :' rectangle vide
      2d_image_paste 2,0,0
      2d_poly_from x%,y%
      2d_poly_to x%,y1%
      2d_poly_to x1%,y1%
      2d_poly_to x1%,y%
      2d_poly_to x%,y%
    end_if
    if checked(13)=1   :' rectangle plein
      2d_image_paste 2,0,0
      2d_rectangle x%,y%,x1%,y1%
    end_if
    on_mouse_move 1,move
 else
    on_mouse_down 1,down
 end_if
return
Revenir en haut Aller en bas
JL35




Nombre de messages : 7112
Localisation : 77
Date d'inscription : 29/11/2007

Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement EmptyLun 15 Avr 2019 - 21:44

Ben ça alors, ce OPEN_DIALOG_PIC m'avait complètement échappé !
Une découverte, même si je ne vois pas trop l'avantage par rapport à l'Open_Dialog (qui visualise également les objets graphiques...).
Merci silverman, et pour la petite démo également, simple mais efficace..

@papydall
Ton erreur devait être due au fait que tu as cliqué (par inadvertance) dans l'image avant de cliquer sur le bouton Tracer et le clic était resté mémorisé.
C'est corrigé là-haut grâce à silverman.
J'ai ajouté également le choix de la couleur de remplissage extérieure, noir ou blanc.
Revenir en haut Aller en bas
Contenu sponsorisé





Encadrement Empty
MessageSujet: Re: Encadrement   Encadrement Empty

Revenir en haut Aller en bas
 
Encadrement
Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: