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

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

int n_partition=10;
int length = 101;
PVector[] position = new PVector[length];
int BallNum;

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

void draw() {
    fill(255);
    grid();
    fill(0);
}

void mousePressed(){
    stroke(0);
    BallNum++;
    position[BallNum]= new PVector(mouseX, mouseY);
    circle(position[BallNum].x, position[BallNum].y, 10);
    if (BallNum > 1) {
        line(position[BallNum].x,position[BallNum].y,position[BallNum- 
        1].x,position[BallNum-1].y);
        line(position[1].x,position[1].y,position[BallNum].x,position[BallNum] .y);
    }
    for (int i = 0; i < position[BallNum].length; ++ i) {
        position[BallNum]  = position[BallNum].get(i);
        position[BallNum]  = position[BallNum].get((i+1) % position[BallNum].length);
        line(position[BallNum].x, position[BallNum].y, 
        position[BallNum].x, position[BallNum].y);   
    }
}

Я ожидаю, что УДЕЛ ДОЛЖЕН ПОЙТИ В САМЫЙ БЛИЖАЙШИЙ ПЕРЕКЛЮЧЕНИЕ.

1 Ответ

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

Вы должны рассчитать ближайшую позицию мыши к точке на сетке. Для этого вы должны знать ширину (tile_width) и высоту (tile_height) ячейки. Индекс ячейки можно рассчитать путем деления позиции мыши на размер плитки и round() результата на целое значение (например, round(mouseX / (float)tile_width)).
Не рисоватьчто-нибудь в mousePressed обратном вызове. Единственное, что вам нужно сделать, это добавить пинту в список:

void mousePressed(){
    int tile_width  = width / n_partition;  // adapt this for your needs 
    int tile_height = height / n_partition;

    int x = round(mouseX / (float)tile_width) * tile_width;
    int y = round(mouseY / (float)tile_height) * tile_height;
    position[BallNum]= new PVector(x, y);
    BallNum++;
}

Все рисование должно быть выполнено в draw(). Нарисуйте линии и точки в отдельных циклах:

void draw() {
    background(255);
    grid();

    // draw the lines in a loop 
    strokeWeight(3);
    stroke(0, 0, 255);
    for (int i = 0; i < BallNum; ++ i) {
        int i2 = (i+1) % BallNum;
        line(position[i].x, position[i].y, position[i2].x, position[i2].y); 
    }

    // draw balls in a loop
    strokeWeight(1);
    stroke(0, 0, 0);
    fill (255, 0, 0);
    for (int i = 0; i < BallNum; ++i) {
        circle(position[i].x, position[i].y, 10);
    }
} 

Обратите внимание, что сцена последовательно перерисовывается в каждом кадре. Перед отрисовкой сцены все окно должно быть «очищено» на background().

См. Результат:

...