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

Android Discussion :

Algorithme de Bresenham en Java


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 118
    Par défaut Algorithme de Bresenham en Java
    Bonjour,

    j'ai un petit problème je m'explique, j'effectue actuellement une application android ou j'effectue une simulation grace à l'algorithme suivant :

    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
     
    pixelsSquare = 4;
    for (b = getPosY_Zone(); b < getHeight_Zone()-1; b = b + pixelsSquare) {
    				for (a = getPosX_Zone(); a < getPosX_Zone() + getWidth_Zone()-1; a = a + pixelsSquare) {
    					bestpower = -100;
    					power = 0;
    					for (Source s : sources) {
    						if (s.isONSource()) {
    							power = s.powerAtPosition(
    									(int) (a,b)
    									- getTotalAttenuation(
    											s,
    											(int) (a ,b));
    							if (power > bestpower)
    								bestpower = power;
    						}
    					}
    					for (int j = b; j < b + pixelsSquare; j++) {
    						for (int i = a; i < a + pixelsSquare; i++) {
    							simu.setPixel(i - getPosX_Zone(), j
    									- getPosY_Zone(), PowerScale
    									.getPowerFromValue(bestpower).getColor());
     
    						}
     
    					}
     
    				}
    Cet algorithme me permet de parcourir l'ensemble de mon plan et d'attribuer une puissance qui est liée à une couleur et donc colorer pixel par pixel, l'ensemble des pixels de mon plan. Le calcul de la puissance s'effectue en fonction du placement de ma source sur le plan et des différents obstacles. Cette algorithme marche parfaitement mais le calcul n'est pas très rapide.
    Afin d'aller plus vite j'ai décidé d'utiliser l'algorithme de Bresenham, qui va me permettre de colorer les pixels du quadrillage de mon plan en traçant des lignes de ma source jusqu'au pixel se trouvant au extrémité de mon plan. j'arrive à tracer mes différentes lignes avec le code suivant :

    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
     
    public void BresenhamAlgorithm(int x1, int y1, int x2, int y2, double power) {
    		int x, y;
    		int dx, dy;
    		int xincr, yincr;
    		int erreur;
    		int i;
    		int coordX, coordY;
    		int sizePixel = 7;
     
    		Canvas c = new Canvas(simu);
    		Paint paint = new Paint();
     
    		paint.setColor(PowerScale.getPowerFromValue(power).getColor());
     
    		dx = Math.abs(x2 - x1);
    		dy = Math.abs(y2 - y1);
     
    		if (x1 < x2) {
    			xincr = 1;
    		} else {
    			xincr = -1;
    		}
     
    		if (y1 < y2) {
    			yincr = 1;
    		} else {
    			yincr = -1;
    		}
     
    		x = x1;
    		y = y1;
     
    		if (dx > dy) {
    			erreur = dx / 2;
    			for (i = 0; i < dx; i++) {
    				x = x + xincr;
    				erreur = erreur + dy;
    				if (erreur > dx) {
    					erreur = erreur - dx;
    					y = y + yincr;
    				}
     
    				paint.setColor(PowerScale.getPowerFromValue(power).getColor());
    				c.drawRect(x, y, (int) (x + sizePixel), (int) (y + sizePixel),
    						paint);
     
    			}
    		} else {
    			erreur = dy / 2;
    			for (i = 0; i < dy; i++) {
    				y = y + yincr;
    				erreur = erreur + dx;
     
    				if (erreur > dy) {
    					erreur = erreur - dy;
    					x = x + xincr;
    				}
     
    				paint.setColor(PowerScale.getPowerFromValue(power).getColor());
    				c.drawRect(x, y, (int) (x + sizePixel), (int) (y + sizePixel),
    						paint);
    			}
     
    		}
    	}
    Seulement mon problème c'est que pour le moment je met en parametre power, j'aimerai pouvoir faire modifier power a chaque fois que je trace un pixel (rectangle dans mon cas) car pour le moment ma ligne se trace mais elle est toujours de la même couleur, normal. Je ne vois pas trop comment résoudre ce problème

    Je vous remercie

  2. #2
    Membre éprouvé Avatar de Arislas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2015
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 116
    Par défaut
    Ton code te permet de dessiner une ligne entière en 1 coup non ? Si c'est le cas , je ne pense pas que ce soit possible de modifier la couleur pour chaque pixels de la lignes.

    Il faudrait rester sur ton ancien algorithme.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 118
    Par défaut
    exactement il me permet de tracer une ligne du centre de ma source jusqu'au pixel se trouvant au extremité de mon plan par exemple (0,0) pour le premier pixel. Ben il faudrait que j'arrive a récupérer a chaque fois la valeur de power et que je puisse l'intégrer dans ma methode BresenhamAlgorithme en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    paint.setColor(PowerScale.getPowerFromValue(power)
    								.getColor());
    ce qui permettrait de dessiner un pixel a chaque fois d'une couleur différente

  4. #4
    Membre éprouvé Avatar de Arislas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2015
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 116
    Par défaut
    Explique-moi, tu veux que ton power change de valeur à chaque pixel mais par rapport à quoi ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 118
    Par défaut
    En faite oui, dans l'algorithme de depart la valeur du power change à chaque fois, elle est calculer en fonction de la position de la source plus on est près de la source plus les pixels sont de couleur rouge et plus on est loin plus la couleur va vers le mauve

  6. #6
    Membre éprouvé Avatar de Arislas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2015
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 116
    Par défaut
    Du coup, dans ton deuxième code : la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    paint.setColor(PowerScale.getPowerFromValue(power).getColor());
    Elle récupère une nouvelle couleur, et vu que tu le fait à chaque fois que tu va dessiné la couleur devrait changer, non ?

    Le truc c'est que tu ne change jamais la valeur de ton power, tu devrais essayer un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    power = // fonction qui récupère la valeur de power
               paint.setColor(PowerScale.getPowerFromValue(power).getColor());
     ...
    Mais comme je ne connais pas la parti du programme qui récupère la valeur je ne peu pas trop t'aider.

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

Discussions similaires

  1. algorithme de bresenham pour la détection de droite
    Par soumayacheikh dans le forum Images
    Réponses: 6
    Dernier message: 23/04/2010, 15h21
  2. Algorithmes de compression en java
    Par ramoths dans le forum Débuter
    Réponses: 0
    Dernier message: 15/11/2008, 23h04
  3. [2D] Algorithme de Bresenham
    Par Trillian dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 09/03/2006, 14h48
  4. L'algorithme de bresenham
    Par ccensam dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 06/11/2005, 22h57

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