2014-01-12 1 views
1

Я хотел бы переместить эллипс по спирали в центр экрана - начальная точка эллипса задается через координаты x и y. Ну, я не знаю, как нажимать спираль внутрь центра (я могу добиться этого, добавив ширину/2 и высоту/2 к х, у) И В то же время начните движение по заданной картезианской (x, y) координаты. Ниже приведен код. Помогите оценить! Я пытался сделать это в обработке (Java):Двигайтесь по спирали к центру с заданными в начале координат с помощью координат

float r = 0; //radius 
float x = 700; // x of the object 
float y = 50; // y of the object 
float theta = 0; //angle 

void setup() { 
    size(800,600); 
    background(0); 
    smooth(); 

    r = sqrt(x*x+y*y); //polar coordinate - distance from x,y to 0,0 on the grid 
    theta = atan(y/x); // angle to 0,0 on the grid 

} 

void draw() { 

    fill(0,255,0); 
    rect(width/2,height/2,20,20); 

    fill(0,0,255); 
    rect(700,50,20,20); 

    float x = r * cos(theta); 
    float y = r * sin(theta); 

    // Draw an ellipse at x,y 
    noStroke(); 
    fill(255,0,0); 

    ellipse(x, y, 16, 16); 

    if (r>0){ 
    r -= 1; // Increment the radius 
    theta += 0.01; // Increment the angle 
    } 
} 

ответ

0

Вы можете перевести х, у, а затем перевести петлю дро.

Это делает так, что вы работаете с системой координат с 0,0 в центре экрана, а не в левом верхнем углу экрана.

Ваши формулы расстояний и углов используют 0,0 в качестве источника, который не является центром экрана, если вы используете систему начала координат слева (например, Обработка). Вы также можете изменить эти формулы.

Этот код является вашим, чтобы сделать 0,0 в центре экрана.

float r = 0; //radius 
float x = 100; // x of the object 
float y = 100; // y of the object 
float theta = 0; //angle 

void setup() { 
    size(800,600); 
    background(0); 
    smooth(); 
    ellipseMode(CENTER); // draw ellipses based on their center 

    // translate the x and y from top-left origin to center origin 
    x -= width/2; 
    y -= height/2; 

    r = sqrt(x*x+y*y); //polar coordinate - distance from x,y to 0,0 on the grid 
    theta = atan(y/x); // angle to 0,0 on the grid 

} 

void draw() { 
    translate(width/2, height/2); // translate the whole canvas 

    fill(0,255,0); 
    ellipse(0,0,20,20); // mark the center of the canvas 

    fill(0,0,255); 
    ellipse(x,y,20,20); // mark the start point for the circle 

    // flip the angle if left of the origin 
    int flip = 1; 
    if(x < 0) flip = -1; 

    float x = r * cos(theta) * flip; 
    float y = r * sin(theta) * flip; 

    // Draw an ellipse at x,y 
    noStroke(); 
    fill(255,0,0); 

    ellipse(x, y, 16, 16); 

    if (r>0){ 
    r -= 1; // Decrement the radius 
    theta += 0.01; // Increment the angle 
    } 

} 

Ниже код держит верхнее левое происхождение, но изменяет инициализацию радиуса и угла, чтобы быть по отношению к центру экрана.

float x = 100; // x of the object 
float y = 100; // y of the object 
float r = 0; // radius 
float theta = 0; // angle 

void setup() { 
    size(800,600); 
    background(0); 
    smooth(); 
    ellipseMode(CENTER); // draw ellipses based on their center 

    // distance between point and center of screen 
    r = dist(x,y,width/2,height/2); 

    // http://stackoverflow.com/a/7586218/1736092 
    // angle of line between point and center of screen 
    // relative to x-axis 
    float dX = x - width/2; 
    float dY = y - height/2; 
    theta = atan2(dY, dX); 

    stroke(0, 255, 0); // green stroke 
    line(x, y, width/2, height/2); // draw radius 

    noStroke(); 
    fill(0, 255, 0); // green fill 
    ellipse(width/2, height/2, 20, 20); // mark the center of the canvas 
    fill(0, 0, 255); // blue fill 
    ellipse(x, y, 20, 20); // mark the start point for the circle 
} 

void draw() { 
    float x = r * cos(theta) + width/2; 
    float y = r * sin(theta) + height/2; 

    noStroke(); 
    fill(255,0,0); // red fill 
    ellipse(x, y, 16, 16); 

    if(r>0) { 
    r -= 1; // Decrement the radius 
    theta += 0.01; // Increment the angle 
    } 
} 
+0

Просто попробуйте запустить предлагаемый код, и кажется, что его беспорядок при изменении начальной точки - скажем, x = 100, y = 100, точка маркировки имеет другое положение. Он может работать при проверке квадрантов - я постараюсь проверить это. – doku

+0

ОК Итак, мне нужно было добавить условие при рисовании эллипса, чтобы проверить, было ли первое заданное x больше половины холста. Все еще интересно, почему я не могу использовать x, чтобы проверить его и установить второй глобальный i, как float i = x; .... CODE: if (i doku

+0

Обновлено, чтобы исправить эту ошибку. Я забыл, что если вы остаетесь (отрицательным) происхождения, метод угла, который вы используете, будет переворачивать угол. Обновление демонстрирует способ проверить это и перевернуть в соответствующую точку кода без необходимости устанавливать глобальный. – spex

Смежные вопросы