Forum Liberty Basic France

Jeux » "Tentative" de Simulation de pilotage d'un sous-marin DSRV... DSRV = petit sous-marin de sauvetage en grande profondeur.
Le 31/12/2012 à 19h01

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2457
Reprise du message précédent

Et ben ça y est, le Soum manoeuvre comme un chef.
Il fait demi-tour et tourne en rond qu'en la barre est maintenue, et garde le cap quand la barre reviens à zéro.
Il faut mettre un coeff de réduction sur l'effet de la barre. c'est un peu vif dans la réaction.

L'essayer c'est l'adopter ----> Enfer de Trigo.zip





Edité par Roland Le 01/01/2013 à 00h09
____________________
Roro

   
Le 02/01/2013 à 16h20

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2457
Salut, et meilleurs voeux pour 2013.
Cassiope, dans ton "Sonar" dernière version,aprés avoir longtemps cherché d'où sortait gX et gY, j'ai fini par comprendre qu'ils étaient générés par: posxy. Reprend moi si je me gourre.
Esit-il possible de mettre au milieu au bon endroit; une boucle qui parcourrait le vecteur du point 0
à son extrémité avec ce posxy qui renverrait à chaque cycle (de la boucle) la position du point de lecture ?

PS: A-tu remarqué que dans ma dernière version de "enfer de trigo" le cap était affiché ?
Et ce, sans etre obligé de fixer un dipole à la coque du Soum (Economie de soudures)......à+.
____________________
Roro

   
Le 02/01/2013 à 18h11

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Roland:
Cassiope, dans ton "Sonar" dernière version,aprés avoir longtemps cherché d'où sortait gX et gY, j'ai fini par comprendre qu'ils étaient générés par: posxy. Reprend moi si je me gourre.

Non non, tu ne te gourres pas. "posxy" donne la position courante dans la fenêtre graphique concernée.

Roland:
Esit-il possible de mettre au milieu au bon endroit; une boucle qui parcourrait le vecteur du point 0
à son extrémité avec ce posxy qui renverrait à chaque cycle (de la boucle) la position du point de lecture ?

J'ai rien compris :heink
Il faudrait juste lancer tout les 7.5° comme le propose Chris, une routine qui "lit" sur la MAP() la distance d'un obstacle devant le soum à sa profondeur, et renvoi une valeur entre 0 et 100. (101 = pas d'obstacle)
Pour le moment c'est juste un RND qui produit une valeur entre 65 et 95.

Roland:
PS: A-tu remarqué que dans ma dernière version de "enfer de trigo" le cap était affiché ?
Et ce, sans etre obligé de fixer un dipole à la coque du Soum (Economie de soudures)......à+.

Oui.
Ton code m'a surtout rappelé que dans le mien dsrvX,dsrvY ne sont pas des coordonnées en pixel, mais en n° de case dans la MAP() :lol

@+

____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 02/01/2013 à 18h31

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2457
Citation:
J'ai rien compris

Dans la boucle ??? de rotation de "ton vecteur" (qui a l'air d'etre virtuel), celui qui teste à la distance aléatoire.

Au début de cette boucle, et à l'intérieur de celle ci.
il s'agirait de mettre une boucle dans laquelle on déplacerait le "pen" en position "up".
comme la ligne existante et "sa distance aléatoire "la distance variant de zéro à l'extrémité (100)

posxy, qui serait dans la meme instruction nous ramenerait la position du "pen".
Ce la constituerait une lecture vectoriele.

Je suis sur le changement d'echelle et l'agrandissement de la carte.
Si tu regarde ce que j'ai fait, tu va voir que le pinceau est trop GROS ! :heink

