我是Processing的完全初学者,并尝试获取一行椭圆以跟随鼠标的路径,它们的边缘接触但不重叠。
我的第一个练习是使用一条线跟踪数组中的鼠标历史记录,注释掉的线也在每个索引处添加一个椭圆:
ArrayList <PVector> history;
float preX;
float preY;
void setup() {
size(1024, 1024);
history = new ArrayList <PVector> ();
}
void draw() {
background(255);
for(int i=1; i<history.size(); i++){
//ellipse(history.get(i).x, history.get(i).y, 50,50);
PVector pointA = history.get(i-1);
PVector pointB = history.get(i);
line(pointA.x, pointA.y, pointB.x, pointB.y);
}
}
void mouseDragged() {
preX= mouseX;
preY= mouseY;
history.add(new PVector(mouseX,mouseY));
}
我想我应该定义一个半径变量并使用dist()来计算当前鼠标位置和沿鼠标历史记录绘制的最后一个椭圆之间的距离,然后使用if语句仅绘制椭圆(如果该距离= = radius * 2,但是当我尝试将其转换为Processing代码时会非常卡住。任何人都可以帮我开始吗?我在其他地方寻找技巧时遇到了很多麻烦 - 即使只是向正确的方向推进也会非常感激!
答案 0 :(得分:0)
我想我应该定义一个半径变量并使用dist()来计算当前鼠标位置和沿鼠标历史记录绘制的最后一个椭圆之间的距离,然后使用if语句仅绘制椭圆(如果该距离= = radius * 2
这听起来像是一个非常好的计划。我能给你的最好建议是break your problem down into smaller pieces并一次一个地接受这些作品。
例如,您可以从基本草图开始,只是在某处显示硬编码的圆圈,然后打印出它与鼠标之间的距离吗?以此为基础。你可以这么做,所以圆圈通常是红色的,但是当鼠标离它一定距离时会变成绿色吗?现在你能做到这一点,它会变成绿色时画一个新的圆圈吗?
提示:如果你检查距离是否完全等于半径,你只需要检查一小部分位置,鼠标可能就不那么精确了。相反,您可能想要检查距离是否在半径之外。您可能会发现this collision detection tutorial很有用。
答案 1 :(得分:0)
void mouseDragged() {
if(dist(preX,preY,mouseX,mouseY)>=50){
float angle=atan2(mouseX-preX,mouseY-preY);
preX+=sin(angle)*50;
preY+=cos(angle)*50;
history.add(new PVector(preX,preY));
}
}