在数组内部使用循环时节点不相交?
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()
。
查看结果:
我的问题是无论我点击哪里都会出现一个节点,第二次点击会出现另一个带有连接边的节点...所以我希望当我点击任何位置时,该节点应该在最近的网格交点处生成.我尝试使用循环。 我正在尝试在没有 "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()
。
查看结果: