Увеличить, где указывает мышь - PullRequest
2 голосов
/ 16 марта 2020

Я пишу симуляцию солнечной системы, и мне нужно иметь возможность увеличивать / уменьшать масштаб, куда указывает моя мышь. То, что у меня есть, - это перемещение планет и увеличение / уменьшение масштаба в точке (0, 0).

Вот мой код:

Основной класс

Planeta sun = new Planeta(color(235, 225, 52), 0, 696000, 0, 0);
Planeta mercury = new Planeta(color(166, 142, 88), 57909170, 2439, 0, 87.989);
Planeta venus = new Planeta(color(250, 193, 50), 108208926, 6052, 0, 224.701);

color stroke = color(70, 70, 70, 70);

int sx, sy;
int centerX, centerY;
static float m1 = 1000;
public static float magn = 1/m1;

void setup() {
  fullScreen();
  background(0);
  sx = width/2;
  sy = height/2;
  ellipseMode(RADIUS);
  stroke(stroke);
  strokeWeight(3);
  centerX = width/2;
  centerY = height/2;
}

void draw() {
  magn = 1/m1;
  background(0);
  translate(sx, sy);

  sun.drawOrbit();
  sun.drawPlanet();

  mercury.drawOrbit();    
  mercury.drawPlanet();

  venus.drawOrbit();
  venus.drawPlanet();


  if(mousePressed) {
    float wx = mouseX - pmouseX;
    float wy = mouseY - pmouseY;

    sx += wx;
    sy += wy; 
  }
}

void mouseWheel(MouseEvent event) {
  float e = float(event.getCount())*m1/3;
  if(m1+e > 0.2) {
    m1 += e;
  }
}

Второй класс

class Planeta {
  color c;
  float distance;
  float radius;
  float angle;
  float orbit_time;

  Planeta(color kolor, float dystans, float promien, float kat, float czas) {
    this.c = kolor;
    this.distance = dystans/100;
    this.radius = promien/100;
    this.angle = kat;
    this.orbit_time = czas;
  }

  public PVector getPos() {
    float x = this.distance*sin(this.angle);
    float y = this.distance*cos(this.angle);
    return new PVector(x, y);
  }


  public void drawOrbit() {
    noFill();
    circle(0, 0, this.distance*magn);
  }

  public void drawPlanet() {
    fill(this.c);
    PVector pos = getPos();
    circle(pos.x*magn, pos.y*magn, this.radius*magn);
  }
}

sx и sy для translate, centerX и centerY - постоянные, magn и m1 - для масштабирования.

Таким образом, движущиеся планеты работают как шарм, но я не знаю, как увеличить / уменьшить масштаб, где находится моя мышь. Я искал в Google код, у меня ничего не получалось.

Я ценю любую помощь.

1 Ответ

2 голосов
/ 16 марта 2020

Я рекомендую использовать переменные с плавающей запятой для перевода, чтобы повысить точность:

float sx, sy;

Вы должны изменить перевод, в зависимости от изменения масштабного коэффициента.
Вычислить относительное изменение коэффициента масштабирования:

float fromM = m1;
float toM = m1 + e;
float scaleRel = fromM / toM;

Вычислить расстояние от курсора мыши до текущего перевода:

float dx = mouseX - sx;
float dy = mouseY - sy;

Изменить перевод, зависящий от расстояния курсора мыши до текущий перевод (dx, dy) и дельта относительной шкалы (1 - scaleRel):

sx += dx * (1.0-scaleRel);
sy += dy * (1.0-scaleRel);

например:

void mouseWheel(MouseEvent event) {
    float e = float(event.getCount())*m1/3;
    if(m1+e > 0.2) {
        float fromM = m1;
        float toM = m1 + e;
        float scaleRel = fromM / toM;
        float dx = mouseX - sx;
        float dy = mouseY - sy;
        sx += dx * (1.0-scaleRel);
        sy += dy * (1.0-scaleRel);
        m1 = toM;
    }
}
...