Processing 如何放大鼠标光标下的点(处理)

Processing 如何放大鼠标光标下的点(处理),processing,Processing,我想放大草图中鼠标光标下的点。问题的规模部分非常简单;这是我搞不懂的翻译部分。其思想是能够放大到加工草图,同时保持草图中对象之间的相对距离 任何帮助都将不胜感激。放大但不保持相对距离的基本草图如下所示: float scaleFactor; void setup() { size(300, 300); scaleFactor = 1; } void draw() { background(255); fill(128); noStroke();

我想放大草图中鼠标光标下的点。问题的规模部分非常简单;这是我搞不懂的翻译部分。其思想是能够放大到加工草图,同时保持草图中对象之间的相对距离

任何帮助都将不胜感激。放大但不保持相对距离的基本草图如下所示:

float scaleFactor;
void setup()
{
    size(300, 300);
    scaleFactor = 1;
}

void draw()
{
    background(255);
    fill(128);
    noStroke();
    pushMatrix();
    scale(scaleFactor);
    rect(0, 0, 100, 100);
    popMatrix();
}

void keyPressed()
{
    if (key == 'r')
    {
        scaleFactor = 1;
    }
}

void mouseWheel(MouseEvent e)
{
    scaleFactor += e.getAmount() / 100;
}
试试这个

float scaleFactor;
float translateX;
float translateY;
void setup()
{
  size(300, 300);

  scaleFactor = 1;
}

void draw()
{
  background(255);

  fill(128);

  noStroke();

  pushMatrix();

  translate(translateX,translateY);
  scale(scaleFactor);

  rect(0, 0, 100, 100);
  rect(width-100, height-100, 100, 100);

  popMatrix();
}

void keyPressed()
{
  if (key == 'r')
  {
    scaleFactor = 1;
  }
}

void mouseWheel(MouseEvent e)
{
  translateX = translateX-e.getAmount()*(mouseX)/100;
  translateY = translateY-e.getAmount()*(mouseY)/100;
  scaleFactor += e.getAmount() / 100;
}

前面的答案不太符合要求的行为。例如,如果您想要与用户在Google Maps中滚动鼠标所期望的相同的缩放样式,我认为您需要:

float scaleFactor = 1.0;
float translateX = 0.0;
float translateY = 0.0;

void setup() {
    size(300, 300);
}

void draw() {
    background(255);
    fill(128);
    noStroke();
    pushMatrix();
    translate(translateX,translateY);
    scale(scaleFactor);
    rect(0, 0, 100, 100);
    rect(width-100, height-100, 100, 100);
    popMatrix();
}

void keyPressed() {
    if (key == 'r') {
        scaleFactor = 1;
        translateX = 0.0;
        translateY = 0.0;
    }
}

void mouseDragged(MouseEvent e) {
    translateX += mouseX - pmouseX;
    translateY += mouseY - pmouseY;
}

void mouseWheel(MouseEvent e) {
    translateX -= mouseX;
    translateY -= mouseY;
    float delta = e.getCount() > 0 ? 1.05 : e.getCount() < 0 ? 1.0/1.05 : 1.0;
    scaleFactor *= delta;
    translateX *= delta;
    translateY *= delta;
    translateX += mouseX;
    translateY += mouseY;
}
float scaleFactor=1.0;
float translateX=0.0;
浮动平移Y=0.0;
无效设置(){
大小(300300);
}
作废提款(){
背景(255);
填充(128);
仰泳();
pushMatrix();
翻译(translateX,translateY);
尺度(scaleFactor);
rect(0,0,100,100);
矩形(宽度-100,高度-100100100);
popMatrix();
}
按下void键(){
如果(键=='r'){
scaleFactor=1;
translateX=0.0;
translateY=0.0;
}
}
无效鼠标标记(鼠标事件e){
translateX+=mouseX-pmouseX;
translateY+=mouseY-pmouseY;
}
无效鼠标滚轮(鼠标事件e){
translateX-=mouseX;
translateY-=mouseY;
float delta=e.getCount()>0-1.05:e.getCount()<0-1.0/1.05:1.0;
scaleFactor*=增量;
translateX*=δ;
translateY*=δ;
translateX+=mouseX;
translateY+=mouseY;
}

实际上,这样做更流畅:

float e = -event.getCount()/100.0;
float delta = pow(2, e);
而不是:

float delta = e.getCount() > 0 ? 1.05 : e.getCount() < 0 ? 1.0/1.05 : 1.0;
float delta=e.getCount()>0?1.05:e.getCount()<0?1.0/1.05 : 1.0;

嘿,我知道这是非常古老的,但你介意添加一个简短的解释,说明它是如何工作的吗?