Какие типы массивов (код) будут работать для этого вопроса? - PullRequest
1 голос
/ 24 октября 2019

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

Когда я щелкаю в любом месте, узел должен генерироваться в ближайшей точке пересечения сетки.

//code for grid

int n_part=10;

void setup () {
    size (600, 360);
}

void draw () {

    background (255);

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

    stroke(210);
    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);   
        }
    }
}

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

1 Ответ

1 голос
/ 24 октября 2019

Создать класс, который может хранить точку и ее размер (радиус). Класс имеет конструктор и метод для рисования точки соответственно окружности.

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);
    }
}

Использование ArrayList объектов Point для хранения точек

ArrayList<Point> points = new ArrayList<Point>();

Используйте mousePressed() обратный вызов события, чтобы добавить новую точку в список

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));
}

Нарисуйте точки в цикле. Линии могут быть созданы путем рисования line() между последовательными точками из списка. Например:

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);   
        }
    }

    strokeWeight(3);
    stroke(0, 0, 255);
    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);   
    }

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

...