Code JB :
 
 
    nomainwin
    WindowWidth = 400
    WindowHeight = 400
    UpperLeftX = (DisplayWidth-WindowWidth) / 2
    UpperLeftY = (DisplayHeight-WindowHeight) / 1.5
 
    GLOBAL Gwidth, Gheight, dc, Xmax, Ymax, deep, filename$
    GLOBAL opgrad, opmp
    DIM info$(1,1)
 
   textbox #w.a, 40, WindowHeight-55, 40, 20
   textbox #w.b, 90, WindowHeight-55, 40, 20
   textbox #w.c, 140, WindowHeight-55, 40, 20
   textbox #w.d, 190, WindowHeight-55, 40, 20
   textbox #w.e, 240, WindowHeight-55, 40, 20
 
    'statictext #w.infos, "", 40, WindowHeight-55, 40, 20
    'BUTTON #w.sav, "Save", SaveMap, UL, 5, WindowHeight-55, 30, 20
   ' graphicbox #w.grad, 4,4, WindowWidth-14, 50
    graphicbox #w.map, 4, 55, WindowWidth-14, 280
    open "  Map 20 x 20 editor..." for window_nf as #w
    opmp=1
    #w "trapclose quit"
 
    #w.map "down ; home ; posxy CenterX CenterY"
    Gwidth = CenterX * 2
    Gheight = (CenterY * 2)
 
    filename$ = "map.txt"
    dc = 8     ' a cell in pixel
    Xmax = 100 ' int(Gwidth-1)
    Ymax = 50 ' int(Gheight-1)
    Xg = 250   ' nb of graduation for delph (0 to 2500m)
 
    DIM map(Xmax+1,Ymax+1)
    deep = 1
    for y = 0 to Ymax        ' init all map() to 10m
        for x = 0 to Xmax :map(x,y) = deep :next
    next
    #w.map "fill 0 254 255"
 
    #w.a,str$(int(Gwidth-1))''§§§§§§§§§§§§§§§§§§§§§§§§§§§§
  'wait
    if fileExists(DefaultDir$, filename$) then
        open filename$ for input as #grid
        for y=0 to Ymax
            LINE INPUT #grid, grid$
            for x=0 to Xmax
                map(x,y)=val(word$(grid$,x+1))
                Dcolor$ = "0 ";255-map(x,y);" 255"
                if map(x,y) = 0 then Dcolor$ = "253 238 153"
                #w.map "set ";x;" ";y;" ; backcolor ";Dcolor$;" ; color ";Dcolor$
            next
        next
        close #grid
    end if
   '--------------------------------- GRAD Scale Deep -------------------------
    WindowWidth = 824
    WindowHeight = 130
    UpperLeftX = 100 ' (DisplayWidth-WindowWidth) / 4
    UpperLeftY = 100 ' (DisplayHeight-WindowHeight) / 4
    graphicbox #s.grad, 4,4, 810, 50
    statictext #s.infos, "", 40, 65, WindowWidth-150, 20
    BUTTON #s.sav, "SaveMap", SaveMap, UL, WindowWidth-100, 62 , 80, 30
    open "    Deep Scale" for window_nf as #s
    opgrad=1 ' flag d'ouverture #s
    #s "trapclose quit"
    #s.grad "down ; fill black"
    #s.sav "!font Arial 10 bold"
    #s.infos "!font courrier_new 12 bold"
    widthgrad=810 ' pour pas mélanger avec "Gwidth" de la map
    deep = 1
    Xg = 250   ' nb of graduation for delph (0 to 2500m)
    dc = 8     ' a cell in pixel
    for y = 0 to Ymax        ' init all map() to 10m
        for x = 0 to Xmax :map(x,y) = deep :next
    next
 
    for c = 1 to Xg
        #s.grad "backcolor black ; color yellow "
        if c=1 or c mod 10 = 0 or c=Xg then #s.grad "place ";5+(c-1)*int((widthgrad-20)/Xg);" 15;|";c
        #s.grad "color black"
        #s.grad "place ";10+(c-1)*int((widthgrad-20)/Xg);" 25"
        #s.grad "backcolor 0 ";255-c;" 255 ; boxfilled ";12+c*int((widthgrad-20)/Xg);" ";25+20
    next
    #s.grad "backcolor black ; color yellow ; place ";widthgrad-40;" 40 ;|x10 m"
    #s.grad "backcolor 253 238 153 ; place 0 26 ; boxfilled 10 44"
    #s.grad "flush ; discard"
 
    #s.grad "when leftButtonDown [deep]"
    #s.grad "when characterInput [arrows]"
 
    #w.map "when characterInput [arrows]"
    #w.map "when leftButtonMove [mark]"
    #w.map "when mouseMove [XY]"
 
    goto [arrows]
 
    [infos]
        #s.infos "Deep set : ";deep*10;" m";space$(12);" on map : ";map(cx,cy);space$(35);"case = ";cx;" km ,  ";cy;" km    "
    return
 
    [mark]
        cx = int(MouseX/dc)
        cy = int(MouseY/dc)
        if cx<0 then cx=0
        if cx>Xmax then cx=Xmax
        if cy<0 then cy=0
        if cy>Ymax then cy=Ymax
        Dcolor$ = "0 ";255-deep;" 255"
        if deep = 0 then Dcolor$ = "253 238 153"
        #w.map "place ";cx*dc;" ";cy*dc;" ; backcolor ";Dcolor$;" ; color ";Dcolor$;" ; boxfilled ";cx*dc+dc;" ";cy*dc+dc
        #w.map "flush ; discard"
        map(cx,cy) = deep
        gosub [infos]
    wait
 
    [arrows]
        k$ = right$(Inkey$,1)
        select case k$
        case chr$(_VK_RIGHT) :deep = deep + 1 : if deep>Xg then deep = Xg
        case chr$(_VK_LEFT)  :deep = deep - 1 : if deep<0 then deep = 0
        end select
        xD = 10+(deep-1)*int((widthgrad-20)/Xg)
        #s.grad "color black ; place ";oldxD;" 23 ; box ";oldxD+int((widthgrad-20)/Xg)+1;" ";26+20
        oldxD = xD
        #s.grad "color yellow ; place ";xD;" 23 ; box ";xD+int((widthgrad-20)/Xg)+1;" ";26+20
        gosub [infos]
        #w.map "setfocus"
    wait
 
    [deep]
        deep = int((MouseX-10)/int((WindowWidth-30)/Xg))
        if deep<0 then deep=0
        xD = 10+(deep-1)*int((widthgrad-20)/Xg)
        #s.grad "color black ; place ";oldxD;" 23 ; box ";oldxD+int((widthgrad-20)/Xg)+1;" ";26+20
        oldxD = xD
        #s.grad "color yellow ; place ";xD;" 23 ; box ";xD+int((widthgrad-20)/Xg)+1;" ";26+20
        gosub [infos]
    wait
 
    [XY]
        cx = int(MouseX/dc)
        cy = int(MouseY/dc)
        gosub [infos]
 
   wait
    sub SaveMap hdle$
        open filename$ for output as #grid
        for y = 0 to Ymax
            caseLine$ = ""
            for x = 0 to Xmax
                caseLine$ = caseLine$;map(x,y);" "
            next
            #grid, caseLine$
        next
        close #grid
    end sub
 
    sub pause temp   'pause en millisecondes
        timer temp, [temps]
        wait
        [temps]
        timer 0
    end sub
 
 
    FUNCTION fileExists(path$, filename$)
        'DIM info$(1,1)   must be declared at the start of the prog.
        files path$, filename$, info$(  ' path$ = 'DefaultDir$' generally.
        fileExists = val(info$(0, 0))  'not zero if true
    END FUNCTION
 
    sub quit handle$
    if opgrad=1 then close #s:opgrad=0
    if opmp=1 then close #w:opmp=0
       ' close #handle$
        'call SaveMap "#w.map"
        END
    end sub
 
 




Edité par Roland Le 02/01/2013 à 18h39
____________________
Roro

   
Le 03/01/2013 à 12h52

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Je ne sais pas trop ce que tu veux faire, mais si c'est juste donner une plus grande définition à la MAP, il te suffit de donner une valeur plus petite à "dc" (dc=4 par exemple doublera la quantité de données de la MAP), et surtout de donner un autre nom que "map.txt" à filename$ dans le code Map_Edit.bas qui dans ce ZIP : submarine_simulator.zip .
Mais ça risque d'être très long à dessiner tout ça... :siffle

@+



Edité par cassiope01 Le 03/01/2013 à 15h20
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 03/01/2013 à 18h38

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2457
Non, le but c'est de faire directement la lecture vectorielle du tableau, sans aucun calculs.
Ta ligne qui contient le fameux posxy, et qui teste à la distance aléatoire; au lieu de fixer cette distance tu la fait varier de 1,à 99 dans une boucle, le test se faisant sur le tableau. avec: case=pixel
Evidemment, il y a le problème de la dim du tableau (100,50) ce qui me fait dire qu'il faut: soit agrandir la carte, soit changer l'échelle, soit diminuer la portée du sonar.
A part ça:
Tu a mesuré le temps de cycle, ?.. Pour avoir mis 16ms.
J'ai ajouté quelques fonctionalités:
Affichage de l'azimut et bmpbuttons de défilement pour la sonde.
Affichage de la distance verticale entre le Soum et le fond
avec digits plus petits
et quelques calculs.
le temps de cycle est passé à 31ms.
Je pense qu'on peut délester des trucs:
Les ballasts, une fois réglés, pourraient n'etres rafraichis, qu'à l'occasion d'un changement d'état.
Les boutons: carte, ballast, egaliseur; pourraient etres des bmpbutton
qui pourraient etres retirés du cycle.
Les deux affichages que j'ai ajoutés étant dans des modules séparés on peut ne les raffraichir que tous les N cycles.
De meme d'ailleurs que tous les afficheurs.
Parce que le pauvre jb ne va pas tarder à transpirer et à tirer la langue.
Qu'en pense l'ingénieur DCN ?



Edité par Roland Le 03/01/2013 à 18h41
____________________
Roro

   
Le 04/01/2013 à 13h15

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Roland:
Tu a mesuré le temps de cycle, ?.. Pour avoir mis 16ms.

16ms c'est juste une valeur évaluée "à l'oeil" pour une bonne fluidité de l'affichage sonar.

Roland:
Je pense qu'on peut délester des trucs:
Les ballasts, une fois réglés, pourraient n'etres rafraichis, qu'à l'occasion d'un changement d'état.
Les boutons: carte, ballast, egaliseur; pourraient etres des bmpbutton
qui pourraient etres retirés du cycle.

C'est déjà la cas, puisque tout ça n'intervient QUE lorsque le joueur appui sur son bouton gauche de souris, exactement comme s'il cliquait sur un bmpbutton. C'est le rôle de #w.cmds "when leftButtonDown [command]".

Roland:
Parce que le pauvre jb ne va pas tarder à transpirer et à tirer la langue.

c'est ce que j'ai expliqué dès le début.

Tout ça est un peu trop "prise de tête" pour moi :siffle

Je vais attendre les calculs de Chris.

@+
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 04/01/2013 à 14h24

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2457
Citation:
16ms c'est juste une valeur évaluée "à l'oeil"

Et ben, t'a un sacré bon oeil, c'est pile poil le temps de cycle de ta première version.
J'ai meme crus m'etre planté dans ma procédure de mesure.
Mais non puisque le temps est passé à 31ms avec la meme procédure; et les trucs que j'ai ajoutés.
Citation:
C'est déjà la cas, puisque tout ça n'intervient QUE lorsque le joueur appui sur son bouton gauche de souris, exactement comme s'il cliquait sur un bmpbutton. C'est le rôle de #w.cmds "when leftButtonDown [command]".

Ah oui, en effet. :nex
Hey ! tu ne va pas t'échapper aprés nous avoir mis cette "bombe amorcée" entre les pattes. ;) ;)
____________________
Roro

   
Le 05/01/2013 à 01h01

Libertynaute Débutant

Groupe: Membre

Inscrit le: 04/06/2012
Messages: 23
Bonsoir tout le monde.
Suis de retour à la maison. Je vais mettre au travail pour le code dès demain matin pour le code pour le radar.
À plus tard
____________________
ChRiS :)

