在数组内部使用循环时节点不相交?

node's are not intersection while using loops inside of an array?

我的问题是无论我点击哪里都会出现一个节点,第二次点击会出现另一个带有连接边的节点...所以我希望当我点击任何位置时,该节点应该在最近的网格交点处生成.我尝试使用循环。 我正在尝试在没有 "class"

的情况下做到这一点
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);   
    }
}

我希望节点应该到达最近的交叉点。

您必须计算出鼠标离网格上的点最近的位置。为此,您必须知道单元格的宽度 (tile_width) 和高度 (tile_height)。 单元格的索引可以通过将鼠标位置除以图块的大小并将结果 round() 计算为整数值(例如 round(mouseX / (float)tile_width))。
不要在 mousePressed 回调中画任何东西。您唯一要做的就是在列表中添加 pint:

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

请注意,场景会在每一帧中连续重绘。在绘制场景之前,整个 window 必须是 "cleared" 乘以 background()

查看结果: