2016-11-03 4 views
2

Есть ли способ фактически повернуть систему координат?Вращающиеся координаты после перевода

Я хочу иметь возможность постоянно говорить x = x + 1, но кругом перемещаться под разными углами, используя перевод, аналогичный черепаховой графике, и вообще не хотите использовать ось Y.

Я пробовал функцию поворота, но только вращает объект, а не направление его перемещения, если им не делать что-то неправильно? и я не знаком с векторами, но пока с ними комфортно работать.

Заранее спасибо.

ответ

2

Подумайте о функции rotate() как о повороте камеры. Он вращает систему координат, просто не так, как вы говорите.

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

float turtleX; 
float turtleY; 
float turtleHeading = 0; 

void setup() { 
    size(500, 500); 
    turtleX = width/3; 
    turtleY = height/4; 
} 

void draw() { 

    forward(100); 
    rotateTurtle(45); 
    forward(100); 
    rotateTurtle(45); 
    forward(100); 
    rotateTurtle(45); 
    forward(100); 
    rotateTurtle(45); 
    forward(100); 
    rotateTurtle(45); 
    forward(100); 
    rotateTurtle(45); 
    forward(100); 
    rotateTurtle(45); 
    forward(100); 

    noLoop(); 
} 

void forward(float amount) { 
    float newX = turtleX + cos(radians(turtleHeading)) * amount; 
    float newY = turtleY + sin(radians(turtleHeading)) * amount; 

    line(turtleX, turtleY, newX, newY); 
    ellipse(newX, newY, 10, 10); 
    turtleX = newX; 
    turtleY = newY; 
} 

void rotateTurtle(float degrees) { 
    turtleHeading += degrees; 
} 

Или вы можете инкапсулировать, что с помощью класса:

Turtle turtle; 

void setup() { 
    size(500, 500); 
    turtle = new Turtle(width/3, height/4); 
} 

void draw() { 

    turtle.forward(100); 
    turtle.rotate(45); 
    turtle.forward(100); 
    turtle.rotate(45); 
    turtle.forward(100); 
    turtle.rotate(45); 
    turtle.forward(100); 
    turtle.rotate(45); 
    turtle.forward(100); 
    turtle.rotate(45); 
    turtle.forward(100); 
    turtle.rotate(45); 
    turtle.forward(100); 
    turtle.rotate(45); 
    turtle.forward(100); 


    noLoop(); 
} 

class Turtle { 

    float x; 
    float y; 
    float heading = 0; 

    public Turtle(float x, float y) { 
    this.x = x; 
    this.y = y; 
    } 

    void forward(float amount) { 
    float newX = x + cos(radians(heading)) * amount; 
    float newY = y + sin(radians(heading)) * amount; 

    line(x, y, newX, newY); 
    ellipse(newX, newY, 10, 10); 
    x = newX; 
    y = newY; 
    } 

    void rotate(float degrees) { 
    heading += degrees; 
    } 
} 

turtle

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

Но я хотел бы сделать шаг назад и спросить вас, почему вы хотите использовать этот тип вещей. Если вы просто играете, тогда это круто, но вы также можете подумать о попытке «подумать в обработке» немного больше. Обработка использует абсолютную систему координат вместо относительной черепахи (или пера), и все ее функции разработаны с учетом этого. Пытаясь заставить другой стиль мышления на этот сорт победить цель, имхо.

Но, как я уже сказал, если вы просто делаете это, чтобы играть, тогда это круто!

+0

Большое спасибо, я спросил, потому что Ive только использовал обработку в течение нескольких недель и пришел из лет опыта черепахи, я не имел в виду, что черепаха повернула координаты, которые я только после основной идеи, чтобы заставить ее работать аналогичным образом, чтобы я мог перенести некоторые из проектов, которые Ive сделал для обработки намного проще, я думаю, что это займет довольно много времени, чтобы попасть в пространство обработки, но это дает мне представление о том, как обойти это. – PyNuts

+1

@PyNuts Понял. Я отредактировал свой ответ, чтобы включить более простой пример, который не требует класса. –

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