Web    
Le 06/01/2013 à 04h41

Libertynaute Débutant

Groupe: Membre

Inscrit le: 04/06/2012
Messages: 23
Je suis tombé sur un os. Pour vous ce n'est rien,mais moi je n'y arrive pas..(c'est de la prog.)
Je commence à faire des tests sur mon code (c'est pas mal avancé), mais je ne sais pas comment aller chercher l'information dans map.txt. Corrigez moi si je me trompe, mais les fichiers .txt sont vus par le système comme une "matrice" à 1 dimension.
Je fais comment, par exemple pour obtenir la profondeur au point (20,30) dans la map ????



Edité par chris Le 06/01/2013 à 05h56
____________________
ChRiS :)

Web    
Le 06/01/2013 à 10h20

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Tu écris donc un code en partant de la feuille blanche, sans t'appuyer sur mon code ! :top
Pas de pb Chris, il te suffit d'y insérer les 2 routines de mon code qui s'occupent de remplir la variable tableau à 2 dimensions map(x,y) avec le contenu du fichier map.txt .
Ne pas oublier de déclarer avant sa dimension Xmax = 100, Ymax = 50.
En fait le fichier map.txt contient 50 lignes de 100 chiffres.

Il s'agit de [ReadMapFile] et la fonction fileExists(path$, filename$).

Code VB :
    [ReadMapFile]
        filename$ = "map.txt"
        if fileExists(DefaultDir$, filename$) then   ' vérifie l'existance du fichier map.txt
            open filename$ for input as #grid       ' ouverture du fichier map.txt en lecture
            for y=0 to Ymax
                LINE INPUT #grid, grid$    ' pour chaque ligne du fichier map.txt
                for x=0 to Xmax : map(x,y)=val(word$(grid$,x+1)) : next   ' rempli la variable tableau avec chaque chiffre de cette ligne
            next
            close #grid     ' fermeture du fichier map.txt
        else
            notice "No file  ";upper$(filename$)
            goto [exit]
        end if
    return
 
 
    FUNCTION fileExists(path$, filename$)
        'DIM info$(1,1)   must be declared at the start of the prog.
        files path$, filename$, info$(  ' path$ = 'DefaultDir$' generally.
        fileExists = val(info$(0, 0))  'not zero if true
    END FUNCTION
 
   [exit]
        end
 
 

puis tu écris gosub [ReadMapFile] quelque part au début de ton code, et le tour est joué :top


J'espère qu'à mon tour je saurai insérer dans mon code les formules que tu développes dans le tien, et qui pourront me donner simplement la distance du premier obstacle devant le soum à sa profondeur et dans la direction qu'il suit...!

A bientôt Chris.



Edité par cassiope01 Le 06/01/2013 à 10h35
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 06/01/2013 à 13h42

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2457
Salut Chris, et la valeur de la profondeur de la case map(20,30), c'est tout simplement:
profondeur= map(20,30) ....fois 10 pour l'affichage (sous le contrôle de Cassiope) ....à+.
____________________
Roro

   
Le 06/01/2013 à 20h53

Libertynaute Débutant

Groupe: Membre

Inscrit le: 04/06/2012
Messages: 23
Bonjour!
Je ne suis pas arrivé à intégrer ta sous routine à mon programme, même en déclarant " DIM info$(1,1)", en déclarant Xmax et Ymax et en appelant ta sous routine en début de programme....
Le compilateur ne cesse de me dire que map a 1 seule dimension.
Bon, je vais faire un truc, je t'envoie mon travail (il fonctionne bien car je l'ai testé en me bricolant moi même une matrice à 2 dim "map": tout fonctionne parfaitement.)
Le résultat qui t'intéresse est une matrice "matr" de 7 par 48. Les données sont codées dans la matrice suivant la convention suivante:
la première donnée est stockée à matr(1,0) et la dernière à matr(7, 47) . le X donne la distance à partir de soum (de 1 à 7) et le Y donne le # du segment en postulant que le # 0 est à gauche.
Quand le contenu vaut 1 alors il y a un objet (le soum est plus profond que le fond de mer) et quand il vaut zéro c'est le contraire.
J'ai pensé que tu débuterais ton balayage radar en commençant par la gauche .
"Tout ça pour ça...."
Ça semble assez ridicule comme programme, mais j'ai réussi à optimiser tous les calculs pour faire le plus court possible.
Essaie voir ce que tu peux en tirer.... et donne moi des nouvelles.
Si tu es intéressé à obtenir une information (un nombre de mètres) qui sépare le soum d'un obstacle qui serait droit devant, je pourrais te bricoler ça facilement, laisse-le moi savoir.
ChRiS.








sonartest1.bas


____________________
ChRiS :)

