Processing 关于扫描线和凸多边形的初学者处理问题?

Processing 关于扫描线和凸多边形的初学者处理问题?,processing,Processing,我是一个新的处理,我需要一些帮助这个算法。 我不能使用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) {

我是一个新的处理,我需要一些帮助这个算法。 我不能使用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;

};

};
intx1,y1,x2,y2;
点击;
布尔扫描线;
无效设置(){
尺寸(640480);
单击=0;
scanlineOn=false;
};
作废提款(){
如果(单击==2){
beoszto(x1,y1,x2,y2);
单击=0;
x1=-1;
y1=-1;
x2=-1;
y2=-1;
};
if(scanlineOn==true){
扫描线();
scanlineOn=false;
};
};
无效扫描线(){
int x=1,y=1;
int xA=-1,yA=-1;
int xB=-1;
颜色a;
颜色b;
颜色c;
c=get(x,y);
而(x!=639&&y!=479){
xA=-1;
yA=-1;
xB=-1;
而(x!=639){
a=get(x,y);
b=get(x+1,y);
如果(a!=b&&xA=-1){
xA=x+1;
yA=y;
c=get(xA,yA);
}else如果(c==b&&a!=b){
xB=x+1;
};
如果(xA!=-1&&xB!=-1){
myfill(xA,yA,xB);
xA=-1;
yA=-1;
xB=-1;
};
x=x+1;
};
y=y+1;
x=1;
};
};
无效myfill(int-xA、int-yA、int-xB){
而(xA=yB){
而(xB=0){
d=d-dE;
xB=xB+1;
}否则{
d=d-dNE;
yB=yB+1;
xB=xB+1;
};
点(xB,yB);
};
}否则如果(b2>=a2&&yA=0){
d=d-dE;
xB=xB+1;
}否则{
d=d-dNE;
yB=yB-1;
xB=xB+1;
};
点(xB,yB);
};
}否则如果(b2=0){
d=d-dE;
yB=yB-1;
}否则{
d=d-dNE;
yB=yB-1;
xB=xB+1;
};
点(xB,yB);
};
}否则{
while(yB=0){
d=d-dE;
yB=yB+1;
}否则{
d=d-dNE;
yB=yB+1;
xB=xB+1;
};
点(xB,yB);
};
};
};
void mousePressed(){
如果(单击==0){
x1=鼠标;
y1=老鼠;
单击=1;
}否则{
x2=鼠标;
y2=老鼠;
点击=2;
};
};
按下void键(){
如果(键=='t'| |键=='t'){
scanlineOn=true;
};
};

这是一辆像地狱一样的马车。我最大的问题是我必须用多条线绘制多边形。

你应该考虑如何使用
line()
和/或
fill()
,然后考虑如何为
line()
fill()
创建自己的函数

这里有一个提示:使用数组保存到目前为止单击的点。一种方法是:

//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));
}
int count=0;
PVector[]顶点=新PVector[1000];
void mouseClicked(){
顶点[计数]=新的PVector(mouseX,mouseY);
计数++;
}

需要记住的一些格式:在大多数(几乎所有)情况下,闭式花括号后不需要分号。每当在花括号内有分号时,后面就不需要分号了。

如果要使用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));
}
//创建所有单击位置的列表
单击ArrayList=新建ArrayList();
无效设置(){
尺寸(640480);
}
作废提款(){
如果(单击.size()>1){
对于(int i=1;i
否则,如果不使用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);
  }
}
void换行符(浮点x1、浮点y1、浮点x2、浮点y2){
浮点数d=距离(x1,y1,x2,y2);
浮点数m1=(y2-y1)/d;
浮球m2=(x2-x1)/d;
对于(int i=0;i
请告诉我们当前行为的确切内容(错误内容)和预期内容。所提到的方法、填充和线条发生了什么变化?您是如何运行代码的?当前行为是:First click=第一点坐标。第二次单击=第二个点坐标。然后在两点之间画一条线。所以如果我想做一个三角形,我必须点击6下。预期行为:第一次单击=第一个点坐标第二次单击:=第二个点坐标它将绘制一条线。然后它将使用上一个坐标作为起始坐标。第三次单击=它将在单击2和单击3之间画一条新的线。我不明白为什么不能使用line()函数。有什么特别的原因吗?如果我理解了你想正确地做什么,他们会让这变得容易得多。