2013-11-21 49 views
2

我想放大到Processing草图中鼠标光标下的点。问题的规模部分非常简单,这是我无法弄清楚的翻译部分。这个想法是能够放大Processing草图,同时保持草图中的对象之间的相对距离。如何放大到鼠标光标下的点(处理)

任何帮助将不胜感激。一个基本的素描,这放大式,但不会保持相对的距离,如下:

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; 
} 

回答

1

尝试......

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; 
} 
4

以前的答案不相当有要求的行为。例如,如果您希望使用与用户在Google地图中滚动鼠标相同的缩放样式,我认为您需要:

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; 
}