Web    
Le 06/01/2013 à 21h12

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2457
Ah ah! Chris, tu fais comme moi, tu essaie de tordre le bras à jb.
ta ligne:
if map(posXXX(z),posYYY(z))<(value(2)/10) then
Tu la décompose, comme ça:
px=posXXX(z): py=posYYY(z)
if map(px,py)<(value(2)/10) then

Mais il faut que Cassiope intègre ton bout dans son code pour avoir la map( )
Je le fais aussi ,mais façon: "bourrin" (niveau affichage) ......à+.
____________________
Roro

   
Le 07/01/2013 à 12h42

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Salut Chris,
chris:
Bonjour!
Je ne suis pas arrivé à intégrer ta sous routine à mon programme, même en déclarant " DIM info$(1,1)", en déclarant Xmax et Ymax et en appelant ta sous routine en début de programme....
Le compilateur ne cesse de me dire que map a 1 seule dimension.

Oups ! c'est ma faute. J'ai oublié de te dire de déclarer la variable tableau map(x,y) en écrivant dim map(Xmax,Ymax) après avoir implémenté Xmax et Ymax bien sûr... :siffle
Avec JB, si une variable tableau a plus de 10 éléments, il faut la déclarer. Elle est globale par défaut.

chris:
Si tu es intéressé à obtenir une information (un nombre de mètres) qui sépare le soum d'un obstacle qui serait droit devant, je pourrais te bricoler ça facilement, laisse-le moi savoir.
ChRiS.

