如何解决关于扫描线和凸多边形的初学者处理问题?
我是处理新手,我需要有关此算法的一些帮助。 我无法使用 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,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,y2);
};
};
void sectiondraw(int xA,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;
};
};
它就像地狱一样。我最大的问题是我必须用多条线绘制多边形。
解决方法
您应该考虑如何使用 line()
和/或 fill()
执行此操作,然后考虑如何为 line()
和 fill()
创建您自己的函数。
这里有一个提示:使用一个数组来保存您目前点击的点。一种方法是这样的:
int count = 0;
PVector[] vertices = new PVector[1000];
void mouseClicked() {
vertices[count] = new PVector(mouseX,mouseY);
count++;
}
要记住的一些格式:在大多数(几乎所有)情况下,在闭合的大括号后不需要分号。只要大括号内有分号,后面就不需要分号了。
,如果你要使用 line() 函数,你可以像这样:
//Create a list of all the clicked locations
ArrayList<PVector> clicked = new ArrayList<PVector>();
void setup(){
size(640,480);
}
void draw(){
if(clicked.size() > 1){
for (int i = 1; i < clicked.size(); i++) {
//Draw a line between each clicked point
line(clicked.get(i).x,clicked.get(i).y,clicked.get(i-1).x,clicked.get(i-1).y);
}
}
}
void mousePressed(){
//Add new mouse presses to the list
clicked.add(new PVector(mouseX,mouseY));
}
否则不使用 line() 函数,您可以创建自己的
void newLine(float x1,float y1,float x2,float y2){
float d = dist(x1,y1,x2,y2);
float m1 = (y2-y1)/d;
float m2 = (x2-x1)/d;
for (int i = 0; i < d; i++){
point(x1+i*m2,y1+i*m1);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。