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 29/12/2012 à 08h01

Libertynaute Débutant

Groupe: Membre

Inscrit le: 04/06/2012
Messages: 23
Reprise du message précédent

Re bonjour!
Je me suis plongé dans le problème que je pige maintenant parfaitement. Je comprend maintenant votre histoire de conversion polaire/cartésien. Je pense que c'est relativement facile à réaliser...je vais plancher la dessus au cours de la semaine si ma copine me laisse du répit.
J'aurais une question histoire de m'éclaircir les idées... Bon j'ai compris la base de données (matrice à 2 dimensions x et y). La profondeur est donnée pour une adresse en X de 0 à 100 et en Y de 0 à 50. L'origine (0,0) est donc en haut à gauche sur le graphique (la carte).
Maintenant pour le référentiel de direction (azimut), je voudrais savoir si vous avez choisi votre 0 degrés en haut comme je l'ai noté sur ma map ou autrement??? :heink
Tant qu'à travailler, aussi bien que j'aille dans la bonne direction.

Pour ce qui est du radar, est-ce que je travaille avec un rayon de 8Km autour du soum comme je l'ai lû quelque part?
Si c'est le cas, il faudrait séparer le balayage de 360 degrés du radar en 50 steps de 7,162 degrés chacun de façon ce que chaque pas couvre un arc de 1 km (qui est notre résolution) à la limite de la portée du radar. À chaque pas il faudra comparer le niveau des 8 cellules (portée de 8 km) constituant la pointe de tarte avec la profondeur du sous marin et afficher le résultat sur l'écran radar. Donc un total de 400 calculs par balayage.... Un beau problème, mais pas insurmontable.
Je met mes neurones là dessus et je vous reviens plus tard..


____________________
ChRiS :)

Web    
Le 29/12/2012 à 08h43

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2453
Salut Chris,
Fais gaffe, il y a un piège. C'est l'angle de barre qui est donné en: -30°--->0°<---+30°
Pour faire la conversion, il vaut mieux prendre: 330°--->360°<---30°
jb travaille en radians.
j'ai fait la magouille dans: Enfer de Trigo.zip mais ça n'est pas complètement au point ,niveau conversion.
Et je vois se profiler un grave soucis au niveau conservation du cap aprés coup de barre ( mémorisation des deltas x,y F de t, pour report)
Pour l'azimut, il s'agit en fait du "cap" (direction du Soum), dont Cassiope compte se servir pour définir la direction de la sonde dans le plan horizontal, et que pour ma part, j'ai fait variable, avec un afficheur dédié et un bouton de défilement.
Pas d'angles dans le plan vertical (pour l'instant.)
Le Nord, ou 360° de la carte, est comme sur toutes les cartes, en haut.
Ha ? tu mets le 90° à l'ouest ? Les pendules tournent à l'envers chez vous ?
En tant qu'ancien navigateur, je te prie de remettre le 90° à l'est.
Mets de la neige au frais pour les "scotch-on-the-rock" de cet été. ......à+.



Edité par Roland Le 29/12/2012 à 09h53
____________________
Roro

   
Le 29/12/2012 à 08h48

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2453
Allez, Cassiope, un peu de lecture, ça peut pas faire de mal:
Tu a liés : cases-map-dessin, (contraint par dim Soum = 8x8 sur carte, ) à cases-map-tableau.
ce qui fait: deplacement Soum = 8pxl/pas
Mais tu pourrais conserver dim Soum sur carte = 8x8,
Lier: case-map-tableau à pixel-carte,
ce qui règlerait les problèmes de sonar, sonde, vitesse sur carte.
Limiter l'analyse tableau à l'environnement-Soum