OUI OUI, je serais très très intéressé par ça, ou du moins une valeur de 0 à 100, 0 étant le soum et 100 étant la portée maxi du sonar... :top

Maintenant je vais zieuter ton code et tenter de le faire fonctionner avec MAP().



Roland:
Ah ah! Chris, tu fais comme moi, tu essaie de tordre le bras à jb.
ta ligne:
if map(posXXX(z),posYYY(z))<(value(2)/10) then
Tu la décompose, comme ça:
px=posXXX(z): py=posYYY(z)
if map(px,py)<(value(2)/10) then

Ca revient au même Roland, il n'y a pas de problème là.


@+



Edité par cassiope01 Le 07/01/2013 à 12h46
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 07/01/2013 à 13h39

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Chris, voici ce que donne ton code avec lecture de map.txt :top

Bien sûr il faut le lancer dans le répertoire qui contient le fichier map.txt !

Code VB :
 
'   Définition des variables
'
'dsrvX et dsrvY : position actuelle du soum dans une map de 100 par 50
'value(1)  :azimut,  angle (direction de la trajectoire présente) du soum de 0 à 360°
'value(2)  : profondeur du soum en mètres
'
'    variables intermédiaires
'
'posX(z), ou z vaut de 1 à 7 :  '
'posY(z),                       '  coordonnées des 7 point de balayage autout de la position du soum pendant les calculs
'
'deltaX(z) '
'deltaY(z) '  variation de la position X et Y des 7 points lors d'une rotation de (azimut + 7.5°*j) autour du point d'origine
'posXX et posYY : nouvelle position des points
'posXXX et posYYY : valeur absolue de la nouvelle position des points
'angle : c'est l'azimut converti en radians par la multiplication avec conv

