我试图在线条this的帮助下创建一个平滑的绘图工具。 我完成了基础知识,但我的代码有几个问题。
这是我正在处理的草图的代码:
Spring2D s1;
float gravity = 0;
float mass = 4.0;
void setup() {
frameRate(60);
size(640, 360);
fill(255, 126);
// Inputs: x, y, mass, gravity
s1 = new Spring2D(0.0, width/2, mass, gravity);
}
void draw() {
s1.display(mouseX, mouseY);
s1.update(mouseX, mouseY);
}
class Spring2D {
float vx, vy; // The x- and y-axis velocities
float x, y; // The x- and y-coordinates
float gravity;
float mass;
float radius = 10;
float stiffness = 0.7;
float damping = 0.5;
Spring2D(float xpos, float ypos, float m, float g) {
x = xpos;
y = ypos;
mass = m;
gravity = g;
}
void update(float targetX, float targetY) {
float forceX = (targetX - x) * stiffness;
float ax = forceX / mass;
vx = damping * (vx + ax);
x += vx;
float forceY = (targetY - y) * stiffness;
forceY += gravity;
float ay = forceY / mass;
vy = damping * (vy + ay);
y += vy;
}
void display(float nx, float ny) {
if (mousePressed == true) {
background(0);
stroke(40, 255, 150);
line(x, y, nx, ny);
noStroke();
fill(255, 130, 40);
ellipse(x, y, 5, 5);
} else {
background(0);
}
}
}
我使用绿色绳子(线条)作为指导,这样它就能产生弹性摩擦力以平滑地绘制。它仅在单击画布时出现,并在释放鼠标时消失。我想要橙色点来绘制(x,y,nx,ny),而不是我的鼠标坐标。 (在这种情况下,不是球体,而是如建议的连续线条)。
问题是,当我没有将背景设置为某种颜色(此处为0;这是黑色)时,引导字符串(绿线和橙色点)也将自己绘制到画布上。但是,我喜欢将它们仅用作指导,作为帮助者。那么,如何在不绘制字符串的情况下根据橙色点绘制线条呢?
答案 0 :(得分:1)
即使您的帧速率非常高,您的鼠标也不会真正通过屏幕上的每个像素。它一次移动多个像素,具体取决于移动鼠标的速度。因此,在帧之间,鼠标可以从一个位置移动到另一个位置,而不会移动到这两个位置之间的每个位置。
要解决这个问题,您可以在当前位置绘制一条椭圆,而不是在前一个位置绘制线条。
在Spring2D
课程中,您必须跟踪之前的位置。你可以使用两个变量:
float previousX;
float previousY;
您需要在update()
函数中更新这些变量。
previousX = x;
previousY = y;
然后在display()
函数中,您需要使用这些变量绘制从前一点到当前点的一条线:
strokeWeight(radius*2);
line(previousX, previousY, x, y);
这样可以防止你看到的点之间的空格。
如果您有任何其他问题,请在自己的帖子中将其作为单独的问题发布。尝试将您的问题缩小到关于特定代码行的特定问题,或尽可能少的行。很难回答一般的“我该怎么做”这类问题。 Stack Overflow专为更具体的“我试过X,期望Y,但得到Z而不是”类型问题而设计。如果你想要更具体,你会有更好的运气(和更快的响应时间)。祝你好运,这似乎是一个有趣的项目。