Evidemment, sur une carte de 50km le déplacement serait imperceptible. (necessité de sauvegarder la position Soum.
D'ailleurs, ton DSRV peut trés bien etre un Soum Nucléaire d'attaque (plus rapide), les instruments de navigation sont les memes. (barre de plongée, de direction, propulsion, sonar, ext...)

Comme le déplacement du Soum sur carte n'est pas visible en continu, et que la temporalité "utilisateur", (lecture des afficheurs, manoeuvres ext...) est plutôt en secondes qu'en ms; peu importe que le Soum ne soit déplacé que tous les N cycles ( déplacements par sauts)
Ce mic-mac éviterait de toucher à la structure générale (timer).

J'ai mis la scale de la carte dans une graphicbox, et remis les ascenceurs à la " for graphics"
(on s'amuse comme on peut..), ça va bien.



Edité par Roland Le 29/12/2012 à 10h00
____________________
Roro

   
Le 29/12/2012 à 11h22

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Salut chris, ton optimisme fait vraiment plaisir à lire.
Tu as effectivement TOUT compris.
Oui, le référentiel d'azimut a le 0 degré en haut (le nord), mais je voyais plutôt le 90° à droite, le radar tournant dans le sens des aiguilles d'une montre ( et la boucle dans le code de 0 à 360° ).
Les coordonnées cartésiennes à lire dans la MAP() se situe sur la trajectoire suivie par le soum (228° par exemple). Reste effectivement à définir sur combien de cases c'est à dire la portée du radar par rapport à la définition de la carte...

On doit parcourir les cases touchées par cette trajectoire sur une longueur égale à la portée du radar, et un point doit s'afficher sur le radar QUE si sa profondeur lu sur la carte est <= à celle du soum. Dès qu'un seul point est dessiné ou qu'on est arrivé en bout de portée : on passe à l'angle suivant c'est à dire +1°, etc...
Faudra certainement relier graphiquement ces points entre eux...
Je pense qu'il faut revoir la définition de la carte : peut-être une case = 100m et la portée du radar pourrait être de 1000m par exemple, ce qui ferait 10 cases à surveiller par pas du radar c'est à dire 3600 opérations pour une rotation complête du radar !!!!

Le graphique des profondeurs indiqué par la sonde bathymétrique en dessous du radar doit lire TOUTES les cases de la MAP situées sur cette trajectoire et dans sa limite de portée AV/AR et profondeur...

Pour tous ces calculs on a besoin du cap (228° dans l'exemple) et des coordonnées actuelles du soum sur la carte (dsrvX,dsrvY).

Roland, lui, est absorbé par les calculs de représentation de l'effet des commandes du pilotes sur dsrvX,dsrvY et sur le cap (value(1)).
C'est vrai que c'est pas simple non plus ça !!!
Il faudra trouver plein d'astuces pour rendre tout ça à peu près réaliste...

Ceci dit, je l'ai bien précisé dès le début : il s'agit juste d'une tentative :siffle
Si ça doit devenir une trop grosse usine à gaz, ou qu'on ne parvient pas à rendre ça jouable : on laisse tomber.
Roland m'a fait remarqué que j'avais commençé par la fin, et c'est vrai que je n'avais peut-être pas bien évalué la masse de calculs à effectuer, surtout pendant que le radar tourne :siffle

Chris, si tu as quelconque soucis avec la compréhension du code, n'hésite pas une seconde. Le but est aussi que ça te plaise d'explorer JB et ce que tu pourrais faire avec :top

Bonne et heureuse année 2013.

@+



Edité par cassiope01 Le 29/12/2012 à 11h32
____________________
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 29/12/2012 à 12h15

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2453
Cassiope, a-tu lu mon message ( 4ème en partant du bas) de la page précédente, concernant la vitesse et le timer ?
____________________
Roro

   
Le 29/12/2012 à 12h38

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
celui du lièvre ?
oui.
Et ?
____________________
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 29/12/2012 à 13h39

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2453
Pour dire qu'il faut se caler sur ce 1 pxl / cycle, ou 1pxl / 10 cycles pour déterminer l'echelle carte.
Sinon, il faut revoir le fonctionnement général (timer), ce qui serait dommage
Parce que comme c'est. C'est bien clair, et facile à gérer.
Mais bon, à :coeur vaillant docteur es' Jb...rien d'impossible... .........à+.
____________________
Roro

   
Le 29/12/2012 à 17h56

Libertynaute Débutant

Groupe: Membre

Inscrit le: 04/06/2012
Messages: 23
Bonjour!
Oui, peut être qu'une diminution d'échelle rendrait le jeu plus réaliste... Les obstacles éventuels seraient plus près et on devrait faire gaffe plus rapidement si on ne veut pas se cogner contre un obstacle...
Cassiope, tu ne crois pas que c'est beaucoup de calculs à 1 degré par step (360 steps)??? Ça va bouffer du temps machine...Compte tenu de la résolution de notre base de donnée je crois que c'est inutile.
Je pense que si on faisait un step de 7,5 degrés ( 48 steps pour un tour) ce serait suffisant, du moins pour les calculs (en périphérie du radar, on aurait approximativement une résolution d'un carré dans la base de donnée) . Pour l'affichage sur l'écran radar ce serait autre chose.
Je vais commencer à travailler un scénario, et après, s'il faut le modifier par la suite, ce sera facile.
Voici par quoi je vais commencer:

À l'aide de la position en x et y du soum , de sa profondeur et de sa direction, je vais faire un algorithme de calcul pour 360 degrés, par étape de 7,5 degrés (48 steps) et je vais stocker les résultats dans une matrice de 48 par 8 (48 pointes de tarte chacune séparée en 8 segments). Si le contenu de la position vaut zéro, ce sera qu'il n'y a pas d'obstacle, et s'il vaut 1 c'est qu'il y en aura un.
Croyez vous que vous seriez capable de faire afficher une telle base de donnée comme s'il s'agissait d'un écran radar (balayage vectoriel)?
Si vous préférez autre chose laissez le moi savoir....
____________________
ChRiS :)

Web    
Le 29/12/2012 à 20h12

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Tu as sans doute raison chris pour les calculs inutiles compte tenu de la faible définition de la carte.
Je pense qu'au moment où tu mettras 1 ou 0 dans une case de ta matrice, on doit pouvoir tout aussi bien allumer ou éteindre un point sur l'écran du radar !!! :top

En tout cas c'est à essayer :top

@+
____________________
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 29/12/2012 à 20h39

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2453
Salut Chris,
Dans l'état actuel de l'echelle, le sonar ayant 7Km de portée, on peut résumer la surface balayée par un cercle inscrit dans un carré de 7 x 2 = 14 cases de coté + la case centrale =15 cases.
Regarde ce que j'ai fait: 10ieme post en partant du haut de la page 2.
Dans ce bidouillage je lis et affiche les 15 X 15 cases de carte, ligne par ligne (ou colonne par colonne à voir)
Il faut mettre le bidouillage dans le dossier de Cassiope pour qu'il accede aux bmp's.
Je n'ai mis qu'un point, là où il devrait y avoir un carré pour etre fidèle à la carte.
Tu comprendra en faisant fonctionner que le problème c'est l'echelle.
Que l'on lise la carte de façon vectorielle ou tout autre.
Mais si tu arrive à faire une procédure de lecture vectorielle d'un tableau, ce sera une "première".
Pour un affichage "expérimental", entre: "Claudevdw "dans la fenêtre de recherche ,
Tu atterri sur une page. descends dans les messages jusqu'au: 05 / 04 / 12.
Il y a là un tableau de 10 x 11 textbox qui peut servir à afficher des données.
Si tu n'a pas encore vu le sujet, il risque de te plaire. ........à+.



Edité par Roland Le 29/12/2012 à 23h46
____________________
Roro

   
Le 30/12/2012 à 11h17

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Voici ce que pourrait donner une représentation radar d'obstacles situés aléatoirement à une distance entre 65 et 95 pixels du soum, testé tout les 7.5°...
C'est juste un test et là le soum est mal barré puisqu'entouré de mur :lol
Mais ça montre que tout ça est peut-être plus simple à mettre en oeuvre que je ne le pensais... en seulement quelques lignes de code dans la routine [sonar] !
Le rayon du radar est de 100 pixels.
Ces 100 pixels représentent la portée du radar.
Quand la variable "r" dans la routine [sonar] est à 0 (vertical en haut), ça doit correspondre à l'avant du soum, et devrait donc correspondre au cap actuel du soum pour scruter la MAP()...
La distance de détection du premier obstacle à sa profondeur et dans sa direction actuelle devra donc être ramené à une valeur de 0 à 100, mais ma petite function scale() pourra sans doute s'en charger :top
La suite est dans tes main chris :top

Code VB :
 
  ' Submarine DSRV Simulator... (Deep Submergence Rescue Vehicle)

    nomainwin
    WindowWidth = 835
    WindowHeight = 505
    UpperLeftX = int((DisplayWidth-WindowWidth) / 10)
    UpperLeftY = 10 'int((DisplayHeight-WindowHeight) / 12)

    mois$ = "Jan Fév Mar Avr Mai Jun Jui Aou Sep Oct Nov Déc"
   ' mois$ = "January February March April May June July August September October November December"     'US format
    today$ = date$("mm/dd/yyyy")
    j = date$(today$)
    jsem$ = word$("Mar Mer Jeu x Ven Sam x Dim Lun",int((j/7-int(j/7))*10)+1)
   ' jsem$ = word$("Tue Wed Thu x Fri Sat x Sun Mon",int((j/7-int(j/7))*10)+1)
    date$ = jsem$+" "+mid$(today$,4,2)+" "+word$(mois$, val(today$))+"   "+left$(time$(),5)'right$(today$,4)
   ' date$ = jsem$+" "+word$(mois$, val(today$))+", "+mid$(today$,1,2)+"   "+left$(time$(),5)'right$(today$,4)   ' US format

    dim info$(1,1)
    Fcolor$ = "buttonface"
    BackgroundColor$ = Fcolor$
    ForegroundColor$ = "darkred"
    statictext #w.title, "- DSRV -", 60, 20, 130, 40
    GROUPBOX #w.tazimu, "Azimuth", 240, 8, 158, 70
    graphicbox #w.azimu, 250,  30, 121, 39
    statictext #w.Uazimu, "°", 378, 30, 15, 15
    GROUPBOX #w.tsonar, "SONAR", 180, 80, 232, 240
    graphicbox #w.sonar, 190, 100, 210, 210
    GROUPBOX #w.tdepth, "Depth", 5, 80, 168, 80
    graphicbox #w.depth   15, 105, 121, 39
    statictext #w.Udepth, "m", 140, 130, 25, 15
    GROUPBOX #w.tspeed, "Speed", 5, 180, 168, 80
    graphicbox #w.speed   15, 205, 121, 39
    statictext #w.Uspeed, "nds", 140, 230, 25, 15
    GROUPBOX #w.tassiet, "Tilting", 5, 280, 168, 80
    graphicbox #w.assiet  15, 305, 121, 39
    statictext #w.Uassiet, "°", 142, 305, 15, 15
    GROUPBOX #w.tpressu, "Pressure", 5, 380, 168, 80
    graphicbox #w.pressu  15, 405, 121, 39
    statictext #w.Upressu, "kpa", 140, 430, 25, 15
    GROUPBOX #w.tsonde, "SONDE BATHYMETRIQUE", 180, 330, 232, 135
    graphicbox #w.sonde  190, 355, 210, 100
    graphicbox #w.cmds   420,  10, 398, 455   ' command graphic window

    open space$(10)+"DSRV Submarine Simulator"+space$(20)+date$ for window_nf as #w
    #w "trapclose [exit]"
 ' ------------------------------------------ init graphics -----------------------------------------
    #w.title "!font arial 24 bold"
    #w.Uazimu "!font arial 16 bold"
    #w.Uassiet "!font arial 16 bold"
    #w.Udepth "!font arial 10 bold"
    #w.Uspeed "!font arial 10 bold"
    #w.Upressu "!font arial 10 bold"
    for t = 1 to 7
        hdle$ = "#w."+word$("tazimu tsonar tdepth tspeed tassiet tpressu tsonde",t)
        #hdle$ "!font arial 10 bold"
        hdle$ = "#w."+word$("azimu depth speed assiet pressu sonde cmds",t)
        #hdle$ "down ; fill black"
    next
    dim n$(11,3)  ' leds numbers file
    loadbmp "LedOrange",  "Num_leds_orange_M.bmp"
    loadbmp "LedRed",     "Num_leds_red_M.bmp"
    loadbmp "LedGreen",   "Num_leds_green_M.bmp"
    loadbmp "Curs",       "CursorSprite.bmp"
    loadbmp "lever",      "Orange.bmp"
    loadbmp "mapButtons", "Bouton_Map.bmp"
    loadbmp "slicer1",    "SlicerV80.bmp"
    loadbmp "slicer2",    "SlicerH80.bmp"
    loadbmp "slicer3",    "SlicerV80.bmp"
    loadbmp "UpDwBt",     "UpDwButton.bmp"
    loadbmp "egual",      "Egual.bmp"
    loadbmp "notegual",   "EgualNot.bmp"
    for c = 1 to 3
        #w.cmds "drawbmp ";word$("LedGreen LedOrange LedRed",c);" 0 0"
        for i = 0 to 11
            n$(i,c) = "n"+str$(c)+right$(str$(100+i),2)  ' store each bmp digit names in n$(number,color)
            #w.cmds "getbmp ";n$(i,c);" ";1+i*24;" 1 25 39"
        next
    next
    unloadbmp "LedOrange"
    unloadbmp "LedRed"
    unloadbmp "LedGreen"
    #w.cmds "drawbmp mapButtons 0 0"
    #w.cmds "getbmp mapOff 3 2 56 77"  ' button map Off/On
    #w.cmds "getbmp mapOn 67 2 56 77"
    unloadbmp "mapButtons"
    #w.cmds "addsprite lever1 lever"
    #w.cmds "addsprite lever2 lever"
    #w.cmds "addsprite lever3 lever"
    #w.cmds "addsprite curs Curs"     ' cursor to place at mouse coord. for "spritecollides" events...
    #w.cmds "spritevisible curs off"
    unloadbmp "Curs"
 
    FdCmdColor$ = "51 51 51"   ' gray
    #w.cmds "fill ";FdCmdColor$
    #w.cmds "drawbmp mapOff 300 340"   ' map button
    #w.cmds "drawbmp slicer1 78 3"
    #w.cmds "drawbmp slicer2 5 202"
    #w.cmds "drawbmp slicer3 78 253"
    #w.cmds "backcolor ";FdCmdColor$;" ; color lightgray"
    #w.cmds "place 20 106 ;|Depth"
    #w.cmds "place 210 230 ;|Dir."
    #w.cmds "place 16 356 ;|Engine"
    #w.cmds "place 300 20 ;|Ballast"
    #w.cmds "backcolor lightgray"
    for y = 40 to 160
        #w.cmds "place 290 ";y;" ; circlefilled 12"
        #w.cmds "place 355 ";y;" ; circlefilled 12"
    next
    #w.cmds "backcolor blue ; color blue"
    #w.cmds "place 290 160 ; circlefilled 12"
    #w.cmds "place 355 160 ; circlefilled 12"
    #w.cmds "backcolor lightgray ; color lightgray"
    #w.cmds "place 278 148 ; boxfilled 302 160"
    #w.cmds "place 343 148 ; boxfilled 367 160"
    #w.cmds "drawbmp notegual 305 84"
    #w.cmds "drawbmp UpDwBt 272 212"
    #w.cmds "drawbmp UpDwBt 338 212"
    unloadbmp "UpDwBt"
    #w.cmds "backcolor ";FdCmdColor$;" ; color 120 120 120"
    #w.cmds "place 130 20 ;|20°"
    #w.cmds "place 130 100 ;|_"
    #w.cmds "place 130 190 ;|- 20°"
    #w.cmds "place 5 260 ;|-30°"
    #w.cmds "place 180 260 ;|30°"
    #w.cmds "place 274 198 ;|Front        Back"
    #w.cmds "place 130 270 ;|Full"
    #w.cmds "place 130 312 ;|1/2"
    #w.cmds "place 130 356 ;|STOP"
    #w.cmds "place 130 410 ;|Reverse"
 
    #w.cmds "getbmp bckg 0 0 398 455"
    #w.cmds "background bckg"
    #w.cmds "spritexy lever1 84 83"
    #w.cmds "spritexy lever2 84 206"
    #w.cmds "spritexy lever3 84 334"
    #w.cmds "drawsprites"
    #w.cmds "flush"
 
    #w.sonar "down ; fill ";Fcolor$
    #w.sonar "backcolor 0 80 0 ; home ; circlefilled 100"  ' the sonar.
    #w.sonar "flush ; discard"
    ' -------------------------------------------- init var. ------------------------------------
    dc = 8  ' dim of a map cell in pixels.
    Xmax = 100    ' nber of X cells for the map
    Ymax = 50     ' nber of Y cells for the map
    egual = 0     ' for ballasts
    mass = 38600  ' of the submarine  38600 = 30500 (in surface) + 4050 (front ballasts) + 4050 (back ballast)
    dim map(Xmax,Ymax) ' map
    dsrvX = 30        ' current x pos Submarine
    dsrvY = 10        ' current y pos   "
    olddsrvX = dsrvX  ' old x pos Submarine
    olddsrvY = dsrvY  ' old y pos   "
    value(1) = 264.1  ' azimuth °  SUBMARINE ROAD 1 -> 360°
    value(2) = -10    ' depth   m  (3.281 pieds (ft) )  ( 1 pied = 0.30478513 m )
    value(3) = 0.0    ' speed   noeud (knots 1 kt = 1.852 km/h or 0.514 m/s)
    value(4) = -1     ' tilting °
    value(5) = 110    ' pressure kpa (10 kpa = 0.1 bar) 110=1.1 bar à 10 mètres de profondeur
    '---------------------------------------------------------------------------------------------
    ' Features of rescue submarine DSRV: AVALON. (Deep Submergence Rescue Vehicle)
    '   dim. 15m x 2.4m x 2.6m
    '   mass : 30.5 t/surface, 38.6 t/diving (max 5000 ft = 1524 m) (implosion: 2500 m)
    '   speed : 4.1 kts max 2.5 kts transit 1.5 kts search
    '   speed of ascent max 100ft/min (30.4m/min)
    '   propulsion : 7CV electrtic engine , 1 orientable propeller (vertical +/-20° max, horizontal +/-30° max)
    '   autonomy max : 30h
    '   Obstical Avoidance Sonar (max range 8000 yards = 7.3152km)
    '   Altitude/depth Sonar (bathymetric probe range) 0-5000 ft (1524m)
    '---------------------------------------------------------------------------------------------
    GOSUB [ReadMapFile]
 
    #w.cmds "when leftButtonDown [command]"
    #w.cmds "when leftButtonMove [MoveCmd]"     '  user actions
    #w.cmds "when leftButtonUp [endCmd]"
 
 
    [sonar]   ' called time loop : this label must update ALL displays...
       ' scan
        r = r+1-360*(r=360)  ' 360 -> 1
        for a=1 to 20  ' radar effect
            #w.sonar "color 0 ";75+a*5;" 0 ; size 3 ; delsegment "; drawSegment - 1
            #w.sonar "home ; north ; turn ";r+a;" ; go 100 ; segment drawSegment"
        next
 
        if (r mod 7.5) = 0 then     ' test : draw every 7.5°
            #w.sonar "home ; north ; turn ";r;" ; up ; go ";65+rnd(0)*30  ' distance aléatoire du centre.
            #w.sonar "color green ; down ; posxy gX gY"
            if oldgX>0 and oldgY>0 then
                #w.sonar "size 1 ; goto ";oldgX;" ";oldgY
            end if
            oldgX = gX : oldgY = gY
        end if
        #w.sonar, "flush ; discard"
 
        '  display value(v)
        v = v+1-5*(v=5)   ' 5 -> 1
        gosub [displayValue]
        gosub [displaySonde]
 
        '------- ballast ------------------------
        select case   ' Front side
        case (egual=1 and abs(BlstBack-BlstFront)>1)   ' to equilibrate the 2 ballasts
            if BlstFront < BlstBack then BlstFrontChge = 1 else BlstFrontChge = -1
        case ((BlstBackUp=1 and egual=1) or BlstFrontUp=1) and BlstFront<123 : BlstFrontChge = 1 ' left button up
        case ((BlstBackDw=1 and egual=1) or BlstFrontDw=1) and BlstFront>0 : BlstFrontChge = -1  ' left button down
        end select
 
        select case   ' Back side
        case (egual=1 and abs(BlstBack-BlstFront)>1)   ' to equilibrate the 2 ballasts
            if BlstBack < BlstFront then BlstBackChge = 1 else BlstBackChge = -1
        case ((BlstFrontUp=1 and egual=1) or BlstBackUp=1) and BlstBack<123 : BlstBackChge = 1  ' right button up
        case ((BlstFrontDw=1 and egual=1) or BlstBackDw=1) and BlstBack>0 : BlstBackChge = -1   ' right button down
        end select
 
        if BlstFrontChge <> 0 then       ' display Front Ballast
            if BlstFrontChge>0 then Bcolor$ = "blue" else Bcolor$ = "lightgray"
            gosub [SpriteOff]
            #w.cmds "backcolor ";Bcolor$;" ; color ";Bcolor$;" ; place 278 ";160-BlstFront;" ; goto 302 ";160-BlstFront
            gosub [SpriteBckG]
            BlstFront = BlstFront + BlstFrontChge
            BlstFrontChge = 0
            ' BlstFront = 0 to 123 (0 to 4050 kg)
            BlstFrontMass = scale(BlstFront,0,120,0,4050)
            mass = 30500 + BlstFrontMass + BlstBackMass ' so never more than 38600 Kg.
            'print "DSRV mass = 30500 + ";BlstFrontMass;" + ";BlstBackMass;" = ";mass
        end if
 
        if BlstBackChge <> 0 then        ' display Back Ballast
            if BlstBackChge>0 then Bcolor$ = "blue" else Bcolor$ = "lightgray"
            gosub [SpriteOff]
            #w.cmds "backcolor ";Bcolor$;" ; color ";Bcolor$;" ; place 343 ";160-BlstBack;" ; goto 367 ";160-BlstBack
            gosub [SpriteBckG]
            BlstBack  = BlstBack + BlstBackChge
            BlstBackChge = 0
            ' BlstBack = 0 to 123 (0 to 4050 kg)
            BlstBackMass = scale(BlstBack,0,120,0,4050)
            mass = 30500 + BlstFrontMass + BlstBackMass ' so never more than 38600 Kg.
            'print "DSRV mass = 30500 + ";BlstFrontMass;" + ";BlstBackMass;" = ";mass
        end if
        '-----------------------------------------

        gosub [compute]   ' calculate all values

        gosub [DispDSRVpos]  ' on map if opened

        timer 16, [sonar]
    wait
 
    [compute]     ' to simulate inertia, commands could be divided by 10 ?
        'value(1) =  road :  to calculate with Direction & Engine commands
        'value(2) =  depth : to calculate with Depth & Ballasts & Engine commands
        'value(3) =  speed : to calculate with Engine & Ballasts commands
        'value(4) =  tilting : to calculate with Depth & Engine & Ballasts commands
        value(5) = abs(value(2)*11)  ' water pressure on the submarine.
        'dsrvX = x pos of the DSRV (cell 0 to 100)
        'dsrvY = y pos of the DSRV (cell 0 to 50)
    return
 
    [command]      ' when leftButtonDown
        #w.cmds "spritexy curs ";MouseX;" ";MouseY   ' move sprite 'curs' under the mouse to know collides event.
        #w.cmds "spritecollides curs list$"
        currentLever$ = ""
        if list$<>"" then
            currentLever$ = word$(list$,1)
            #w.cmds "spritexy? ";currentLever$;" cmX cmY"
            offsetX = MouseX-cmX
            offsetY = MouseY-cmY    ' needed to sprite following mouse arrow
        end if
        #w.cmds "spritexy? curs cmX cmY"
 
        value(1) = cmX   ' temporary : just for debug
        value(2) = cmY
 
        select case
        case cmX>300 and cmX<300+56 and cmY>340 and cmY<340+77  ' MAP button pressed.
            if mapDisp = 1 then mapDisp = 0 else mapDisp = 1
            gosub [SpriteOff]
            #w.cmds "drawbmp ";word$("mapOff mapOn",mapDisp+1);" 300 340"  ' maj MAP button
            gosub [SpriteBckG]
            if mapDisp then gosub [openMap] else [closeMap]
        case cmX>272 and cmX<310 and cmY>212 and cmY<247 : BlstFrontUp = 1    ' commands for ballasts
        case cmX>272 and cmX<310 and cmY>247 and cmY<288 : BlstFrontDw = 1
        case cmX>340 and cmX<380 and cmY>212 and cmY<247 : BlstBackUp = 1
        case cmX>340 and cmX<380 and cmY>247 and cmY<288 : BlstBackDw = 1
        case cmX>305 and cmX<341 and cmY>84 and cmY<120
            if egual = 1 then egual = 0 else egual = 1
            gosub [SpriteOff]
            #w.cmds "drawbmp ";word$("notegual egual",egual+1);" 305 84"     ' change button egual/notegual
            gosub [SpriteBckG]
        end select
        #w.cmds "drawsprites"
    wait
 
    [SpriteOff]                    ' for maj sprites background
        for s=1 to 3 : #w.cmds "spritevisible lever";s;" off" : next
        #w.cmds "drawsprites"
    return
 
    [SpriteBckG]
        #w.cmds "getbmp bckg 0 0 398 455"  ' maj sprites background
        #w.cmds "background bckg"
        for s=1 to 3 : #w.cmds "spritevisible lever";s;" on" : next
        #w.cmds "drawsprites"
    return
 
    [MoveCmd]      ' when leftButtonMove : lever set
        if currentLever$ <> "" then
            currentY = MouseY-offsetY
            currentX = MouseX-offsetX
            select case val(right$(currentLever$,1))
            case 1
                if currentY>0 and currentY<168 then
                    if currentY>76 and currentY<90 then currentY = 83  ' middle position
                    #w.cmds "spritexy ";currentLever$;" 84 ";currentY
                    Depth = 83-currentY
                    DepthScaled = scale(Depth,0,80,0,20)  '+/- 20°
                    'print "Depth = ";Depth;"   Scaled = ";DepthScaled
                end if
            case 2
                if currentX>0 and currentX<170 then
                    if currentX>76 and currentX<90 then currentX = 84  ' middle position
                    #w.cmds "spritexy ";currentLever$;" ";currentX;" 206"
                    Direction = currentX-84
                    DirectionScaled = scale(Direction,0,80,0,30)  '+/- 30°
                    'print "Direction = ";Direction;"   Scaled = ";DirectionScaled
                end if
            case 3
                if currentY>248 and currentY<415 then
                    if currentY>328 and currentY<340 then currentY = 334  ' middle position
                    #w.cmds "spritexy ";currentLever$;" 84 ";currentY
                    Engine = 334-currentY
                    EngineScaled = scale(Engine,0,80,0,100)   ' ??
                    'print "Engine = ";Engine;"   Scaled = ";EngineScaled
                end if
            end select
            #w.cmds "drawsprites"
        end if
    wait
 
    [endCmd]       ' when leftButtonUp
        BlstFrontUp = 0
        BlstFrontDw = 0
        BlstBackUp = 0
        BlstBackDw = 0
        currentLever$ = ""
    wait
 
    [DispDSRVpos]            '  display the current position of the DSRV on the map.
        if mapDisp and olddsrvX<>dsrvX and olddsrvY<>dsrvY then
            Dcolor$ = "0 ";255-map(olddsrvX,olddsrvY);" 255"
            #map "size 1 ; backcolor ";Dcolor$;" ; color ";Dcolor$ 
            #map "place ";olddsrvX*dc;" ";olddsrvY*dc;" ;boxfilled ";olddsrvX*dc+dc;" ";olddsrvY*dc+dc
            #map "backcolor red ; color red"
            #map "size ";dc-1;" ; set ";dsrvX*dc+dc/2;" ";dsrvY*dc+dc/2  ' current x,y pos Submarine
            #map "flush ; discard"
            olddsrvX = dsrvX
            olddsrvY = dsrvY
        end if
    return
 
    [openMap]     ' when click on MAP button
        UpperLeftX = UpperLeftX + 10
        UpperLeftY = UpperLeftY + WindowHeight
        WindowWidth = 810
        WindowHeight = 462
        open "DSRV Map" for graphics_nf_nsb as #map
        #map "trapclose [closeMap]"
        #map "down ; fill black"
        Xg = 250
        for c = 1 to Xg     '  deep scale
            #map "backcolor black ; color yellow "
            if c=1 or c mod 10 = 0 or c=Xg then #map "place ";5+(c-1)*int((WindowWidth-20)/Xg);" 18;|";c
            #map "color black ; place ";10+(c-1)*int((WindowWidth-20)/Xg);" 25"
            #map "backcolor 0 ";255-c;" 255 ; boxfilled ";12+c*int((WindowWidth-20)/Xg);" ";25+20
        next
        #map "backcolor black ; color yellow ; place ";WindowWidth-46;" 40 ;|x10 m"
        #map "backcolor 253 238 153 ; place 0 26 ; boxfilled 10 44"
        ' MAP reading...
        for y=0 to Ymax
            for x=0 to Xmax
                Dcolor$ = "0 ";255-map(x,y);" 255"
                if map(x,y) = 0 then Dcolor$ = "253 238 153"
                #map "place ";x*dc;" ";50+y*dc;" ; backcolor ";Dcolor$;" ; color ";Dcolor$
                #map "boxfilled ";x*dc+dc;" ";50+y*dc+dc
            next
        next
 
        '  display the current position of the DSRV on the map.
        Dcolor$ = "0 ";255-map(olddsrvX,olddsrvY);" 255"
        #map "backcolor ";Dcolor$;" ; color ";Dcolor$ 
        #map "place ";olddsrvX*dc;" ";olddsrvY*dc;" ;boxfilled ";olddsrvX*dc+dc;" ";olddsrvY*dc+dc
        #map "backcolor red ; color red"
        #map "size ";dc-1;" ; set ";dsrvX*dc+dc/2;" ";dsrvY*dc+dc/2  ' current x,y pos Submarine
        #map "flush ; discard"
        olddsrvX = dsrvX
        olddsrvY = dsrvY
    return
 
    [ReadMapFile]
        filename$ = "map.txt"
        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)) : next
            next
            close #grid
        else
            notice "No file  ";upper$(filename$)
            goto [exit]
        end if
    return
 
    [closeMap]
        if mapDisp then mapDisp = 0
        close #map
        gosub [SpriteOff]
        #w.cmds "drawbmp mapOff 300 340"  ' maj MAP button
        gosub [SpriteBckG]
        WindowWidth = 835   ' restore #w setup
        WindowHeight = 505
        UpperLeftX = int((DisplayWidth-WindowWidth) / 10)
        UpperLeftY = 10
    wait
 
    [displayValue]    ' display current value( v )
        hdle$ = "#w."+word$("azimu depth speed assiet pressu",v)  ' give the right handle$ for current v.
        s = 0 : t$=right$(str$(100000+int(abs(value(v)))),5)  ' 5 digits.
        if v=1 or v=3 then t$=right$(str$(100000+int(abs(value(v)*10))),5)  ' decimal nb
        colr = 1          ' threshold for colors : colr 1 = green, colr 2 = orange, colr 3 = red (dangerous!)
        if (v=2 or v=5) and (value(2)*4)>1000 then colr = 2  ' depth and so pressure orange
        if (v=2 or v=5) and (value(2)*4)>1524 then colr = 3  ' depth and so pressure red
        if v=4 and value(v)>10 then colr = 2  ' tilt > 10° : orange
        if v=4 and value(v)>20 then colr = 3  ' tilt > 20° : red
        for c=1 to 5 : d=val(mid$(t$,c,1))
            select case
            case (v=1 and c<2) or (v=3 and c<3) :d=11  'empty digit
            case v=2 and c=1 :d=10
            case v=4 and c<4 :d=11 : if c=3 and value(v)<0 then d=10  'negative digit
            end select
            #hdle$ "drawbmp ";n$(d,colr);" ";s;" 0 ; delsegment ";dSegment-1 : s=s+24
            if v=3 or v=1 then
                #hdle$ "color green ; size 2 ; set ";4*24;" 36"
            end if
            #hdle$ "segment dSegment"
        next
        #hdle$ "flush ; discard"
    return
 
    [displaySonde]
        ' read map(dsrvX,dsrvY) to draw depth just (500m front/back) to 1524m under the submarine respecting it's road (cape)
        ' To code...!!!
        #w.sonde "color darkblue ; delsegment ";dSegmt-1
        #w.sonde "place 105 0 ; turn 180 ; go 100 ; segment dSegmt"
 
 
        #w.sonde "flush ; discard"
    return
 
    FUNCTION scale(value,InMin,InMax,OutMin,OutMax)  ' same of the map(value, fromLow, fromHigh, toLow, toHigh) command in Arduino language ;)
        scale = (value - InMin) * (OutMax - OutMin) / (InMax - InMin) + OutMin
    END FUNCTION
 
    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]
        timer 0
        close #w
        if mapDisp then close #map
        unloadbmp "lever"
        unloadbmp "egual"
        unloadbmp "notegual"
    end
 