DIM info$(1,1)
conv=0.017453292   'conversion degrés par radian

value(1)= 90 'test avec valeurs
value(2)=60  'test
dsrvX=10     'test position du soum sur la map(x,y)
dsrvY=10     '
Xmax=100     'dimension de la map(x,y)
Ymax=50      '
DIM matr(7, 48)   'déclaration de la martice sonar
DIM map(Xmax,Ymax)  'déclaration de la map
gosub [ReadMapFile]  ' lecture du fichier map.txt

    for z=1 to 7          '
        posY(z)=dsrvY     ' sert à définir 7 points (séparés d'une unité)  à l'ouest de la position du soum
        posX(z)=dsrvX-z   ' si celui-ci regarde vers le nord (dsrvX, dsrvY) pour un balayage circulaire de 360°.
    next z                '

    for j=0 to 47   'pour chacun des 48 segments balayés

       for z=1 to 7
         angle = ((7.5*j)+value(1))*conv
         deltaX(z) = z-(z*cos(angle))
         deltaY(z) = -1*z*sin(angle)  '48 rotations successives de 7.5 degrés
         posXX(z) = posX(z)+deltaX(z)
         posYY(z) = posY(z)+deltaY(z)    '...calcul des nouvelles 7 positions
         posXXX(z)= int(posXX(z)+0.5)
         posYYY(z)= int(posYY(z)+0.5)        'valeur abs et arrondi des coordonnées
         if posXXX(z)<0 then posXXX(z)=0 'test si le balayage déborde de la map en x
         if posYYY(z)<0 then posYYY(z)=0 'test si le balayage déborde de la map en y : dans les deux cas on place la coordonnée à zéro
         if map(posXXX(z),posYYY(z))<(value(2)/10) then                     'comparaison de la prof du soum avec la prof des points
               matr(z, j)=1
         else
               matr(z, j)=0
         end if
         print matr(z, j);
      next z
      print
 
    next j
 
