用点创建 myOwnTriangle 函数

Make myOwnTriangle function with point

我正在使用编程语言 "Processing" 编写自己的函数,仅使用 point() 来绘制三角形。 这是我的代码:

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);
}  

直到println("test1");我检查了并且程序可以运行,然后我不明白为什么它不会用if (smallStep%stepcount==0);画点 预期的行为应该是第一个三角形的线(点)。
有人可以帮我完成这个功能吗?

谢谢。

您需要学习的最重要的技能是how to debug您的程序。

您添加了 println("test1"); 行,这是一个很好的开始。但是你需要更进一步打印出每个变量的值,这样你可以更好地理解你的代码在做什么。

首先,请注意您的 for 循环没有以 { 大括号结束:

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

这意味着只有 point(i, j); 行是 "inside" for 循环,而您的 println() 语句在该循环之外!您可以通过添加 { } 大括号来解决此问题:

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

另请注意,我添加了另一个 println() 语句来确定此循环中 ij 的值。但是如果你的 运行 这个程序,你会发现这个循环永远不会 运行s!

要找出发生这种情况的原因,您可以在内循环之前添加更多 println() 语句:

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");
  }
} 

如果你 运行 这个,你会看到 y1380y250。因此,您的循环将 j 设置为等于 y1(即 300),然后检查它是否小于 y2(即 50)。这绝不是真的(380 永远不会小于 50),所以你的循环不会 运行。这就是为什么您看不到任何点被绘制的原因。

你将不得不退后一步,弄清楚在这种情况下你到底想做什么。但更重要的是,您需要养成调试代码的习惯,以准确了解它在做什么。

最后我找到了自己的解决方案

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);
}