@+



Edité par cassiope01 Le 30/12/2012 à 11h38
____________________
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 30/12/2012 à 14h50

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2453
Nickel ! En pixels. :top
Il faudrait faire passer un vecteur d'éffacement avec disons 45 ou 90° de retard sur le vecteur d'affichage, pour avoir l'effet de rémanence des scopes radars/sonars.
Que pense-tu de lier cases-map-tableau à pixels-map ?
Le tableau ne serait rempli qu'une fois au départ. Et ne serait lu que partiellement: 200 x 200 ( et pas obligé d'afficher sur le scope avec 1pxl de résolution on peut facilement diviser par trois, en utilisant des set-points .
Et meme faire une zone d'exclusion autour du Soum du genre: trop prés, c'est crashé. ça économiserait du temps de calcul ) Cela parait jouable. :p

Au niveau conversion, ça avance (sans l'aide des matheux, mais ils me donnent à réfléchir, ça aide aussi...)
J'ai merdoyé un moment à cause de l'angle du min/max de l'angle de barre.
Pour avoir le plein effet, il faut la pleine echelle: 270°---> 0° <--- 90°.
Hé oui! La simulation, c'est avant tout: une grosse arnaque vis à vis de l'utilisateur. :lol
La formule est encore incomplète et corrompue, mais y'a de l'espoir.
A gauche: Tout va bien, ça tourne, et fait demi-tour si la barre est maintenue.
A droite: ça merde; sans doute à cause du deuxième membre manquant dans l'équation des y.
En marche arrière: Y'a soucis (inversion par rapport à "l'attendu")
Je pense qu'il faut doubler l'équation en interpolant. ( j'ai mis les matheux sur les bons rails, s'ils ne piccolent pas trop pour les fêtes |-) ça devrait le faire)
Je modifie le zip.
Il reste à gérer la conservation du mouvement. Mais je vois à peu prés comment faire. :heink
....Bonnes fêtes!...Et foin de la modération... ;)



