用点创建 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()
语句来确定此循环中 i
和 j
的值。但是如果你的 运行 这个程序,你会发现这个循环永远不会 运行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");
}
}
如果你 运行 这个,你会看到 y1
是 380
而 y2
是 50
。因此,您的循环将 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);
}
我正在使用编程语言 "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()
语句来确定此循环中 i
和 j
的值。但是如果你的 运行 这个程序,你会发现这个循环永远不会 运行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");
}
}
如果你 运行 这个,你会看到 y1
是 380
而 y2
是 50
。因此,您的循环将 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);
}