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

 Java Discussion :

Lire pixels sous un triangle


Sujet :

Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut Lire pixels sous un triangle
    Bonjour,

    J'ai une image en noir et blanc. Je lis la couleur de chaque pixel dans un carré de cette image.
    C'est à dire je fais un double boucle for pour lire la couleur des pixels sous un carré par exemple un carré au centre de mon image.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for(int i = 1*(img.getWidth())/3; i< 2*(img.getWidth())/3;i++){
                        for(int j = (img.getHeight())/3; j< 2*(img.getHeight())/3; j++){
     
                            int p = img.getRGB(i, j);
     
                            int r = (p>>16)&0xff;
     
                            if(r == 0){
                                cinq++;
                            }
     
                        }
                     }
    Maintenant j'aimerais utilisé la même technique pour lire la couleur des pixels sous un triangle rectangle.
    Par exemple celui ci :
    Nom : triangle.JPG
Affichages : 484
Taille : 15,0 Ko

    Merci beaucoup

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il s'agit je suppose de le faire mathématiquement (et non en cherchant les pixels noirs de la diagonale). Pour un triangle rectangle de base AB=b, et de hauteur CB=h, pour tout i, 0<=i<b, d'après Thalès, on sait que la hauteur du triangle rectangle ABiCi hi = i/b × h. Donc, il te suffit de parcourir les i de 0 à b, et pour chaque i, de parcourir les j de h - hi à h.

    Nom : tr.png
Affichages : 444
Taille : 3,6 Ko
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Merci beaucoup pour les maths ça ne fait pas de mal.

    Alors mon triangle ne se dessine pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int b = (imgtriangle.getWidth())/4 ;
            int h = (imgtriangle.getHeight())/4 ;
     //dessiner le triangle
             for(int i = 0; i< b;i++){
                for(int j = h-((i/b)*h); j< h; j++){
     
                       imgtriangle.setRGB(i, j,Color.orange.getRGB());
     
                }
             }
    imgtriangle est la variable bufferisée dans laquelle je place mon image.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    grâce à votre schéma j'ai pu réfléchire autrement :

    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     //dessiner le triangle
             for(int i = 0; i< b;i++){
                for(int j = 0; j< b - i; j++){
     
                       imgtriangle.setRGB(i, j,Color.orange.getRGB());
     
                }
             }
    J'obtiens bien un triangle rectangle merci beaucoup

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    La différence entre les mathématiques et Java, c'est qu'en Java la division de 2 int tels que le diviseur soit plus grand que le dividende est toujours nulle. Il faut donc diviser des double. D'ailleurs, pour avoir de la précision, il vaudrait mieux travailler tout en double, et convertir en int au dernier moment (au moment du getRGB/setRGB). Sinon, je suppose que c'est pour faire un test là ? Parce que sinon vaut mieux dessiner la ligne avec la méthode drawLine (une simple boucle ne suffit pas pour tracer une ligne continue).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Moux88 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     //dessiner le triangle
             for(int i = 0; i< b;i++){
                for(int j = 0; j< b - i; j++){
     
                       imgtriangle.setRGB(i, j,Color.orange.getRGB());
     
                }
             }
    M'enfin, là, c'est un cas particulier (triangle rectangle isocèle (dont l'hypothénuse est la diagonale d'un carré))

    Et on peu dessiner ça avec la méthode draw() et un Path2D.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Ah oui en effet mon hypoténuse n'est pas continue à cause des "int".
    Oui c'est pour faire des tests là.

    Je vais prendre en compte vos remarques pour la suite de mon projet, pour l'instant c'est suffisant.
    Mais plus tard j'aurais certainement besoin d'améliorer la précision.

    Merci beaucoup

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Ah je suis déjà confronté à un autre problème
    là j'ai dessiné mon triangle sur le coin supérieur gauche de mon image

    Si je veux le même sur le coin supérieur droit comment dois-je faire ?
    je n'arrive pas à changer les valeurs de ma double boucle je tombe toujours en dehors de l'image.

    et oui en effet j'ai fait un triangle isocèle. Je vais réssayer avec la formule pour un triangle rectangle

    Nom : coin.JPG