Edité par Roland Le 30/12/2012 à 14h58
____________________
Roro

   
Le 30/12/2012 à 15h50

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2453
Pour Chris: Tu a aussi ça: demo.zip
C'est le meme tableau que celui des matrices, que j'ai modifié pour y faire des essais de lecture et réarrangement.
Mais méfiance: Claudevdw a sa propre conception du traitement des abcisses et des ordonnées.
Hey!.....Bonne fêtes de nouvel an. ;)



Edité par Roland Le 30/12/2012 à 15h56
____________________
Roro

   
Le 30/12/2012 à 18h41

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2453
Cassiope, je bricole ton "map éditor" pour qu'il bosse les pixels un par un, et plus par paquets de soixante quatre.
Comme j'ai du conserver tes paramètres pour pas planter d'entrée, ça tient beaucoup moins de place à l'écran. ;)
____________________
Roro

   
Le 30/12/2012 à 19h21

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Eeeh ben ! 336000 pixels à colorier 1 par 1 !!!
J'espère juste que t'as pensé à sauvegarder le map.txt d'origine ;)

@+



Edité par cassiope01 Le 30/12/2012 à 19h23
____________________
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 30/12/2012 à 20h07

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2453
j'en suis pas encore à: "Save". Peut-etre ....Courant ...2014.
Et pi, t'inquiète, ton map.txt, je doit bien l'avoir en six exemplaires.
Nan, mais pour coloriser, je vais prendre un gros pinceau.
336000 ! Tu dis ?.... Purée! c'est beaucoup. :heink
Si je fais 300 x 200, ça fait une jolie petite carte à 60 000.
Mais je garde comme elle est la "scale" des profondeurs qui est bien sympa.
Il y a aussi la solution du changement d'echelle entre la map "éditée" = map( x,y) à 60 000 et la map "affichée", qui garderait ses cotes actuelles.

