IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

[WinCE]Deplacement dans une image [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    En attente de confirmation mail
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2003
    Messages : 30
    Points : 21
    Points
    21
    Par défaut [WinCE]Deplacement dans une image
    bonjour,
    j'ai bien avancé sur mon projet d'affichage d'un bitmap de taille supérieure à la taille de l'écran.

    Je développe pour PNA mappy iti V3, sous wince 4.2 (ou 5.0) réduit.

    Le programme est développé en deux versions :
    1 version PC avec un fichier pour simuler le GPS, permettant des tests/debug sur win32 PC.
    1 version avec véritable gestion GPS, compilé et testé en direct sur PNA.

    Je fais des petits tests de validation des parties à traiter.

    Sur PC, le programme fonctionne très bien, affichage conforme à mes attentes.
    Sur PNA :
    la partie GPS fonctionne
    la partie affichage plante.

    J'ai tester les fonctions de façon unitaire (vérifier que l'on pouvait afficher un polygone), mais des lancement du guidage (appui sur guidage), le programme plante de façon sévère : sortie directe.

    Alors, y a t il un lazarien pour m'aider?

  2. #2
    En attente de confirmation mail
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2003
    Messages : 30
    Points : 21
    Points
    21
    Par défaut Optimisation de programme
    Bon, le problème est résolu.
    Avec une compilation optimisée, c'est ok, le pgm passe de 11mo à 1.9 et la cela marche.
    On est donc encore sur un pb de mémoire, il faut que je vois comment optimiser cela.

    Je suis preneur de toutes pistes, notamment pour diminuer la taille du timage.

    et la partie GPS dans tout cela :

    Est-ce que vous avez à quelque part un bon moyen d'optimiser la partie GPS, car je crois qu'elle rame un peu.

    J'ai essayé sans résultat de rajouter la partie Hdop et fix, mais ça ne marche plus avec.

    Je voudrais faire un bon nettoyage pour être au plus prêt de mon besoin (latitude,longitude, fix HDOP), voire sur le GPRMC, la vitesse relative...

  3. #3
    En attente de confirmation mail
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2003
    Messages : 30
    Points : 21
    Points
    21
    Par défaut Et si j'utilisai un systeme de dalle pour l'affichage?
    Bon, j'ai encore bricole sur le programme.

    IL fonctionne, j'ai réussi à ajouter le HDOP et le type de fix GPS.

    Mais, je le trouve peu fluide, et je souhaite faire une évolution de la partie affichage.
    En effet, avec un bitmap de 1800*1800, on se retrouve vite court en mémoire sur un Pocket...
    donc, l'idée est de stocker en mémoire les points déjà affichés (latitude et longitude corrigées : integer ), et en fonction de la zone affichée, retrouver ces point qui en font partie de la zone et redessiner.

    J'avais fait cela avec " Basic4ppc", mais je souhaite reprendre le travail avec lazarus.

    Mon problème, c'est que je ne connais pas l'équivalent en Freepascal des instructions utilisé à l'époque.

    En gros : une table dynamique avec deux colonnes.
    un système de tri (table.filter (clé de filtrage) en basic4ppc)

    Avez-vous une idée de comment faire.
    Fichiers attachés Fichiers attachés

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 64
    Points : 87
    Points
    87
    Par défaut
    hello

    je n'y connais rien à la plateforme CE, mais il me semble que tu ne libère pas la ressource Bitmap1 créée. Et à mon avis mieux vaut également redimensionner le bitmap une fois assigné car 1800x1800 pixels à copier ne doit pas accélerer les choses. Ca ne rame pas au lancement de l'appli ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      bitmap1: Tbitmap;
    begin
    ...
    bitmap1:=Tbitmap.create;
    Image1.Picture.Bitmap.Assign(bitmap1);
    bitmap1.Free; // détruire objet/libérer mémoire
     
    with Image1.Picture.Bitmap do
    begin
     
    SetSize(maxsize,maxsize);
    Canvas.Brush.Color:=clwhite;
    Canvas.FillRect(0,0,maxsize,maxsize);
     
    end;
    ...
      end;

  5. #5
    En attente de confirmation mail
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2003
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Bien vu !
    j'avais vu que c'était possible, mais n'avais pas fait le boulot.
    C'est certainement un mieux pour le fonctionnement.

    Malgré tout, je pense que le système d'affichage est améliorable, car l'affichage d'une matrice aussi grande est un peu trop pour un petit système wince.

    Je continue pour faire de l'optimisation, et je suis à l'écoute de toute proposition.

    Est-ce qu'un composant type TTIgrid pourrait convenir au stockage des données et à leur filtrage ?
    Quelques précisions sur la gestion que je veux retranscrire :
    Création d'une table à deux colonnes (latitude et longitude) = rempli au fil de l'eau.
    a chaque changement de zone:
    filtrage de la table et recréation du dessin.

    A raison d'une latitude/longitude toute les 2 secondes, on à 1800 "points" à stocker.

    Extrait des commandes en Basic4ppc :

    création de la table :
    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            tablelat.AddCol(cNumber,"lat",5,False)
    	tablelat.AddCol(cNumber,"lon",5,False)
    utilisation du filtre dans la recherche des éléments à redessiner :
    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
           'translation de coordonnées pour rester "au centre" 
    	Txlat = 105 -latact         // Latitde actuelle
    	Txlon = 105 -lonact        // longitude actuelle
     
    	If Txlat<>0 OR Txlon <> 0 Then 
    		drwimage.Clear(cBlack)  //	'efface l'image
     
    		'charge les points dans la dalle (filtre sur la table)
    		skey="(lat<(latact+larg) OR lat>(latact-larg)) AND (lon <(lonact+larg) OR lon >(lonact-larg))"
    		skey=StrReplace(skey, "latact", latact)
    		skey=StrReplace(skey, "lonact", lonact)
    		skey=StrReplace(skey, "larg", larg)
    		tablelat.Filter(skey)  
    		If tablelat.rowcount>0 Then
    			alatdeb=(tablelat.Cell("lat",0)) + Txlat 
    			alondeb=(tablelat.Cell("lon",0)) + Txlon 
    		End If
     
    		For j=1 To ((tablelat.rowcount)-1)
    			'on applique les correctifs decalage dans le cadre 
    			  alatact= (tablelat.Cell("lat",j)) + Txlat 
    			  alonact= (tablelat.Cell("lon",j)) + Txlon
     
                   'redessine l'image
                   drwImage.DrawLine(penex1.Value,alondeb,alatdeb,
                   alonact,alatact)                'redessine le rectangle
    	       alatdeb= alatact
    	       alondeb= alonact
    	       Next

    Alors, une idée?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 64
    Points : 87
    Points
    87
    Par défaut
    Que dessine-tu exactement ?

    D'après le code source il semblerait que tu ais besoin de dessiner des points et un rectangle, mais quoi d'autre ?

  7. #7
    En attente de confirmation mail
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2003
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Bonjour,
    Le but de mon programme est de tracer en temps réel le suivi d'un tracteur agricole avec l'emprise d'une rampe de pulvérisateur (15m de large).

    Donc, a chaque trame de gps GCA, je fait la différence de position, avec une remise a l'échelle (utilisation de zoom1 et zoom), et je trace le rectangle d'emprise de la rampe, ceci afin de permettre le guidage du pulvérisateur, sans jalonnage.

    Le principal écueil, c'est l'affichage, car 15m réel représente 30 pixels, donc pour un champs de 10 ha (500m*200m), il faut 1000 par 400 pixels, mais on peut souhaiter faire une gestion sur des champs beaucoup plus grand...

    J'avais réalisé ce programme avec un autre langage (basic4ppc), mais celui-ci nécessite le CF2.0, non installable sur ma machine actuelle...

    Nota : la notion de point est une notion de point géodésique (latitude/longitude), car je trace toujours des lignes...
    Dans le cas de B4PPC, je tracé des rectangles vides (deux lignes // + deux lignes//)

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 64
    Points : 87
    Points
    87
    Par défaut
    si tu n'as besoin de dessiner qu'un rectangle en temps réel, tu pourrait t'affranchir des fonctions de dessin, et du TImage, car dessiner sur un bitmap est lent.

    tu pourrait avoir:
    - Un TPanel pour le fond
    - Un autre TPanel dedans pour simuler le champ avec couleur de fond, ratio larg/ht, etc
    - un TShape (rectangle) dans le TPanel du champ pour le rectangle de l'emprise de la rampe

    et simplement mettre l'ensemble champ + rectangle à l'échelle en fonction du zoom et position tracteur.

    - éventuellement deux autres TShape sans bordures avec couleur différente de la couleur du champ pour simuler le polygone de la zone du champ déjà traitée.

    Mais bon tout ceci suppose qu'il n'y a que des angles droits, ce qui est moins sûr dans ton cas...

    Si tu as besoin de gérer l'orientation + champs alambiquée sans angles droits il serait logique de dessiner sur le TBimap du TImage mais en limitant la taille du bitmap à ce qui est réellement affiché (écran) et en adaptant les opérations de dessin des polygones au zoom/position/orientation.
    Plus petite est la taille du bitmap, plus rapides seront les opérations de dessin, et ce sera moins gourmand en mémoire vive.
    Si tu n'as besoin que de peu de couleurs, utilise aussi un pixelformat adapté.

  9. #9
    En attente de confirmation mail
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2003
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Merci yann.m

    Pour l'utilisation d'un shape, ce n'est pas possible, car il y a un problème d'orientation...

    Pour un petit aperçu de ce que je souhaite réaliser, je met en ligne le projet lazarus avec un fichier simulant le trajet en entrée...
    Cela permet de se faire une idée de la partie graphique....

    L'optimisation porte principalement sur le dessin, sachant qu'un pocket, c'est pas trop puissant...
    pour la partie GPS, je pense arriver à optimiser un peu en supprimant la partie conversion de données qui ne m'est pas utile.
    Fichiers attachés Fichiers attachés

  10. #10
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    bonjour,

    je ne comprend pas bien pourquoi tu utilises un bitmap ?!

    pourquoi ne pas dessiner directement sur le canvas de la fiche (ou un TPaintBox si ça existe sous Lazarus) ?

    ça t'éviterais d'avoir une image de maxsize x maxsize en mémoire...
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    En attente de confirmation mail
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2003
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Merci pour la réponse.
    Mes connaissance en pascal/delphi/lazarus sont très faibles, en dehors de l'utilisation en Bdd pour delphi...
    Je fait une immersion en pascal et d'après ce que j'ai trouvé sur le net, la solution que j'utilise me semblais idoine.
    J'utilise le canvas d'une image, contenu dans un tpanel. L'image est plus grande que le panel, car cela me permet de faire "bouger le dessin".

    Quel serait l'avantage d'un Tpainbox sur un Timage?

    Au fait, comment sous CE peut-on avoir le chemin de l'application dans un variable?
    Quelle méthode utilisez vous?

  12. #12
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par Alea46 Voir le message
    Merci pour la réponse.
    Mes connaissance en pascal/delphi/lazarus sont très faibles, en dehors de l'utilisation en Bdd pour delphi...
    Je fait une immersion en pascal et d'après ce que j'ai trouvé sur le net, la solution que j'utilise me semblais idoine.
    J'utilise le canvas d'une image, contenu dans un tpanel. L'image est plus grande que le panel, car cela me permet de faire "bouger le dessin".

    Quel serait l'avantage d'un Tpainbox sur un Timage?

    Au fait, comment sous CE peut-on avoir le chemin de l'application dans un variable?
    Quelle méthode utilisez vous?
    en fait tout dépend de ce que tu affiches

    si c'est une image complexe mais figée, il est intéressant de l'avoir dans un bitmap pour ne pas redessiner son contenu à chaque fois...la consommation mémoire est plus important mais ça donne un gain en performance tout de même.

    pour une image simple (dessiner un polygone) ça ne va pas demander beaucoup de ressource de le faire dynamiquement, et tu économises la mémoire.

    entre les deux, tu as le DoubleBuffer qui est une bitmap de la taille de la fenêtre, ça évite notamment les clignotements sans couter trop en mémoire.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  13. #13
    En attente de confirmation mail
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2003
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Merci de cet éclaircissement.
    Mon besoin se limite à 1 polygone toute les secondes, soit sur la fenêtre d'affichage environ 200 polygones/seconde, sans compter la recherche en stockage de ces polygones.

    Avez-vous des liens d'exemple un peu "fouillé" sur la programmation avec des dessin, des mémorisations de data....
    Je cherche autour de lazarus, mais je ne trouve pas grand chose.

  14. #14
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    je n'utilise pas Lazarus, mais voici un exemple de dessins de polygones en temps réel (avec projection 3D) qui utilise tout simplement Canvas.Polygon

    http://tothpaul.free.fr/sources.php?dprgrp.dragon
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  15. #15
    En attente de confirmation mail
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2003
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Merci pour cet exemple que j'avais trouvé sur ton site.

    J'essaie en vain de le passer dans Lazarus, mais j'ai un tas d'erreurs (gestion des vertices/pointeurs dans translate/rotate...), utilisation de polygon(point(coords[a].x,point(coords[a].y),....

    Je fouille encore un peu, afin de voir le résultat en compil free pascal...

    Voila la partie en probleme sur le code de paul
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    179 procedure translate(x,y,z:integer;src,dst:pointer;count:word);
    180  var
    181   i:integer;
    182  p1,p2:^TVertice;
    183  begin
    184   p1:=src;
    185   p2:=dst;
    186  for i:=1 to count do begin
    187   p2.x:=p1.x+x;
    188   p2.y:=p1.y+y;
    189   p2.z:=p1.z+z;
    190   inc(p1);
    191   inc(p2);
    192  end;
    193 end;
    lors de la compilation, j'ai les erreurs
    trigo.PAS(187,7) Error: Illegal qualifier
    trigo.PAS(187,7) Hint: may be pointer dereference is missing
    trigo.PAS(187,7) Error: Illegal expression
    trigo.PAS(187,7) Fatal: Syntax error, ";" expected but "identifier X" found

    J'ai du mal avec la lecture du code, notamment avec l'utilisation des pointers (c'est nouveau pour moi).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détection position des yeux dans une image
    Par Morvan Mikael dans le forum Traitement d'images
    Réponses: 16
    Dernier message: 24/12/2008, 23h09
  2. Zone de texte dans une image
    Par sanna dans le forum Algorithmes et structures de données
    Réponses: 21
    Dernier message: 18/03/2005, 22h15
  3. [FLASH 5]un bouton dans une image pour revenir sur une scene
    Par patato valdes dans le forum Flash
    Réponses: 7
    Dernier message: 28/04/2004, 20h21
  4. Obtenir la position du curseur dans une Image
    Par bastoune dans le forum Composants VCL
    Réponses: 6
    Dernier message: 14/11/2003, 21h02
  5. faire un selection dans une image aves les APIs
    Par merahyazid dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/04/2002, 10h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo