1

在处理 (2) 中,我目前正在创建一个类似 UML 风格的 Java 类图。类、接口等被表示为使用处理rect()方法创建的矩形。为每个要显示的矩形创建一个类,存储有关它的信息,并使用display()绘制矩形的方法。

为了实现放大和缩小此图表(以方便非常大或非常小的项目),我添加了代码,scale每次鼠标滚轮滚入和滚出时都会更改一个变量。scale()然后,每次绘制类矩形等时,代码都会使用 Processing 的方法。

我还试图检测这些矩形之一何时被鼠标悬停。目前,这是在表示矩形的类中使用以下代码完成的:

//Checks to see if a mouse X and Y (posX and posY) position is inside the rectangle.        
public boolean positionCollides(int posX, int posY) {
        boolean xCollides = false, yCollides = false;

        if((centreX + (width/2) >= posX) && (centreX - (width/2) <= posX)){
            xCollides = true;
        }

        if((centreY + (height/2) >= posY) && (centreY - (height/2) <= posY)){
        yCollides = true;
        }

        if(xCollides && yCollides){
            return true;
        }
        else{
            return false;
        }

    }

在哪里mouseX并被mouseY输入该方法。请注意此代码中的centreXcentreY是第一次创建矩形时包含(ed)矩形中心坐标的变量。

但是,当我放大并将缩放应用于矩形的display()方法时,鼠标悬停会中断 - 大概是因为这些东西显示在稍微不同的 X 和 Y 坐标上,并且它仍在检查旧的坐标。

有没有办法可以改变我的上述positionCollides方法来帮助它处理缩放的结果?我怎样才能得到这个排序?

我试图通过将调用positionCollides后的代码放在scale()显示方法中(试图使 mouseX 和 mouseY 值也进行缩放),并将 mouseX 和 mouseY 乘以比例(即 0.9, 1.1) 尝试使它们达到正确的值。

也许有一种方法可以动态改变对象的 centerX 和 centerY?

感谢您阅读我的文字墙。

tl;dr - 如何检测鼠标指针是否在处理中缩放的形状/矩形内?

4

1 回答 1

2

在这里,试试这个:

(在处理 1.5 中测试)

int x, y, sz;
float factor = 0.87;//any value here
float transx = 50;//any value here
float transy = 25;//any value here
void setup()
{
  size(400, 400);
  x=100;
  y=100;
  sz=50;
}


void draw()
{

  noFill();
  //draw at original positon, no fill
  rect(x, y, sz, sz);
  scale(factor);
  translate(transx, transy);
  fill(255);
  //draw after scalling and positioning filled this is tested for insidness
  rect(x, y, sz, sz);
  if ( mouseX / factor - transx > x    && 
       mouseX / factor - transx < x+sz && 
       mouseY / factor - transy > y    && 
       mouseY / factor - transy < y+sz)
  {
    println("i'm inside!!!");
  }
  else
  {
    println("i'm outside");
  }

}

于 2012-11-12T13:14:15.380 回答