Вы должны рассчитать ближайшую позицию мыши к точке на сетке. Для этого вы должны знать ширину (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()
.
См. Результат: