[Java] drawLine, faire le sien?

drawLine, faire le sien? [Java] - Java - Programmation

Marsh Posté le 22-04-2008 à 17:02:55    

Bonjour,
 
Je viens vous demander un peu d'aide  :D  
 
Voila je suis donc en java, en j2me même, mais ici ce n'est pas important.  
Je voudrais réaliser un drawLine nouveau et ne pas utiliser celui de la librairie Graphics, pour cela j'utilise l'affichage par drawRGB(),
je m'explique je donne en paramètre le tableau contenant les pixels en ARGB, et ainsi l'image s'affiche avec mon dessin dedans.
 
Donc le principe, je crée mon propre tirer trait:

Code :
  1. .
  2. ...
  3. .....
  4. private int[] tableauImage = new int[getWidth()*getHeight()];
  5. .
  6. ...
  7. ....
  8. public void tirerTrait(int x1, int y1, int x2, int y2, int ARGB)
  9. {
  10.      double x = Math.abs(_x2 - _x1);
  11.      double y = Math.abs(_y2 - _y1);
  12.      double pt = Math.sqrt(x*x+y*y);
  13.      double ptx= x/pt;
  14.      double pty = y/pt;
  15.      double bufx = _x1;
  16.      double bufy = _y1;
  17.      for(int i=0; i<=pt; i++)
  18.      {
  19.          this.__tabJeux[((int)bufx+(int)bufy*(int)this.__width)] = _ARGB;
  20.          bufx = bufx + ptx;
  21.          bufy = bufy + pty;
  22.      }
  23. }
  24. ..
  25. ...


Mais par exemple pour :
fillLine(10,10,45, 100,ARGB);
Le trait n'est pas régulier.... des imperfections, comment régler se problème?
 
Merci a vous ;)  
 
Twub


Message édité par Twub le 22-04-2008 à 17:13:58
Reply

Marsh Posté le 22-04-2008 à 17:02:55   

Reply

Marsh Posté le 22-04-2008 à 17:11:57    

Pardon? je viens de modifier le post si y'a un soucis faites signe ^^

Reply

Marsh Posté le 22-04-2008 à 17:42:39    

Vraiment super cette algo de Bresenham,
adapté il fonctionne très bien sa me simplifie bien la vie, un grand merci en tout cas ;)  
 
Par contre je n'arrive pas a trouver celui de Wu... tu n'aurais pas une petite info? ^^
 
merci xD

Reply

Marsh Posté le 23-04-2008 à 09:57:28    

Merci,
 
Trés interessant, je vais essayer de l'adapté en java, sa doit pas être trop dure ;)
 
je fais signe si j'y arrive et si j'y arrive pas aussi ^^
 
ps: si quelqu'un a la version java je suis preneur xD
 
Merci encore


Message édité par Twub le 23-04-2008 à 10:02:27
Reply

Marsh Posté le 23-04-2008 à 15:08:19    

Bon en fin de compte j'ai réussi a faire pour la partie ou dx > dy celle qui est expliqué en fait sur : http://en.wikipedia.org/wiki/Xiaol [...] _algorithm
 
Mais j'ai un problème avec le else, je comprend pas ce qu'il faut changer, pourtant c'est pas dur...
 
Je veux bien un coup de main si vous avez compris ;)
 
merci xD


Message édité par Twub le 23-04-2008 à 15:09:45
Reply

Marsh Posté le 25-04-2008 à 09:40:00    

Toujours personne pour mon problème? ^^
 
En tout cas, merci beaucoup pour l'aide ;)

Reply

Marsh Posté le 25-04-2008 à 14:39:44    

Ok ben pour l'instant j'ai fais sa:
 

Code :
  1. public double decimal(double _a)
  2. {
  3. //retourne la partie decimal
  4. }
  5.  
  6. public double rdecimal(double _a)
  7. {
  8. //retourne 1 moins la partie decimal
  9. }
  10.  
  11.     public void drawLine(int _x1, int _y1, int _x2, int _y2, int _couleur)
  12.     {
  13.         if(_x2 < _x1)
  14.         {
  15.             int buf = _x1;
  16.             _x1 = _x2;
  17.             _x2=buf;
  18.             buf = _y1;
  19.             _y1 = _y2;
  20.             _y2 = buf;
  21.         }
  22.  
  23.         double dx = _x2 - _x1;
  24.         double dy = _y2 - _y1;
  25.         double gradient = dy/dx;
  26.         
  27.         if(Math.abs(dx) > Math.abs(dy))
  28.         {                
  29.             //horizontal
  30.             //1er point
  31.             double xend = (double)round(_x1);
  32.             double yend = (double)_y1 + gradient * (xend - (double)_x1);
  33.             double xgap = (1-decimal(_x1 + 0.5));
  34.             double xpxl1 = xend ;
  35.             double ypxl1 = yend;
  36.  
  37.             this.__tabJeux[((int)xpxl1+(int)(ypxl1*this.__width))] = defineColor((int)(((rdecimal(yend))* xgap)*255),0,0,0);
  38.             this.__tabJeux[((int)xpxl1+((int)ypxl1+1)*this.__width)] = defineColor((int)(((decimal(yend)* xgap))*255),0,0,0);
  39.             
  40.             double intery = yend + gradient;
  41.             
  42.             // dernier point
  43.             xend = round(_x2);
  44.             yend = (int)(_y2 + gradient * (xend - _x2));
  45.             xgap = decimal(_x2 + 0.5);
  46.             double xpxl2 = xend ;
  47.             double ypxl2 = yend;
  48.             this.__tabJeux[((int)xpxl2+(int)ypxl2*this.__width)] = defineColor((int)((((rdecimal(yend))* xgap))*255),0,0,0);
  49.             this.__tabJeux[((int)xpxl2+(int)(ypxl2+1)*this.__width)] = defineColor((int)(((decimal(yend)* xgap))*255),0,0,0);
  50.  
  51.             // boucle principal
  52.             for(double x = xpxl1 + 1.0; x<xpxl2 - 1.0;x++)
  53.             {
  54.                 this.__tabJeux[((int)x+(int)intery*this.__width)] = defineColor((int)(((rdecimal(intery)))*255),0,0,0);
  55.                 this.__tabJeux[((int)x+((int)intery+1)*this.__width)] = defineColor((int)(((decimal(intery)))*255),0,0,0);
  56.                 intery = intery + gradient;
  57.             }
  58.         }
  59.         else //ICI COMMENT FAIRE ?
  60.         {
  61. }
  62. }


 
Voila, c'est la second partie, le else je vois pas vraiment quoi changer ^^
 
merci ;)


Message édité par Twub le 25-04-2008 à 14:42:20
Reply

Marsh Posté le 29-04-2008 à 10:01:56    

Petit UP ^^
 
Si jamais vous avez des questions je suis la xD
 
merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed