2010-09-19 23 views
0

J'ai posté quelque chose de similaire hier, mais je n'ai rien reçu. J'ai passé quelques heures aujourd'hui à résoudre des problèmes, mais je n'ai pas progressé. J'utilise Processing (le langage) et j'essaie d'implémenter une méthode qui dessine une ligne entre deux points. (Je ne souhaite pas utiliser la méthode line() de la bibliothèque.)Traitement/Dessin au trait - Aide

Ma méthode lineCreate fonctionne très bien avec des pentes positives, mais échoue avec des pentes négatives. Pouvez-vous aider à comprendre pourquoi?

est ici le code lineCreate():

void createLine(int x0, int y0, int x1, int y1){ 
    //... 
    // Handle slanted lines... 
    double tempDX = x1 - x0; 
    double tempDY = y1 - y0;   // Had to create dx and dy as doubles because typecasting dy/dx to a double data type wasn't working. 
    double m = (-tempDY/tempDX);  // m = line slope. (Note - The dy value is negative 
    int deltaN = (2 * -dx);  // deltaX is the amount to increment d after choosing the next pixel on the line. 
    int deltaNE = (2 * (-dy - dx));  // ...where X is the direction moved for that next pixel. 
    int deltaE = (2 * -dy);   // deltaX variables are used below to plot line. 
    int deltaSE = (2 * (dy + dx)); 
    int deltaS = (2 * dx); 
    int x = x0; 
    int y = y0; 
    int d = 0;       // d = Amount d-value changes from pixel to pixel. Depends on slope. 
    int region = 0;     // region = Variable to store slope region. Different regions require different formulas. 
if(m > 1){       // if-statement: Initializes d, depending on the slope of the line. 
     d = -dy - (2 * dx);     // If slope is 1-Infiniti. -> Use NE/N initialization for d. 
     region = 1; 
    } 
    else if(m == 1) 
    region = 2; 
    else if(m > 0 && m < 1){ 
     d = (2 * -dy) - dx;     // If slope is 0-1 -> Use NE/E initialization for d. 
     region = 3; 
    } 
    else if(m < 0 && m > -1){   
     d = (2 * dy) + dx;     // If slope is 0-(-1) -> Use E/SE initliazation for d. 
     region = 4; 
    } 
    else if(m == -1) 
    region = 5; 
    else if(m < -1){ 
     d = dy + (2 * dx);     // If slope is (-1)-(-Infiniti) -> Use SE/S initialization for d. 
     region = 6; 
    } 
    while(x < x1){     // Until points are connected... 
     if(region == 1){   // If in region one... 
       if(d <= 0){    // and d<=0... 
       d += deltaNE;   // Add deltaNE to d, and increment x and y. 
       x = x + 1; 
       y = y - 1; 
      } 
      else{    
       d += deltaN;  // If d > 0 -> Add deltaN, and increment y. 
       y = y - 1; 
      } 
     } 
     else if(region == 2){ 
      x = x + 1; 
      y = y - 1; 
     } 
     else if(region == 3){  // If region two... 
       if(d <= 0){    
       d += deltaE; 
       x = x + 1; 
      } 
      else{ 
       d += deltaNE; 
       x = x + 1; 
       y = y - 1; 
      } 
     } 
     else if(region == 4){  // If region three... 
       if(d <= 0){    
       d += deltaSE; 
       x = x + 1; 
       y = y + 1; 
      } 
      else{ 
       d += deltaE; 
       x = x + 1; 
      } 
     } 
     else if(region == 5){ 
      x = x + 1; 
      y = y + 1; 
     } 
     else if(region == 6){  // If region four... 
       if(d <= 0){    
       d += deltaSE; 
       x = x + 1; 
       y = y + 1; 
      } 
      else{ 
       d += deltaS; 
       y = y + 1; 
      } 
      } 
     point(x, y);   // Paints new pixel on line going towards (x1,y1). 
    } 
    return; 
} 
+0

Si c'est votre vrai code, où dx et dy sont définis, je suppose qu'ils sont tempDX et tempDY? –

+0

Non - Je montre juste la viande de l'alogrithme, parce que j'ai posté ici avant (avec des problèmes différents) et pas obtenu des réponses en raison de trop de code. – Towely

Répondre

1

Jetez un oeil à ce page. Il explique toute la théorie derrière le dessin au trait avec des exemples de code.

Il existe un certain nombre d'algorithmes connus pour le dessin au trait. Lisez à ce sujet here.