wait
 
    [ReadMapFile]
        filename$ = "map.txt"
        if fileExists(DefaultDir$, filename$) then   ' vérifie l'existance du fichier map.txt
            open filename$ for input as #grid       ' ouverture du fichier map.txt en lecture
            for y=0 to Ymax
                LINE INPUT #grid, grid$    ' pour chaque ligne du fichier map.txt
                for x=0 to Xmax : map(x,y)=val(word$(grid$,x+1)) : next   ' rempli la variable tableau avec chaque chiffre de cette ligne
            next
            close #grid     ' fermeture du fichier map.txt
        else
            notice "No file  ";upper$(filename$)
            goto [exit]
        end if
    return
 
    FUNCTION fileExists(path$, filename$)
        files path$, filename$, info$(
        fileExists = val(info$(0, 0))
    END FUNCTION
 
   [exit]
        end
 

Je pense que je n'aurai pas trop besoin de la matrice matr(7, 48) !!!



D'autre part, je ne sais pas trop quelle est la norme en trigonométrie, mais dans mon code je considère 0° en haut pour la rotation du sonar, ce qui devra en fait correspondre à l'avant du soum dans la direction qu'il suit...!
Mais je suppose que c'est juste une question de delta ! ;)

@+



Edité par cassiope01 Le 07/01/2013 à 13h51
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 07/01/2013 à 14h28

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2457
Ah mince! J'ai du déclarer le tableau machinalement, dans la même manip que la décomposition de la ligne,
et j'ai cru que c'était elle qui avait réglé le pb. :lol
____________________
Roro

   
Le 07/01/2013 à 17h05

Libertynaute Débutant

Groupe: Membre

Inscrit le: 04/06/2012
Messages: 23
Bonjour!
Si tu préfères commencer le balayage radar juste en avant du soum, plutot qu'à sa gauche, c'est simple, je n'ai qu'à faire une petite manip au code, tu n'as qu'à le dire.
Même chose si tu veux modifier d'autres paramètres .
D'autre part, je ne vois pas pourquoi tu dis que tu n'a pas besoin de la matrice matr(7, 48), c'est là que les informations sur l'environnement du sous sont stockées??
____________________
ChRiS :)

