我正在尝试制作一个程序,其中网格中的线像磁铁一样指向鼠标。我是Processing的初学者,有人可以为我提供有关如何执行此操作的教程,也可以给我一些代码并解释其作用吗?
int x1 = 0;
int x2 = 0;
int y1 = 0;
int y2 = 0;
void setup() {
size(200, 200);
}
void draw() {
background(255, 255, 0);
x1 = (mouseX + 100) / 2;
y1 = (mouseY + 100) / 2;
x2 = -1 * x1 + 200;
y2 = -1 * y1 + 200;
line(x1, y1, x2, y2);
}
最佳答案
这个项目有很多解决方案。最简单的方法之一是使用Processing的PVector
class。
PVector
类可用于二维或三维矢量。向量是具有大小和方向的实体。但是,PVector
类存储矢量的分量(对于2D,x,y,对于3D,x,y,z)。幅度和方向是根据组件计算的,可以通过方法mag()
和heading()
访问。
通过x
和y
组件定义了Processing中的二维矢量:
PVector v = new PVector(xComponent, yComponent);
通过一些数学公式,您可以使用x分量和y分量确定幅度和方向。但是我们不需要确定这些。
下面,我附上了完整的解决方案代码。大多数内容对您来说都有意义。但是值得理解
PVector
的情况。for
中的嵌套void draw()
循环包含表示每个网格顶点坐标的x
和y
变量。我们首先将
PVector v
定义为由mouseX - x
的x分量或鼠标的x位置与每个网格点之间的差给出的向量。类似地,mouseY - y
给出的y分量具有相同的差异。创建从
PVector u
初始化的变量v.setMag(15)
会保存一个PVector
,其方向与v
相同,但长度仅为15。现在画线。向量表示偏移量,而不是位置(在这种情况下为位置),因此从网格点到网格点的偏移量绘制直线是关键。
因此,
line(x, y, x + u.x, y + u.y)
,其中u.x
和u.y
是向量u
的x和y分量。void setup() {
size(600, 600); // Set the size of the canvas to 600x600.
}
void draw() {
background(255);
stroke(200); // Set the stroke color to black
int distVertLine = width / 10; // This variable defines the distance between each subsequent vertical line.
for(int i = 0; i < width; i += distVertLine) {
line(i, 0, i, height); // Draw a line at x=i starting at the top of the canvas (y=0) and going to the bottom (y=height)
}
int distHorizLine = height / 10; // This variable defines the distance between each subsequent vertical line.
for(int i = 0; i < width; i += distHorizLine) {
line(0, i, width, i); // Draw a line at y=i starting at the left of the canvas (x=0) and going to the right (x=width)
}
stroke(0); // Set the stroke to black.
// Use a nested for loop to iterate through all grid vertices.
for(int x = 0; x <= width; x += width/10) {
for(int y = 0; y <= height; y += height/10) {
PVector v = new PVector(mouseX - x, mouseY - y); // Define a vector that points in the direction of the mouse from each grid point.
PVector u = v.setMag(15); // Make the vector have a length of 15 units.
line(x, y, x + u.x, y + u.y); // Draw a line from the grid vertex to the terminal point given by the vector.
}
}
}