J'écris ma propre fonction pour dessiner un triangle en utilisant uniquement point () avec le langage de programmation "Processing". Voici mon code:

void setup()
{
  size(400, 400);
  background(#99c2ff);
  noLoop();
}

void myOwnTriangle(int x1, int y1, int x2, int y2, int x3, int y3)
{
  int x=x1;
  int differenceY=abs(y1-y2); //y1=380; y2=50; (380-50)=330
  int differenceX=abs(x2-x1); //x2=300; x1=30; (300-30)=270
  int smallStep = differenceY/differenceX;// 330-270=60
  int stepcount=0;
  if (x1<=x2)
    for (int i=x1; i<=x2; i++)
    {
      for (int j=y2; j<=y1; j++)
        point(i, j);
        println("test1");
      stepcount++;

     }


    } 
}

void draw()
{
  stroke(#ff3399); 
  myOwnTriangle(30, 380, 300, 50, 380, 250);
}  

Tant que println("test1"); n’aurai pas vérifié et que le programme ne fonctionnera pas, je ne comprends pas pourquoi il ne fera pas le point avec if (smallStep%stepcount==0); le comportement attendu doit être la ligne du premier triangle (de point).
Quelqu'un peut-il m'aider à remplir cette fonction?

Merci.

0
Laura Enria 31 mars 2017 à 20:33

2 réponses

Meilleure réponse

J'ai trouvé ma propre solution à la fin:

void setup()
{
  size(400, 400);
  background(#99c2ff);
  noLoop();
}

void myOwnTriangle(int x1, int y1, int x2, int y2, int x3, int y3)
{
  myLine(x1, y1, x2, y2);
  myLine( x2, y2, x3, y3);
  myLine( x3, y3, x1, y1);
}

void myLine(float x1, float y1, float x2, float y2) 
{
  float dx = x2-x1;
  float dy = y2-y1;
  if (dx == 0) {
    for (float i = min(y1, y2); i<max(y1, y2); i+=1) 
    {
      point(x1, i);
    }
    return;
  }
  float k = dy/dx;
  float m = y1 -x1*k;
  for (float i = min(x1, x2); i<max(x1, x2); i+=1/max(1, abs(k))) {
    point(i, k*i+m);
  }
}

void draw()
{
  noLoop();
  strokeWeight(2);
  stroke(2, 0, 255);
  myOwnTriangle(80, 50, 215, 300, 215, 100);
  stroke(#ff00ff);
  myOwnTriangle(80, 80, 80, 300, 215, 100);
  stroke(#00ff00);
  myOwnTriangle(100, 250, 300, 250, 200, 100);
}
0
Kevin Workman 10 juil. 2017 à 18:00

La compétence la plus importante que vous devez acquérir est comment déboguer votre programme.

Vous avez ajouté une ligne println("test1");, et c'est un bon début. Mais vous devez aller plus loin et imprimer les valeurs de chaque variable, de cette façon vous pourrez mieux comprendre ce que fait votre code.

Tout d'abord, notez que votre boucle for ne se termine pas par une accolade {:

for (int j=y1; j<=y2; j++)
    point(i, j);
    println("test1");

Cela signifie que seule la ligne point(i, j); est "à l'intérieur" de la boucle for, et votre instruction println() est en dehors de cette boucle! Vous pouvez résoudre ce problème en ajoutant des accolades { }:

for (int j=y1; j<=y2; j++){
    println(i + ", " + j);
    point(i, j);
    println("test1");
}

Notez également que j'ai ajouté une autre instruction println() pour déterminer quelles sont les valeurs de i et j dans cette boucle. Mais si vous exécutez ce programme, vous découvrirez que cette boucle ne s'exécute jamais!

Pour comprendre pourquoi cela se produit, vous pouvez ajouter d'autres instructions println() juste avant la boucle interne:

for (int i=x1; i<=x2; i++){
  println("i: " + i);
  println("y1: " + y1);
  println("y2: " + y2);
  for (int j=y1; j<=y2; j++){
    println(i + ", " + j);
    point(i, j);
    println("test1");
  }
} 

Si vous exécutez ceci, vous verrez que y1 est 380 et y2 est 50. Ainsi, votre boucle définit j égal à y1 (qui est 300) et vérifie ensuite si elle est inférieure à y2 (qui est 50). Ce n'est jamais vrai (380 n'est jamais inférieur à 50), donc votre boucle ne s'exécute pas. C'est pourquoi vous ne voyez aucun point dessiné.

Vous allez devoir prendre du recul et déterminer exactement ce que vous voulez faire dans ce cas. Mais plus important encore, vous devez prendre l'habitude de déboguer votre code pour comprendre exactement ce qu'il fait.

0
Kevin Workman 1 avril 2017 à 17:07