JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Distances sur plan Dim 6 Aoû 2017 - 17:07 | |
| Titre un peu ésotérique... Pour faire tomber un peu la fièvre du compilateur... Affichage d'une image quelconque (un plan par exemple), clic un point, déplacer la souris, relâcher, et le programme calcule la distance parcourue en pixels. On peut se déplacer en ligne droite, et/ou en parcours libre. Il s'affiche la distance parcourue et la distance cumulée depuis le début. S'il s'agit d'un plan (ville, etc.) muni d'une échelle, connaissant la taille de l'image en pixels, on peut facilement calculer le nombre de pixels par mètre (une simple règle de trois), et l'intégrer, ce qui donnera des distances en pixels et en mètres (cette valeur d'échelle peut être fractionnaire, par exemple 0,64 pixel/mètre). Le but initial était, après une randonnée en ville, de reconstituer l'itinéraire sur un plan de la ville et de calculer la distance totale parcourue. Mais il y a sûrement d'autres applications. Le programme n'est pas très long (165 lignes): - Code:
-
' Distance parcourue à la souris sur une image, en pixels ' - Distance entre deux points ' - Distance totale d'un parcours, en cumulant les distances successives ' (par exemple: longueur totale d'un itinéraire sur un plan) LABEL Quit,Chf,Chc,Chw,Des,zz,Trace,Mesure,Deparr,Valmes,Valide,Raz DIM ft$,fc$,bw,bh,f$,wi%,hi%,i%,x0,y0,x,y,dx,dy,d%,dt%,ax$,ay$,trait,ech,r,g,b DIM fact%,a$,rt$ rt$ = "Z:":' <===== Répertoire des fichiers temporaires ===== ft$ = rt$+"Ftmp.bmp": ' sauvegarde temporaire fc$ = rt$+"Tmpzone.bmp"
CAPTION 0," - MESURE DE DISTANCES SUR UNE IMAGE -" WIDTH 0,400: HEIGHT 0,100: COLOR 0,190,255,255: ON_CLOSE 0,Quit FONT_NAME 0,"Arial": FONT_BOLD 0: FONT_SIZE 0,10: BORDER_SMALL 0 ALPHA 1: TOP 1,5: CAPTION 1,"Image de fond (BMP, JPG) :" COLOR 1,255,255,0 bw = WIDTH(0)-WIDTH_CLIENT(0): bh = HEIGHT(0)-HEIGHT_CLIENT(0) EDIT 2: TOP 2,TOP(1)+20: WIDTH 2,WIDTH_CLIENT(0): TEXT 2," (clic)" ON_CLICK 2,Chf OPEN_DIALOG 3: FILTER 3,"BMP;JPG" PICTURE 10: HIDE 10
FORM 50: HIDE 50: TOP 50,0: WIDTH 50,200: HEIGHT 50,330: BORDER_SMALL 50 COLOR 50,200,255,255: FONT_BOLD 50: CAPTION 50," - OUTILS -" CONTAINER_OPTION 51: PARENT 51,50: TOP 51,2: WIDTH 51,70: HEIGHT 51,60 COLOR 51,255,255,0: CAPTION 51,"TRACÉ :" OPTION 52: PARENT 52,51: TOP 52,16: LEFT 52,10: CAPTION 52,"Libre" OPTION 53: PARENT 53,51: TOP 53,TOP(52)+22: LEFT 53,LEFT(52): CAPTION 53,"Trait" MARK_ON 53: trait = 1 ON_CLICK 52,Trace: ON_CLICK 53,Trace ALPHA 80: PARENT 80,50: TOP 80,2: LEFT 80,80: CAPTION 80,"Couleur tracé :" PICTURE 81: PARENT 81,50: TOP 81,TOP(80)+15: LEFT 81,LEFT(80) WIDTH 81,22: HEIGHT 81,22: COLOR 81,255,0,255 PICTURE 82: PARENT 82,50: TOP 82,TOP(81)+3: LEFT 82,LEFT(81)+WIDTH(81)+5 WIDTH 82,22: HEIGHT 82,16: COLOR 82,255,255,0 PICTURE 83: PARENT 83,50: TOP 83,TOP(82): LEFT 83,LEFT(82)+WIDTH(82)+2 WIDTH 83,WIDTH(82): HEIGHT 83,HEIGHT(82): COLOR 83,255,0,255 PICTURE 84: PARENT 84,50: TOP 84,TOP(82): LEFT 84,LEFT(83)+WIDTH(83)+2 WIDTH 84,WIDTH(82): HEIGHT 84,HEIGHT(82): COLOR 84,0,255,255 FOR i% = 81 TO 84 2D_TARGET_IS i%: 2D_FILL_OFF: 2D_RECTANGLE 0,0,WIDTH(i%),HEIGHT(i%): ON_CLICK i%,Chc NEXT i% ALPHA 88: PARENT 88,50: TOP 88,TOP(81)+HEIGHT(81)+3: LEFT 88,LEFT(80): CAPTION 88,"Épaisseur:" SPIN 89: PARENT 89,50: TOP 89,TOP(88)-3: LEFT 89,LEFT(88)+60: WIDTH 89,40: POSITION 89,1 ON_CHANGE 89,Chw CONTAINER 90: PARENT 90,50: TOP 90,TOP(89)+25: WIDTH 90,WIDTH_CLIENT(50): HEIGHT 90,90 CAPTION 90,"Calcul d'échelle": COLOR 90,190,255,255 ALPHA 91: PARENT 91,90: TOP 91,17: CAPTION 91,"mètres:" EDIT 92: PARENT 92,90: TOP 92,TOP(91)-3: LEFT 92,45: WIDTH 92,50 ALPHA 93: PARENT 93,90: TOP 93,TOP(91)+25: CAPTION 93,"=pixels:" EDIT 94: PARENT 94,90: TOP 94,TOP(93)-2: LEFT 94,LEFT(92): WIDTH 94,WIDTH(92) BUTTON 95: PARENT 95,90: TOP 95,TOP(92): LEFT 95,LEFT(92)+WIDTH(92)+5 CAPTION 95,"Mesurer": ON_CLICK 95,Mesure BUTTON 96: PARENT 96,90: TOP 96,TOP(94): LEFT 96,LEFT(95) CAPTION 96,"Valider": ON_CLICK 96,Valide
ALPHA 55: PARENT 55,90: TOP 55,HEIGHT(90)-20: LEFT 55,0: CAPTION 55,"Échelle :" EDIT 56: PARENT 56,90: TOP 56,TOP(55)-3: LEFT 56,50: WIDTH 56,60: TEXT 56,"0" ALPHA 57: PARENT 57,90: TOP 57,TOP(55): LEFT 57,LEFT(56)+65: CAPTION 57,"pix./mètre" ' ALPHA 58: PARENT 58,90: TOP 58,TOP(55)+20: CAPTION 58,STRING$(36,"-")
ALPHA 60: PARENT 60,50: TOP 60,TOP(90)+HEIGHT(90)+15: LEFT 60,5 CAPTION 60,"X= Y=" EDIT 61: PARENT 61,50: TOP 61,TOP(60)-3: LEFT 61,20: WIDTH 61,70 EDIT 62: PARENT 62,50: TOP 62,TOP(61): LEFT 62,110: WIDTH 62,WIDTH(61) ALPHA 65: PARENT 65,50: TOP 65,TOP(61)+25: LEFT 65,5: CAPTION 65,"Distance ponctuelle =" ALPHA 66: PARENT 66,50: TOP 66,TOP(65)+16: LEFT 66,70 CAPTION 66,"pix. m." EDIT 67: PARENT 67,50: TOP 67,TOP(66)-3: LEFT 67,5: WIDTH 67,60 EDIT 68: PARENT 68,50: TOP 68,TOP(67): LEFT 68,100: WIDTH 68,WIDTH(67)
ALPHA 70: PARENT 70,50: TOP 70,TOP(67)+25: LEFT 70,5: CAPTION 70,"Distance cumulée =" ALPHA 71: PARENT 71,50: TOP 71,TOP(70)+16: LEFT 71,70 CAPTION 71,"pix. m." EDIT 72: PARENT 72,50: TOP 72,TOP(71)-3: LEFT 72,5: WIDTH 72,60 EDIT 73: PARENT 73,50: TOP 73,TOP(72): LEFT 73,100: WIDTH 73,WIDTH(72) BUTTON 75: PARENT 75,50: TOP 75,TOP(72)+25: LEFT 75,10: CAPTION 75,"RAZ" ON_CLICK 75,Raz BUTTON 78: PARENT 78,50: TOP 78,TOP(75): LEFT 78,WIDTH(50)-95: CAPTION 78,"Quitter" ON_CLICK 78,Quit FORM 100: HIDE 100: WIDTH 100,260: HEIGHT 100,280: BORDER_SMALL 100: COLOR 100,255,255,128 TOP 100,TOP(50)+TOP(90)+HEIGHT(90)+25 FONT_NAME 100,"Arial": FONT_SIZE 100,8: FONT_BOLD 100: CAPTION 100," - ÉTALONNAGE -" ALPHA 101: PARENT 101,100 a$ = "1) Sélectionner à la souris dans l'image" a$ = a$+CHR$(10)+"une zone contenant une longueur connue" a$ = a$+CHR$(10)+"en mètres (échelle)" a$ = a$+CHR$(10)+" Zoom sélection X" CAPTION 101,a$ SPIN 120: PARENT 120,100: TOP 120,TOP(101)+39: LEFT 120,160: WIDTH 120,40: POSITION 120,3 ALPHA 102: PARENT 102,100: TOP 102,TOP(101)+65 CAPTION 102,"2) Cliquer dans la sélection affichée le point"+CHR$(10)+"de départ de la longueur à mesurer" ALPHA 103: PARENT 103,100: TOP 103,TOP(102)+30: CAPTION 103," X1 = " EDIT 104: PARENT 104,100: TOP 104,TOP(103)-3: LEFT 104,30: WIDTH 104,60 ALPHA 105: PARENT 105,100: TOP 105,TOP(102)+65 CAPTION 105,"3) Cliquer le point d'arrivée de la longueur"+CHR$(10)+"à mesurer" ALPHA 106: PARENT 106,100: TOP 106,TOP(105)+30: CAPTION 106," X2 = " EDIT 107: PARENT 107,100: TOP 107,TOP(106)-3: LEFT 107,LEFT(104): WIDTH 107,WIDTH(104) ALPHA 108: PARENT 108,100: TOP 108,TOP(107)+35: CAPTION 108,"Longueur relative = pixels" EDIT 109: PARENT 109,100: TOP 109,TOP(108)-3: LEFT 109,100: WIDTH 109,65 BUTTON 110: PARENT 110,100: TOP 110,TOP(109)+30: LEFT 110,WIDTH(100)/2-50 CAPTION 110,"OK": ON_CLICK 110,Valmes FORM 200: HIDE 200: BORDER_SMALL 200 PICTURE 201: PARENT 201,200
dt% = 0 ' ============================================================================== END ' ============================================================================== Quit: IF FILE_EXISTS(ft$) = 1 THEN FILE_DELETE ft$ IF FILE_EXISTS(fc$) = 1 THEN FILE_DELETE fc$ TERMINATE RETURN ' ============================================================================== Chf: f$ = FILE_NAME$(3): IF LEN(f$) < 5 THEN RETURN TEXT 2,f$ DimJpgBmp(f$) HIDE 1: HIDE 2 WIDTH 0,wi%+bw: HEIGHT 0,hi%+bh TOP 10,0: WIDTH 10,wi%: HEIGHT 10,hi%: FILE_LOAD 10,f$: SHOW 10 CAPTION 0,f$+" ("+STR$(wi%)+" x "+STR$(hi%)+" pixels)" SHOW 50 FILE_SAVE 10,ft$ RETURN ' ============================================================================= zz: r=COLOR_PIXEL_RED(81,5,5): g=COLOR_PIXEL_GREEN(81,5,5): b=COLOR_PIXEL_BLUE(81,5,5) 2D_TARGET_IS 10: 2D_PEN_COLOR r,g,b: 2D_PEN_WIDTH POSITION(89) WHILE MOUSE_LEFT_DOWN(10) = 0 x = MOUSE_X_POSITION(10): y = MOUSE_Y_POSITION(10) TEXT 61,STR$(x): TEXT 62,str$(y) PAUSE 100 END_WHILE ech = VAL(TEXT$(56)) CLIPBOARD_COPY 10 Des: x0 = x: y0 = y: d% = 0: ' distance parcourue en pixels TEXT 61,STR$(x): TEXT 62,str$(y) WHILE MOUSE_LEFT_UP(10) = 0 x = MOUSE_X_POSITION(10): y = MOUSE_Y_POSITION(10) dx = x-x0: dy = y-y0 IF dx <> 0 OR dy <> 0 i% = SQR(dx*dx + dy*dy) IF trait = 0 d% = d% + i% ELSE d% = i% END_IF TEXT 67,STR$(d%): IF ech<>0 THEN i% = d%/ech: TEXT 68, STR$(i%) ax$ = RIGHT$(" "+STR$(x),4): ay$ = RIGHT$(" "+STR$(y),4) IF trait = 1 THEN CLIPBOARD_PASTE 10 2D_LINE x0,y0,x,y IF trait = 0 THEN x0 = x: y0 = y END_IF PAUSE 50 END_WHILE dt% = dt% + d%: d% = 0 TEXT 72,STR$(dt%): IF ech<>0 THEN i% = dt%/ech: TEXT 73, STR$(i%) TO_FOREGROUND 50 GOTO zz RETURN ' ============================================================================== Chc: ' Couleur du tracé (pour lisibilité) i% = NUMBER_CLICK x = MOUSE_X_LEFT_DOWN(i%): y = MOUSE_Y_LEFT_DOWN(i%) r=COLOR_PIXEL_RED(i%,5,5): g=COLOR_PIXEL_GREEN(i%,5,5): b=COLOR_PIXEL_BLUE(i%,5,5) COLOR 81,r,g,b 2D_TARGET_IS 81: 2D_RECTANGLE 0,0,WIDTH(81),HEIGHT(81): 2D_TARGET_IS 10 2D_PEN_COLOR r,g,b RETURN ' ============================================================================== Chw: ' Largeur du tracé (pour lisibilité) 2D_PEN_WIDTH POSITION(89) RETURN ' ============================================================================== Trace: ' Type de tracé: une ligne droite, ou tracé libre IF CLICKED(52) = 1 trait = 0 ELSE trait = 1: ' ligne droite END_IF RETURN ' ============================================================================== Mesure: TEXT 104,"": TEXT 107,"": TEXT 109,"" SHOW 100 Selzone(10,201): ' sélect zone dans picture 10, résultat dans picture 201 FILE_SAVE 201,fc$: DimJpgBmp(fc$) fact% = POSITION(120): ' facteur de grossissement (Zoom sur la sélection) WIDTH 200,fact%*wi%+bw: HEIGHT 200,fact%*hi%+bh: FULL_SPACE 201 TOP 200,(SCREEN_Y-HEIGHT(200))/2: LEFT 200,(SCREEN_X-WIDTH(200))/2 STRETCH_ON 201 FILE_LOAD 201,fc$: FILE_DELETE fc$ TO_FOREGROUND 100 SHOW 200: TO_FOREGROUND 200 ON_CLICK 201,Deparr x0 = -1: y0 = -1: x = -1: y = -1 RETURN ' ============================================================================== Deparr: IF x0 = -1 x0 = MOUSE_X_POSITION(201): y0 = MOUSE_Y_POSITION(201) TEXT 104,STR$(x0) TO_FOREGROUND 100 ELSE x = MOUSE_X_POSITION(201): y = MOUSE_Y_POSITION(201) TEXT 107,STR$(x) i% = ABS(x-x0): TEXT 109,STR$(i%) END_IF IF x <> -1 OFF_CLICK 201 HIDE 200 TO_FOREGROUND 50: TO_FOREGROUND 100 END_IF RETURN ' ============================================================================== Valmes: fact% = POSITION(120): ' facteur d'agrandissement de la sélection x = VAL(TEXT$(109))/fact%: ' longueur réelle en pixels TEXT 94,STR$(x) HIDE 100: TO_FOREGROUND 50 RETURN ' ============================================================================== Valide: HIDE 100 IF TEXT$(92)<>"" AND TEXT$(94) <> "" x = VAL(TEXT$(92)): ' longueur en mètres y = VAL(TEXT$(94)): ' longueur en pixels IF x <> 0 AND y <> 0 ech = y/x: ' pixels par mètre TEXT 56,STR$(ech) END_IF END_IF GOTO zz RETURN ' ============================================================================== Raz: ' Remise à zéro des compteurs d% = 0: dt% = 0 TEXT 67,"0": TEXT 68,"0" TEXT 72,"0": TEXT 73,"0" FILE_LOAD 10,ft$: ' régénère le fond d'écran RETURN ' ============================================================================== SUB DimJpgBmp(f$) ' Image JPG ou BMP exclusivement, dimensions dans wi% et hi% DIM_LOCAL fm$: fm$ = rt$+"Provy.bmp": ' rt$ = répertoire des fichiers temporaires PICTURE 1099: HIDE 1099: FILE_LOAD 1099,f$: FILE_SAVE 1099,fm$: DELETE 1099 FILEBIN_OPEN_READ 1,fm$ FILEBIN_POSITION 1,18: wi% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_POSITION 1,22: hi% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_CLOSE 1 FILE_DELETE fm$ END_SUB ' ============================================================================== SUB Selzone(p%,p1%) ' Sélectionner à la souris ne zone dans le picture p% ' Résultat -> picture p1%, ou clipboard si p1% <= 0 ' (p1% est redimensionné aux dimensions de la sélection) DIM_LOCAL t,x1,y1,x2,y2 IMAGE 999 WHILE MOUSE_LEFT_DOWN(p%) = 0: PAUSE 100: END_WHILE x1 = MOUSE_X_LEFT_DOWN(p%): y1 = MOUSE_Y_LEFT_DOWN(p%) CLIPBOARD_COPY p%: t = NUMBER_2D_TARGET 2D_TARGET_IS p%: 2D_PEN_COLOR 255,0,255: 2D_PEN_WIDTH 1: 2D_FILL_OFF WHILE MOUSE_LEFT_UP(p%) = 0 x2 = MOUSE_x_POSITION(p%): y2 = MOUSE_Y_POSITION(p%) CLIPBOARD_PASTE p%: 2D_RECTANGLE x1,y1,x2,y2 PAUSE 100 END_WHILE CLIPBOARD_PASTE p%: ' régénère l'image 2D_IMAGE_COPY 999,x1,y1,x2,y2 IF p1% > 0 WIDTH p1%,ABS(x2-x1): HEIGHT p1%,ABS(y2-y1): 2D_TARGET_IS p1%: 2D_IMAGE_PASTE 999,0,0 ELSE CLIPBOARD_COPY 999 END_IF DELETE 999: 2D_TARGET_IS t END_SUB ' ============================================================================== La boîte à outils se superpose à l'image, on peut la déplacer où on veut pour qu'elle ne gêne pas. Dans l'exemple ci-dessous, le tracé a été fait en une seule passe, en tracé libre, donc la distance ponctuelle est égale à la distance totale, mais on peut le faire en plusieurs fois, et combiner des tracés rectilignes et des tracés libres. Le bouton Raz réinitialise les distances. PS du 07/08 J'ai ajouté une facilité pour calculer l'échelle à appliquer. C'est valable pour des images qui contiennent une échelle (plans, cartes), et plus généralement une longueur connue en mètres. Fonction 'Mesurer', on sélectionne dans l'image la zone contenant cette longueur, qui est présentée agrandie d'un facteur choisi, on clique successivement le début et la fin de ladite longueur, on renseigne la longueur en mètres, puis 'Valider': et le facteur d'échelle (pixels par mètre) est calculé automatiquement. 10/08 Mise à jour
Dernière édition par JL35 le Jeu 10 Aoû 2017 - 20:56, édité 2 fois | |
|