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

Delphi Discussion :

Algorithme pour savoir si une forme est à l'intérieur d'une autre


Sujet :

Delphi

  1. #21
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 677
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 677
    Points : 13 082
    Points
    13 082
    Par défaut
    Citation Envoyé par jp1664 Voir le message
    Pour andnotor
    Ca y est, il est vexé

    Je pensais répondre à quelqu'un d'un niveau "responsable des études" mais... en informatique (on est sur DVP après tout). Ce n'est pas ton domaine, ton profil est donc biaisé !
    Mis à part, je pense avoir fourni pas mal d'indications sur ce qui me semble être la meilleure approche. Après tu en fais ce que tu veux et si tu préfères passer par une phase "coloriage", libre à toi !

  2. #22
    Membre à l'essai
    Homme Profil pro
    responsable process chimique, hoby l'electronique, informatique
    Inscrit en
    Décembre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : responsable process chimique, hoby l'electronique, informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 12
    Points : 12
    Points
    12
    Par défaut Algorithme pour savoir si une forme est à l'intérieur d'une autre
    Pour Andnotor.

    Je trouve ce site formidable, pour un amateur. Il y a des professionnels prêts à répondre d'une façon simple, pour vulgariser
    l'informatique. Merci à vous tous.
    Je suis sur un projet personnel ( à diffuser en logiciel libre si c'est OK ) a partir d'un fichier Dxf ( format AutoDesck) générer
    un fichier ou plusieurs fichiers (1 fichier par layer) au format *.NC ou .iso (Gcode), avec plusieurs options.
    En tant qu’utilisateur d'une CNC je n'ai pas trouvé de logiciel libre sur le web qui soit satisfaisant.

    Encore un grand merci à vous tous.

    Nota: si une solution est proposée, si vous la considérez nulle, merci de donner des explications détaillées, il y a souvent
    un manque de détails (contexte) dans la question.

  3. #23
    Membre à l'essai
    Homme Profil pro
    responsable process chimique, hoby l'electronique, informatique
    Inscrit en
    Décembre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : responsable process chimique, hoby l'electronique, informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 12
    Points : 12
    Points
    12
    Par défaut Algorithme pour savoir si une forme est à l'intérieur d'une autre
    Je vais fermer la discussion. mais pas de bouton ?
    Je vais passer par une méthode interactive (avec affichage) via un menu. L’œil humain détecte tout de suite si une forme est incluse ou non.
    Ce sera plus simple.

    Merci

  4. #24
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    jp1664 : Je vais passer par une méthode interactive (avec affichage) via un menu. L’œil humain détecte tout de suite si une forme est incluse ou non.
    L’œil humain le détecte détecte mais pas au pixel près.

    A toutes fins utiles voici un bout de code qui détecte si F2 est dans F1 via deux bitmaps et au lieu de les mixer pixel par pixel comme disait AndNotOr on passe à la routine de détection F2DansF1_Bmp(var BmpF1, BmpF2: tBitMap; clF1, clF2, clUnion: tColor): boolean une 3ième couleur qui marque sur le bitMap BmpF1 les zones où F2 chevauche partiellement ou totalement F1 sinon la couleur de F1 reste inchangée et alors F2 est entièrement en-dehors de F1 et en plus de cela la routine répond par Oui/Non si au pixel près F2 est entièrement dans F1.
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    // F2 dans F1 Via 2 BitMaps ====================================================
    function RepAppli: string; // renvoie Repertoire de l''application avec \ terminal 
    begin RepAppli := ExtractFilePath(Application.ExeName); end;
     
    function ColorToRGBQuad(cl: tColor): tRGBQuad;
    begin with Result do begin
        rgbRed := GetRValue(cl);
        rgbGreen := GetGValue(cl);
        rgbBlue := GetBValue(cl);
      end;
    end;
     
    type
      TRGBQuadArray = array[0..0] of TRGBQuad; // élément de bitmap (API windows)
      pRGBQuadArray = ^TRGBQuadArray; // type pointeur vers tableau 4 octets 32 bits
     
      tSLQ = array of pRGBQuadArray;
     
    var SLQF1, SLQF2: tSLQ;
     
    procedure InitSLQ(const Bmp: tBitMap; var SL: tSLQ);
    // Intialisation des Scanlines
    var H, W, x, y: integer;
    begin
      Setlength(SL, 0);
      Bmp.PixelFormat := pf32Bit; // Effacer les anciens Alpha
      H := Bmp.Height; W := Bmp.Width;
      Setlength(SL, H);
      for y := 0 to H - 1 do SL[y] := BMP.ScanLine[y];
      for y := 0 to H - 1 do
        for x := 0 to W - 1 do SL[y, x].rgbReserved := 0;
    end;
     
    function F2DansF1_Bmp(var BmpF1, BmpF2: tBitMap; clF1, clF2, clUnion: tColor): boolean;
    // BmpF1 et BmpF2 = 2 BitMap's de même taille
    // clF1 et clF2 = Couleurs des silhouettes des formes F1 et F2
    // clUnion = Couleur de l'union éventuelle de F1 et de F2
    var x, y, W, H, nbPtF2, nbPtDans: integer; PixelDans: boolean; clQuadF1, clQuadF2, clQuadU: tRGBQuad;
    begin
      InitSLQ(BmpF1, SLQF1); InitSLQ(BmpF2, SLQF2);
      clQuadF1 := ColorToRGBQuad(clF1); clQuadF2 := ColorToRGBQuad(clF2);
      clQuadU := ColorToRGBQuad(clUnion);
      W := BmpF1.Width; H := BmpF1.Height; nbPtDans := 0;
      // Comptage du nombre total de Pixels de F2 :
      nbPtF2 := 0;
      for y := 0 to H - 1 do begin
        for x := 0 to W - 1 do begin
          if (SLQF2[y, x].rgbBlue = clQuadF2.rgbBlue)
            and (SLQF2[y, x].rgbGreen = clQuadF2.rgbGreen)
            and (SLQF2[y, x].rgbRed = clQuadF2.rgbRed) then inc(nbPtF2);
        end;
      end;
      // Comptage du nombre de Pixels de F2 dans F1 et changement de couleur :
      for y := 0 to H - 1 do begin
        for x := 0 to W - 1 do begin
          if (SLQF1[y, x].rgbBlue = clQuadF1.rgbBlue)
            and (SLQF1[y, x].rgbGreen = clQuadF1.rgbGreen)
            and (SLQF1[y, x].rgbRed = clQuadF1.rgbRed)
            and (SLQF2[y, x].rgbBlue = clQuadF2.rgbBlue)
            and (SLQF2[y, x].rgbGreen = clQuadF2.rgbGreen)
            and (SLQF2[y, x].rgbRed = clQuadF2.rgbRed)
            then begin // x,y = Pixel d'union F2 dans F1
            inc(nbPtDans);
            SLQF1[y, x].rgbBlue := clQuadU.rgbBlue;
            SLQF1[y, x].rgbGreen := clQuadU.rgbGreen;
            SLQF1[y, x].rgbRed := clQuadU.rgbRed;
          end;
        end;
      end; 
      Result := (nbPtDans=nbPtF2);
    end;
     
    procedure TForm1.bVia2BmpClick(Sender: TObject);
    var BmpF1, BmpF2: tBitMap;
    begin
      BmpF1 := tBitMap.Create; BmpF2 := tBitMap.Create;
      BmpF1.LoadFromFile(RepAppli + 'F2DansF1Rouge.bmp');
      BmpF2.LoadFromFile(RepAppli + 'F2DansF1Bleu.bmp');
      if F2DansF1_Bmp(BmpF1, BmpF2, clRed, clBlue, clYellow)
        then TracerTexte(BmpF1, Point(220, 145), 'Astroïde dans Ellipse', clGreen)
      else TracerTexte(BmpF1, Point(220, 145), 'Astroïde hors Ellipse', clRed);
      image1.Picture.Bitmap.Assign(BmpF1);
      image1.Invalidate;
    end;
    A+.
    Images attachées Images attachées   
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/04/2013, 15h08
  2. Réponses: 0
    Dernier message: 14/07/2009, 13h12
  3. Réponses: 3
    Dernier message: 28/07/2006, 15h45
  4. [Delphi] Comment savoir si un disque existe ?
    Par Jayceblaster dans le forum Langage
    Réponses: 7
    Dernier message: 29/03/2006, 14h15
  5. tableau croisé dynamique sous delphi, comment ?
    Par Brice Yao dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/07/2005, 09h33

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