PS: Les matheux sont en plein délire. :|
____________________
Roro

   
Le 30/12/2012 à 21h21

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2453
Ca y'est ! La solution, et c'est facile:
-- Créér une carte virtuelle dans laquelle on transfère la map en faisant:
Une case-map = un pixel carte-virtuelle.
-- Lire la carte virtuelle dans le scope sonar.
Mais comme la map en pixels est trop petite pour le sonar,
-- Agrandir la map et l'afficher dans une graphics avec ascenceurs.
Moouah. Que je suis bon, je vais agrandir les passages de portes. Pour la tête!
____________________
Roro

   
Le 31/12/2012 à 01h18

Libertynaute Débutant

Groupe: Membre

Inscrit le: 04/06/2012
Messages: 23
Bonjour!
Bon j'ai pris un peu de temps pour résoudre le problème et c'est fait. Pour le principe mathématique c'est réglé (ce n'était pas un gros problème). Il ne me reste plus qu'à pondre les lignes de code pour le réaliser.
Ça, ça va prendre un peu plus de temps, surtout que je vais m'absenter de la maison plusieurs jours pour fêter le jour de l'an chez de la famille à moi.
Je vous souhaite à tous une bonne année. Ne picolez pas trop... :mat
____________________
ChRiS :)

Web    
Le 31/12/2012 à 10h53

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Salut Chris,

de mon coté, en considérant dorénavant qu'une case de la MAP correspond à 100m, si tu sais me donner la distance des obstacles que le soum a tout autour de lui (tout les 7.5°), en commançant par devant lui suivant son cap actuel et sa profondeur, la représentation radar est résolue, comme tu peux le voir avec le code que j'ai donné plus haut.

Trouver la formules qui va bien pour incrémenter la position du soum sur la carte (dsrvX,dsrvY) qui est sûrement la donnée la plus essentielle du programme, ne va pas être simple non plus ;)

Je te souhaite d'excellentes fêtes de fin d'années, et à l'année prochaine Chris :+1

@+



Edité par cassiope01 Le 31/12/2012 à 10h54
____________________
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 31/12/2012 à 12h48

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2453
Salut les loulous,
C'est pratiquement bon pour l'évolution du Soum sur carte.
Si tu est curieux, va voir sur http://www.maths-forum.com/.
Rubrique: "Café mathématique". Topic: "Le bateau ivre".

Ah! ces matheux...Faut tout leur expliquer... :hehe

Consomme avec modération ! Parce que l'eau bue ..éclate ..... ;)
____________________
Roro

   
Le 31/12/2012 à 19h01

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2453
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

   
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