не могу понять, используя циклы внутри массива - PullRequest
1 голос
/ 01 ноября 2019

В моей домашней работе есть термин, согласно которому между 2 узлами на экране должны оставаться узлы от предыдущих щелчков, и должны быть линии, соединяющие каждый узел со следующим (и последний соединяется с первым узлом). Не должно быть никаких других линий, кроме этих (и, конечно, линий сетки). Я пытался сделать это с помощью цикла внутри массива. Но это не тот ответ, который я ищу ....

int [] a;
int [] b;
ArrayList<Point> points = new ArrayList<Point>();

class Point {
    int x, y, r;

    Point(int x, int y, int r) {
        this.x = x;
        this.y = y;
        this.r = r;
    }

    void Draw() {
        circle(this.x, this.y, this.r*2);
    }
}

int n_part=10;
void setup(){
    size(600,360);

    a = new int [100];
    b = new int [100];
}

void draw () {

    background (255);

    int gridW = width/n_part;
    int gridH = height/n_part;

    stroke(210);
    noFill();
    for (int row = 0; row < n_part; row++){ 
        int gridY = 0 + row*gridH;
        for (int col = 0; col < n_part; col++) {
            int gridX = 0+ col* gridW;
            rect (gridX, gridY, gridW, gridH);   
        }
    }

    stroke(0, 0, 0);
    fill(0);
    for (int i = 0; i < points.size(); ++ i) {
        Point p = points.get(i);
        p.Draw();
    }
}

void mousePressed() {
    int gridW = width/n_part;
    int gridH = height/n_part;

    int x = round(mouseX / (float)gridW) * gridW;
    int y = round(mouseY / (float)gridH) * gridH;

    points.add(new Point(x, y, 5));
    {
    for (int j=0; j < a.length; j++) 
        a [j] = (mouseX / (int)gridW) * gridW;
    for (int k=0; k < b.length; k++) 
        b [k] = height;
    }
}

void mouseReleased(){
    for (int k=0; k < a.length; k++) 
        line (0, 0, a [k], b [k]);
}

1 Ответ

0 голосов
/ 01 ноября 2019

Все, что вам нужно сделать, это провести линии между последовательными точками.

Следующий индекс точки i равен i+1. Для последней точки это 0. Это может быть достигнуто оператором по модулю (%) (h (i+1) % points.size()).

Получите 2 последовательные точки в цикле и проведите линию между ними:

for (int i = 0; i < points.size(); ++ i) {
    Point p1 = points.get(i);
    Point p2 = points.get((i+1) % points.size());
    line(p1.x, p1.y, p2.x, p2.y);   
}

См. Пример:

void draw () {

    background (255);

    int gridW = width/n_part;
    int gridH = height/n_part;

    strokeWeight(1);
    stroke(210);
    noFill();
    for (int row = 0; row < n_part; row++){ 
        int gridY = 0 + row*gridH;
        for (int col = 0; col < n_part; col++) {
            int gridX = 0+ col* gridW;
            rect (gridX, gridY, gridW, gridH);   
        }
    }

    stroke(0, 0, 0);
    fill(0);
    for (int i = 0; i < points.size(); ++ i) {
        Point p = points.get(i);
        p.Draw();
    }

    strokeWeight(3);
    stroke(255, 0, 0);
    for (int i = 0; i < points.size(); ++ i) {
        Point p1 = points.get(i);
        Point p2 = points.get((i+1) % points.size());
        line(p1.x, p1.y, p2.x, p2.y);   
    }
}
...