Web    
Le 07/01/2013 à 17h48

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
chris:
Bonjour!
Si tu préfères commencer le balayage radar juste en avant du soum, plutot qu'à sa gauche, c'est simple, je n'ai qu'à faire une petite manip au code, tu n'as qu'à le dire.

Oui, je préfère Chris :top


chris:
D'autre part, je ne vois pas pourquoi tu dis que tu n'a pas besoin de la matrice matr(7, 48), c'est là que les informations sur l'environnement du sous sont stockées??

Parce que dans mon code, là où tu écris matr(z, j)=1 ou 0, moi je vais simplement marquer un point sur l'écran du sonar, à une distance calculée (?) entre posXXX(z),posYYY(z) et celle du soum, puis je sortirai immédiatement de la boucle de 7 pour poursuivre la boucle de 360° et ainsi de suite, tout les 7.5°.
Je n'ai pas besoin de stocker ces données : ce sera du "temps réel".
Enfin si j'ai tout bien compris il me semble que je devrais faire comme ça :siffle

@+



Edité par cassiope01 Le 07/01/2013 à 18h28
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 07/01/2013 à 17h57

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2457
C'est ce que je disais.. Chris fait une lecture de matrice.
Mais pour faire la lecture du tableau, ça ne peut se faire qu'au moment de l'affichage, par une double boucle.
Une qui fait tourner le vecteur, et une qui le parcours.
Le probleme, c'est la procédure d'affichage, qui contient implicitement la procédure de lecture.
Que seul peut résoudre un maître des pixels, et qui n'est pas piquée des vers.
Mais tant qu'on aura pas touché à l'échelle carte, ou à la portée sonar.
On aura le même affichage que celui de " de mon scope de la page 2, sauf que l'affichage se fera en tournant, au lieu de ligne par ligne.
J'ai mis un size 3, qui devrait être box 8x8, pour être fidèle à la carte. La portée étant de 7 cases plus une au centre,pour éqilibrer 7..1..7
Il y aurait moyen de garder tout en l'état, en "lissant" les cases 8x8 entre elles à l'affichage.
Ce que j'ai essayé de faire avec des bmp 8x8 convexes et concaves.
Mai il faut une floppée de tests pour determiner la forme idoine au lissage.

je me repose de vos c.......ies ;) avec un petit prog de navigation: Evitement de baleine, femme à la dérive à sauver, et tempête de vents tournants; au programme.
Je le tiens au chaud pour pas perturber les affaires en cours.
____________________
Roro

   
Le 07/01/2013 à 19h00

Libertynaute Débutant

Groupe: Membre

Inscrit le: 04/06/2012
Messages: 23
Bonjour!
Pour débuter le balayage en avant du soum tu n'as qu'à remplacer les deux lignes (en début de programme):

for z=1 to 7 '
posY(z)=dsrvY ' sert à définir 7 points (séparés d'une unité) à l'ouest de la pos. du soum
posX(z)=dsrvX-z ' si celui-ci regarde vers le nord (dsrvX, dsrvY) pour un balayage circ. de 360°.
next z '


par:

for z=1 to 7 '
posX(z)=dsrvX ' sert à définir 7 points (séparés d'une unité) à en avant de la pos. du soum
posY(z)=dsrvY-z ' si celui-ci regarde vers le nord (dsrvX, dsrvY) pour un balayage circ. de 360°.
next z

Le codage le l'information de la matrice sera dorénavant:




____________________
ChRiS :)

Web    
Jeux » "Tentative" de Simulation de pilotage d'un sous-marin DSRV... DSRV = petit sous-marin de sauvetage en grande profondeur.  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie