【发布时间】:2021-06-11 15:53:52
【问题描述】:
我是处理新手,我需要一些有关此算法的帮助。 我不能使用 fill() 和 line() 函数。
这应该绘制一个凸多边形(我用鼠标点击选择顶点),当我按下“T”按钮时,它将“填充()”多边形。
int x1, y1, x2, y2;
int click;
boolean scanlineOn;
void setup() {
size(640, 480);
click = 0;
scanlineOn = false;
};
void draw() {
if (click == 2) {
beoszto(x1, y1, x2, y2);
click = 0;
x1 = -1;
y1 = -1;
x2 = -1;
y2 = -1;
};
if (scanlineOn == true) {
scanline();
scanlineOn = false;
};
};
void scanline() {
int x = 1, y = 1;
int xA = -1, yA = -1;
int xB = -1;
color a;
color b;
color c;
c = get(x, y);
while (x != 639 && y != 479) {
xA = -1;
yA = -1;
xB = -1;
while (x != 639) {
a = get(x, y);
b = get(x+1, y);
if (a != b && xA == -1) {
xA = x + 1;
yA = y;
c = get(xA, yA);
} else if (c == b && a != b) {
xB = x + 1;
};
if (xA != -1 && xB != -1){
myfill(xA, yA, xB);
xA = -1;
yA = -1;
xB = -1;
};
x = x + 1;
};
y = y + 1;
x = 1;
};
};
void myfill(int xA, int yA, int xB) {
while (xA < xB) {
point(xA, yA);
xA = xA + 1;
};
};
void beoszto(int x1, int y1, int x2, int y2) {
if (x1 < x2) {
sectiondraw(x2, y2, x1, y1);
} else if (x1 == x2 && y1 == y2) {
point(x1, y1);
} else {
sectiondraw(x1, y1, x2, y2);
};
};
void sectiondraw(int xA, int yA, int xB, int yB) {
int a, b, d, dE, dNE, a2, b2;
if (yA - yB <= 0) {
a2 = yB - yA;
} else {
a2 = yA - yB;
};
if (xA - xB <= 0) {
b2 = xB - xA;
} else {
b2 = xA - xB;
};
if (b2 >= a2) {
b = -b2;
a = a2;
} else {
b = -a2;
a = b2;
};
d = 2 * a + b;
dE = 2 * a;
dNE = 2 * (a + b);
point(xB, yB);
if (b2 >= a2 && yA >= yB) {
while (xB < xA) {
if (d >= 0) {
d = d - dE;
xB = xB + 1;
} else {
d = d - dNE;
yB = yB + 1;
xB = xB + 1;
};
point(xB, yB);
};
} else if (b2 >= a2 && yA < yB) {
while (xB < xA) {
if (d >= 0) {
d = d - dE;
xB = xB + 1;
} else {
d = d - dNE;
yB = yB - 1;
xB = xB + 1;
};
point(xB, yB);
};
} else if (b2 <= a2 && yA <= yB) {
while (yB > yA) {
if (d >= 0) {
d = d - dE;
yB = yB - 1;
} else {
d = d - dNE;
yB = yB - 1;
xB = xB + 1;
};
point(xB, yB);
};
} else {
while (yB < yA) {
if (d >= 0) {
d = d - dE;
yB = yB + 1;
} else {
d = d - dNE;
yB = yB + 1;
xB = xB + 1;
};
point(xB, yB);
};
};
};
void mousePressed() {
if (click == 0) {
x1 = mouseX;
y1 = mouseY;
click = 1;
} else {
x2 = mouseX;
y2 = mouseY;
click= 2;
};
};
void keyPressed() {
if (key == 't' || key == 'T') {
scanlineOn = true;
};
};
它像地狱一样的越野车。我最大的问题是我必须用多条线绘制多边形。
【问题讨论】:
-
请告诉我们当前的行为到底是什么(什么是错误的)和预期的究竟是什么。上述方法,填充和线条发生了什么?你是如何运行代码的?
-
当前行为是:第一次点击=第一个点坐标。第二次单击 = 第二个点坐标。然后它将在两点之间画一条线。所以如果我想制作一个三角形,我必须点击 6 次。预期行为:第一次单击=第一个点坐标第二次单击:=第二个点坐标它将画一条线。然后它将使用以前的坐标作为起始坐标。第三次点击=它会在点击 2 和点击 3 之间画一条新线。
-
我很困惑为什么你不能使用 line() 函数。有什么特别的原因吗?如果我理解您要正确执行的操作,他们会让这变得容易得多。
标签: processing