0

我想在我的项目中实现这个关于拖动框的草图。

而不是一个盒子,我有几个圆圈,每个圆圈都用不同的坐标绘制在表格中

  ellipse(lemma23.x, lemma23.y, diameterLemma23, diameterLemma23);

  ellipse(law3.x, law3.y, diameterLaw3, diameterLaw3);

  ellipse(law2.x, law2.y, diameterLaw2, diameterLaw2);

如何测试光标是否在其中一个圆圈上?

这是我的项目的屏幕截图:

在此处输入图像描述

我想测试光标何时在(或附近)一个圆圈,以便我可以通过拖动来改变它的位置。

整个草图都在 pastebin 中

4

2 回答 2

1

我从您问题中的示例开始。绘制多个形状有几个主要区别:

  1. 您必须检查光标是否在每个形状内。
  2. 您必须绘制每个形状。
  3. 你可能想担心重叠,但我没有。

在下面的代码中,我直接建立在示例的基础上,尽管我删除了几行在单击时会改变框的颜色,并将代码重新组织到MovingEllipse类中,以便可以轻松地绘制多个椭圆。(这段代码画了两个椭圆。)

请注意,代码draw()检查每个椭圆的鼠标位置,但是,我想这可以改进(即,可能通过创建一个椭圆位置数组并循环遍历该数组)。此外,为了使此代码正常工作,mousePressed需要mouseReleased像方法一样复制mouseDragged方法。(我试图让我的例子简短。)

无论如何,这是绘制多个椭圆并检测应该移动哪个椭圆的一种方法。希望能帮助到你!

int esize = 75;

MovingEllipse e1 = new MovingEllipse(0.0, 0.0, esize, 0.0, 0.0);
MovingEllipse e2 = new MovingEllipse(0.0, 0.0, esize, 0.0, 0.0);

void setup() 
{
  size(640, 360);
  e1.eX = width/2.0;    // Center of ellipse 1.
  e1.eY = height/2.0;

  e2.eX = width/4.0;    // Center of ellipse 2.
  e2.eY = height/4.0;
}

void draw() 
{ 
  background(0);

  // Test if the cursor is over the ellipse. 
  if (mouseX > e1.eX-esize && mouseX < e1.eX+esize && 
      mouseY > e1.eY-esize && mouseY < e1.eY+esize) {
    e1.overBox = true;  
    e2.overBox = false;
  } else if (mouseX > e2.eX-esize && mouseX < e2.eX+esize && 
      mouseY > e2.eY-esize && mouseY < e2.eY+esize) {
    e2.overBox = true;
    e1.overBox = false;
  } else {
    e1.overBox = false;
    e2.overBox = false;
  }

  // Draw the ellipse(s).
  e1.update(e1.eX, e1.eY, e1.overBox);
  e2.update(e2.eX, e2.eY, e2.overBox);
}

void mouseDragged() {
  e1.mouseDragged();
  e2.mouseDragged();
}
// Don't forget to repeat this for mousePressed and mouseReleased!
// ...

class MovingEllipse {
  float eX, eY;             // Position of ellipse.
  int eSize;                // Radius. For a circle use eSize for both x and y radii.
  float xOffset, yOffset;   // Where user clicked minus center of ellipse. 
  boolean locked, overBox;  // Flags used for determining if the ellipse should move.

  MovingEllipse (float ex, float ey, int esize, float xoff, float yoff) {
    eX = ex;
    eY = ey;
    eSize = esize;
    xOffset = xoff;
    yOffset = yoff;
  }

  void update(float ex, float ey, boolean over) {
    eX = ex;
    eY = ey;
    overBox = over;
    // Draw the ellipse. By default, (eX, eY) represents the center of the ellipse.
    ellipse(eX, eY, eSize, eSize);
  }

  void mousePressed() {
    if(overBox) { 
      locked = true; 
    } else {
      locked = false;
    }
    xOffset = mouseX-eX; 
    yOffset = mouseY-eY; 
  } 
  void mouseDragged() {
    if(locked) {
      eX = mouseX-xOffset; 
      eY = mouseY-yOffset; 
    } 
  }
  void mouseReleased(){
    locked = false;
  }
}
于 2012-12-24T05:45:26.847 回答
0

只需检查光标与圆心之间的距离是否在命中半径内。可以使命中半径大于圆的半径以捕捉附近的命中。

于 2012-12-23T13:47:05.280 回答