【问题标题】:Beginner PROCESSING question about scan line and convex polygons?关于扫描线和凸多边形的初学者处理问题?
【发布时间】: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


【解决方案1】:

您应该考虑如何使用line() 和/或fill() 执行此操作,然后考虑如何为line()fill() 创建自己的函数。

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

int count = 0;
PVector[] vertices = new PVector[1000];

void mouseClicked() {
  vertices[count] = new PVector(mouseX, mouseY);
  count++;
}

需要记住的一些格式:在大多数(几乎所有)情况下,您不需要在闭合大括号后使用分号。只要大括号中有分号,后面就不需要了。

【讨论】:

    【解决方案2】:

    如果你要使用 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);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-12
      • 2018-01-08
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      相关资源
      最近更新 更多