Affichages : 447
Taille : 73,2 Ko

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Pour le coin supérieur droit, c'est la même technique, mais i varie de width - b à width au lieu de 0 à b, width étant la largeur du dessin. Et j varie de 0 à i-(width-b). Ou alors, plus simplement, tu fonctionnes avec 2 systèmes de coordonnées : un pour le triangle quelque soit son emplacement et son orientation, et un pour l'endroit ou il se trouve.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Merci beaucoup.

    Maintenant j'essaye de faire les 4 coins
    Donc pour les deux premiers j'ai compris, mais pour les deux autres j'ai essayé plein de chose mais ça ne marche pas soit les coordonnées sont en dehors soit le triangle n'apparait pas du tout.

    Par exemple celui en bas à gauche :

    Si j'ai bien compris la logique les i vont de 0 à b et les j de (height -b) à (i - (height- b)) ? mais ça ne doit pas être ça car ça ne marche pas

  11. #11
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Le height n'est pas bien placé ici : (i - (height- b))

    Tu dois toujours avoir une formule du type height - X, avec 0<X<height. Tu me diras (i-(height-b)) peut s'écrire -height + (b+i), mais, non seulement ça ferait -height + X, et, justement, là, on voit tout-de-suite que si (b+i) est petit par rapport à height, on a un y négatif, donc en dehors de l'écran (non seulement au dessus de la zone, mais à l'opposé du bas de la zone).

    Après, la solution est toujours similaire : ce qui marche en haut (à gauche ou à droire), il suffit de le positionner par rapport à l'autre côté (donc la hauteur=height), et en symétrie, donc height - X. Si pour le coin haut tu varies de 0 à X, en bas, tu varies de height-0 à height - X.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Alors j'ai réussi à faire ces deux formes là mais pas celle que je veux ^^
    Nom : coin bas.JPG
Affichages : 396
Taille : 31,0 Ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(int i =0; i< b;i++){
                for(int j = height -b; j< i +(height-b); j++){
     
                       imgtriangle.setRGB(i, j,Color.red.getRGB());
     
                }
             }
    et Nom : coin bas 2.JPG
Affichages : 374
Taille : 31,4 Ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     for(int i =0; i< b;i++){
                for(int j = height -b; j< height - i; j++){
     
                       imgtriangle.setRGB(i, j,Color.red.getRGB());
     
                }
             }
    Je comprends la logique des deux expressions sur l'axe x i varie de 0 à b et pour ma hauteur de "height -b" je rajoute une ligne ou j'en enleve une
    mais pourquoi ce sont les pixels au dessus de la diagonale qu sont coloriés et pas ceux d'en dessous ?

  13. #13
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Si tu n'arrives à pas directement déterminer les bornes, cherche à travailler par offset : tu traces ton triangle par rapport à 0,0, puis tu le déplaces. Ensuite, tu peux convertir ça pour que ça s'applique sur les bornes des boucles. Ensuite, dans les bornes, tu as 2 approches possibles pour inverser une boucle : tu vas de mettons a à b. Lorsque tu vas inverser, tu vas aller mettons de HEIGHT - a à HEIGHT - b : forcément si b>a, HEIGHT - a > HEIGHT -b, donc ta boucle ne boucle plus : il faut inverserser l'incrément. Et bien, tu peux aussi inverser les bornes et aller de HEIGHT -b à HEIGHT-a. Il faut juste faire attention à ce qui est exclu et ce qui est inclus.

    • for(int i=a; i<b; i++) première valeur = a, dernière valeur exclue = b, on fait a+1, a+2, a+3...b-1
    • inversion for(int i=HEIGHT-a-1; i>=HEIGHT-b;i--) première valeur = HEIGHT - a exclue, dernière HEIGHT-B, on fait HEIGHT - a - 1, HEIGHT - a - 1 + 1, HEIGHT - a - 1 + 2, HEIGHT - a - 1 + 3...HEIGHT - b
    • inversion for(int i=HEIGHT-b; i<HEIGHT-a; i++), mêmes valeurs mais dans l'autre sens


    Voici les 2 fois 4 solutions :

    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    public class DemoTriangle {
     
    	private static final int B = 64; 
    	private static final int WIDTH = 500;
    	private static final int HEIGHT = 300;
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     
    		BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_ARGB);
     
    		ajouteTriangleHautGauche(image);
    		ajouteTriangleHautDroite(image);
    		ajouteTriangleBasGauche(image);
    		ajouteTriangleBasDroite(image);
     
    		frame.add(new JLabel(new ImageIcon(image)));
     
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
     
    	private static void ajouteTriangleHautGauche(BufferedImage image) {
    		for(int i=0; i<B; i++) { 
    			for (int j=0; j<B-i; j++) { 
    				setRGB(image, i,j);
    			}
    		}
    	}
     
    	/*private static void ajouteTriangleHautDroite(BufferedImage image) {
    		int offsetX = WIDTH - B; // on décale à la fin
    		for(int i=0; i<B; i++) { 
    			for (int j=0; j<i; j++) { // on inverse le triangle et on compense le décalage
    				setRGB(image, i+offsetX, j);
    			}
    		}
    	}*/
     
    	private static void ajouteTriangleHautDroite(BufferedImage image) {
    		int offsetX = WIDTH - B; // on décale à la fin
    		for(int i=offsetX; i<offsetX + B; i++) { 
    			for (int j=0; j<i-offsetX; j++) { // de 0 à i
    				setRGB(image, i, j);
    			}
    		}
    	}
     
    	/*private static void ajouteTriangleBasGauche(BufferedImage image) {
    		int offsetY = HEIGHT-1; // attention : le dernier point de la matrice de pixels est en height-1 (de 0 à height exclu)
    		for(int i=0; i<B; i++) { 
    			for (int j=0; j<B-i; j++) { 
    				setRGB(image, i,offsetY-j);
    			}
    		}
    	}*/
     
     
    	private static void ajouteTriangleBasGauche(BufferedImage image) {
    		int offsetY = HEIGHT-B; 
    		for(int i=0; i<B; i++) { 
    			for (int j=offsetY+i; j<offsetY+B; j++) { // de i à B
    				setRGB(image, i,j);
    			}
    		}
    	}
     
    	/*private static void ajouteTriangleBasDroite(BufferedImage image) {
    		int offsetX = WIDTH - B; // on décale à la fin
    		int offsetY = HEIGHT - 1;
    		for(int i=0; i<B; i++) { 
    			for (int j=0; j<i; j++) { // on inverse le triangle et on compense le décalage
    				setRGB(image, i+offsetX, offsetY-j);
    			}
    		}
    	}*/
     
    	private static void ajouteTriangleBasDroite(BufferedImage image) {
    		int offsetX = WIDTH - B; 
    		int offsetY = HEIGHT - B;
    		for(int i=offsetX; i<offsetX + B; i++) { 
    			for (int j=offsetY + B - (i-offsetX); j<  offsetY + B; j++) { 
    				setRGB(image, i, j);
    			}
    		}
    	}
     
    	private static void setRGB(BufferedImage image, int i, int j) {
    		image.setRGB(i, j, Color.ORANGE.getRGB());
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    Merci beaucoup j'ai enfin réussi à faire ces triangles.
    J'ai réussi celui de gauche avec vos conseils et pour celui de droite j'ai regardé la solution merci .

    Par contre mes triangles sont isocèles et je ne comprends pas pourquoi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int B = (imgglobal.getWidth())/3 ;
    int C =(imgglobal.getHeight())/3;
            for(int i = 0; i< B;i++){
                for(int j = 0; j< C - i; j++){
     
                       imgglobal.setRGB(i, j,Color.orange.getRGB());
     
                }
             }
    Et j'ai affiché B et C pour une image de 300*100px
    et j'obtiens B= 100 et C=33 (arrondi car c'est un int)

    Mais pourtant sur l'image mon triangle est bel et bien isocèle alors qu'il devrait avoir le côté du haut plus grand que celui de gauche non ?
    Nom : tri.JPG
Affichages : 377
Taille : 17,1 Ko

    merci

  15. #15
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    j'ai un peu plus cerné mon problème :

    Si je met une petite valeur voilà ce que j'obtiens et ce n'est pas du tout un triangle rectangle

    Nom : pas rec.JPG
Affichages : 335
Taille : 10,4 Ko

    Pourquoi mon triangle ne peux etre qu'isocèle ?

  16. #16
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Je t'ai déjà dit pourquoi. La bonne formule, je l'ai montrée dans le message #2. Et je t'ai dit en #6 que la formule de simplification que tu utilisais était pour un triangle isocèle.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  17. #17
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Ah oui merci beaucoup.

    J'ai donc appliqué la formule pour le premier triangle. Mais je n'y arrive pas pour les 3 autres triangles
    Si j'applique la même formule sur les autres ça ne marche pas.

    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
     
    double base = (double) (imgglobal.getWidth())/3;
            double hauteur = (double) (imgglobal.getHeight())/3;
            //dessiner le triangle haut gauche
             for(double i = 0; i< base;i++){
                for(double j = 0; j< hauteur - ((i/base)*hauteur); j++){
     
                       int a = (int) Math.round(i);
                       int b = (int) Math.round(j);
                       imgglobal.setRGB(a, b,Color.orange.getRGB());
     
                }
             }
     
             //dessiner le triangle haut droit
             for(double i = width-base; i< width;i++){
                for(double j = 0; j< i - (width - hauteur); j++){
     
                       int a = (int) Math.round(i);
                       int b = (int) Math.round(j);
                       imgglobal.setRGB(a, b,Color.green.getRGB());
     
                }
             }
     
             //dessiner le triangle bas droit
             for(double i = width - base; i< width;i++){
                for(double j = height  - (i-(width -hauteur)) ; j< height ; j++){
     
                       int a = (int) Math.round(i);
                       int b = (int) Math.round(j);
                       imgglobal.setRGB(a, b,Color.yellow.getRGB());
     
                }
             }
     
     
             //dessiner le triangle bas gauche
             for(double i =0; i< base;i++){
                for(double j = (height - hauteur) +i; j< (height-hauteur)+hauteur; j++){
     
                       int a = (int) Math.round(i);
                       int b = (int) Math.round(j);
                       imgglobal.setRGB(a, b,Color.red.getRGB());
     
                }
             }
    Voici ce que j'obtiens :
    Nom : developpez.JPG
Affichages : 411
Taille : 43,8 Ko

    Merci

  18. #18
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
             //dessiner le triangle bas droit
    /*...*/
                for(double j = height  - (i-(width -hauteur)) ; j< height ; j++){
    Là, on voit déjà que la formule hi = i/base × hauteur n'est pas appliquée...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
             //dessiner le triangle bas gauche
    /*...*/
                for(double j = (height - hauteur) +i; j< (height-hauteur)+hauteur; j++){
    Pareil. Et (height-hauteur+hauteur) ça fait height (de tête )

    Par ailleurs, tu peux simplement caster pour passer de double à int (pas forcément utile de faire un round (ou alors il faudrait plutôt utiliser un ceil)

    Voilà les 2 alternatives de l'exemple du message #13 , plus une.
    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    public class DemoTriangleRectangle {
     
    	public static final int TOP = 1<<0;
    	public static final int BOTTOM = 1<<1;
    	public static final int LEFT = 1<<2;
    	public static final int RIGHT = 1<<3;
     
    	private static final int B = 96; 
    	private static final int H = 64; 
    	private static final int WIDTH = 500;
    	private static final int HEIGHT = 300;
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_ARGB);
     
    		ajouteTriangle(image, DemoTriangleRectangle.TOP | DemoTriangleRectangle.LEFT);
    		ajouteTriangle(image, DemoTriangleRectangle.TOP | DemoTriangleRectangle.RIGHT);
    		ajouteTriangle(image, DemoTriangleRectangle.BOTTOM | DemoTriangleRectangle.LEFT);
    		ajouteTriangle(image, DemoTriangleRectangle.BOTTOM | DemoTriangleRectangle.RIGHT);
     
    		/*ajouteTriangleHautGauche(image);
    		ajouteTriangleHautDroite(image);
    		ajouteTriangleBasGauche(image);
    		ajouteTriangleBasDroite(image);*/
     
    		frame.add(new JLabel(new ImageIcon(image)));
     
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
     
    	private static int height(int i) {
                    return (int) (i/(double)B * H); 
    		//return (int) Math.round((i/(double)B * H)); 
    	}
     
    	private static void ajouteTriangle(BufferedImage image, int position) {
    		final boolean top;
    		if ( (position & DemoTriangleRectangle.TOP)==DemoTriangleRectangle.TOP ) {
    			top=true;
    		}
    		else if ( (position & DemoTriangleRectangle.BOTTOM)==DemoTriangleRectangle.BOTTOM ) {
    			top=false;
    		}
    		else {
    			throw new IllegalArgumentException();
    		} 
    		final boolean left;
    		if ( (position & DemoTriangleRectangle.LEFT)==DemoTriangleRectangle.LEFT ) {
    			left=true;
    		}
    		else if ( (position & DemoTriangleRectangle.RIGHT)==DemoTriangleRectangle.RIGHT ) {
    			left=false;
    		}
    		else {
    			throw new IllegalArgumentException();
    		}
     
    		for(int i=0; i<B; i++) { 
    			int x = left?i:WIDTH-1-i;
    			final int h = height(B-i);
    			for (int j=0; j<h; j++) { 
    				int y = top?j:HEIGHT-1-j;
    				setRGB(image, x, y);
    			}
    		}
     
    	}
     
    	/*private static void ajouteTriangleHautGauche(BufferedImage image) {
    		for(int i=0; i<B; i++) { 
    			final int h = height(B-i);
    			for (int j=0; j<h; j++) { 
    				setRGB(image, i,j);
    			}
    		}
    	}*/ 
     
    	/*private static void ajouteTriangleHautDroite(BufferedImage image) {
    		int offsetX = WIDTH - B; // on décale à la fin
    		for(int i=offsetX; i<WIDTH; i++) { 
    			final int h = height(i-offsetX); 
    			for (int j=0; j<h; j++) { 
    				setRGB(image, i,j);
    			}
    		}
    	}*/
     
    	/*private static void ajouteTriangleHautDroite(BufferedImage image) { 
    		for(int i=0; i<B; i++) { 
    			final int h = height(B-i); 
    			for (int j=0; j<h; j++) { 
    				setRGB(image, WIDTH-1-i,j);
    			}
    		}
    	}*/
     
    	/*private static void ajouteTriangleBasGauche(BufferedImage image) { 
    		for(int i=0; i<B; i++) { 
    			final int h = height(B-i);
    			for (int j=HEIGHT-h; j<HEIGHT; j++) { 
    				setRGB(image, i,j);
    			}
    		}
    	}*/ 
     
    	/*private static void ajouteTriangleBasGauche(BufferedImage image) { 
    		for(int i=0; i<B; i++) { 
    			final int h = height(B-i);
    			for (int j=0; j<h; j++) { 
    				setRGB(image, i, HEIGHT-1-j);
    			}
    		}
    	}*/ 
     
    	/*private static void ajouteTriangleBasDroite(BufferedImage image) {
    		int offsetX = WIDTH - B; 
    		for(int i=offsetX; i<WIDTH; i++) { 
    			final int h = height(i-offsetX); 
    			for (int j=HEIGHT-h; j<HEIGHT; j++) { 
    				setRGB(image, i,j);
    			}
    		}
    	}*/
     
    	/*private static void ajouteTriangleBasDroite(BufferedImage image) {
    		for(int i=0; i<B; i++) { 
    			final int h = height(B-i); 
    			for (int j=0; j<h; j++) { 
    				setRGB(image, WIDTH-1-i, HEIGHT-1-j);
    			}
    		}
    	}*/
     
    	private static void setRGB(BufferedImage image, int i, int j) {
    		image.setRGB(i, j, Color.ORANGE.getRGB());
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  19. #19
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Merci infiniment !!! Merci pour votre patience.

    J'ai adapté votre au code au mien tout fonctionne parfaitement je vais pouvoir continuer mon projet.
    Je fais du traitement d'image, je voulais traiter les pixels dans ses surfaces là, j'avais donc besoin de les peindres pour voir si j'étais au bon endroit.

    Merci beaucoup

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

Discussions similaires

  1. pixel sous VLC et pas WMP
    Par antoine974 dans le forum Vidéo
    Réponses: 1
    Dernier message: 08/05/2009, 09h33
  2. Le fameux bug des 3 pixels sous IE6
    Par RootsRagga dans le forum Mise en page CSS
    Réponses: 8
    Dernier message: 28/03/2009, 19h14
  3. lire fichier sous reseau
    Par cigala5555 dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 16/05/2008, 16h39
  4. Décalage 2 pixels sous IE
    Par finalfx dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 15/04/2006, 23h48
  5. Réponses: 23
    Dernier message: 23/03/2006, 20h09

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