平移后的旋转坐标
Rotating coordinates after Translate
有没有真正旋转坐标系的方法?
我希望能够不断地说 x=x+1 但是使用平移让圆以不同的角度移动,类似于 Turtle Graphics,并且根本不想使用 Y 轴。
我试过旋转功能,但它只会旋转物体而不是物体移动的方向,除非我做错了什么?而且我还不熟悉矢量,只是还没有舒适地使用它们。
提前致谢。
将 rotate()
函数想象成旋转相机。它确实会旋转坐标系,只是不是您所说的那样。
事实上,我认为 Turtle Graphics 根本不旋转坐标系,它旋转了 Turtle。您可以通过跟踪一些变量并自己进行旋转和绘图来做到这一点:
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;
}
或者您可以使用 class:
封装它
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;
}
}
这只是一个基本示例,但希望它能说明我在说什么。您可以添加此 class 以使其更漂亮,您甚至可以将其作为库导入,例如,如果您使用它来教学生并希望隐藏 class 的详细信息他们。
但我会退后一步,问你为什么要使用这种东西。如果您只是随便玩玩,那很好,但您也可以考虑尝试 "think in Processing" 多一点。 Processing 使用绝对坐标系而不是相对的 Turtle(或笔),并且它的所有功能在设计时都考虑到了这一点。试图将不同的思维方式强加于那种方式会破坏目的,恕我直言。
但是就像我说的,如果您这样做只是为了玩耍,那很好!
有没有真正旋转坐标系的方法?
我希望能够不断地说 x=x+1 但是使用平移让圆以不同的角度移动,类似于 Turtle Graphics,并且根本不想使用 Y 轴。
我试过旋转功能,但它只会旋转物体而不是物体移动的方向,除非我做错了什么?而且我还不熟悉矢量,只是还没有舒适地使用它们。
提前致谢。
将 rotate()
函数想象成旋转相机。它确实会旋转坐标系,只是不是您所说的那样。
事实上,我认为 Turtle Graphics 根本不旋转坐标系,它旋转了 Turtle。您可以通过跟踪一些变量并自己进行旋转和绘图来做到这一点:
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;
}
或者您可以使用 class:
封装它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;
}
}
这只是一个基本示例,但希望它能说明我在说什么。您可以添加此 class 以使其更漂亮,您甚至可以将其作为库导入,例如,如果您使用它来教学生并希望隐藏 class 的详细信息他们。
但我会退后一步,问你为什么要使用这种东西。如果您只是随便玩玩,那很好,但您也可以考虑尝试 "think in Processing" 多一点。 Processing 使用绝对坐标系而不是相对的 Turtle(或笔),并且它的所有功能在设计时都考虑到了这一点。试图将不同的思维方式强加于那种方式会破坏目的,恕我直言。
但是就像我说的,如果您这样做只是为了玩耍,那很好!