#javascript #processing #p5.js
#javascript #обработка #p5.js
Вопрос:
Я хочу создать функцию, вращающуюся так, чтобы мой треугольник мог поворачиваться сам по себе, как колесо, но у меня возник конфликт с частью моего кода, которая перемещает мой треугольник, и я безуспешно пробовал много решений, может быть, если у кого-то из вас есть подсказка, это будет здорово!
Это мой код:
let triangle1;
let triangle2;
let triangle3;
let triangle4;
let triangle5;
let triangle6;
let speedX;
let speedY;
let startColor;
let endColor;
let amt = 0;
function setup() {
startColor = color("hsl(144, 100%, 61%)");
endColor = color("hsl(0,77%,36%)");
createCanvas(windowWidth, 800);
//creer notre triangle
triangle1 = new Triangles(200, 100, 0, 4);
/* triangle2 = new Triangles(100, 50, 2, 0);
triangle3 = new Triangles(50, 200, -1, 4);
triangle4 = new Triangles(250, 400, 4, 4);
triangle5 = new Triangles(150, 500, 0, 2);
triangle6 = new Triangles(350, 500, -4, 2);*/
}
function draw() {
colorMode(RGB);
background(252, 238, 10);
triangle1.show();
triangle1.move();
/* triangle2.show();
triangle2.move();
triangle3.show();
triangle3.move();
triangle4.show();
triangle4.move();
triangle5.show();
triangle5.move();
triangle6.move();
triangle6.show();*/
}
class Triangles {
//configuration de l'objet
constructor(triX, triY, speedX, speedY) {
this.x = triX;
this.y = triY;
this.speedX = speedX;
this.speedY = speedY;
}
show() {
if (amt >= 1) {
amt = 0;
let tmpColor = startColor;
startColor = endColor;
endColor = tmpColor;
}
amt = 0.03;
let colorTransition = lerpColor(startColor, endColor, amt);
noStroke();
fill(colorTransition);
triangle(this.x, this.y, this.x 25, this.y 40, this.x - 25, this.y 40);
}
move() {
this.x = this.speedX;
this.y = this.speedY;
if (this.x > width || this.x < 0) {
this.speedX *= -1;
}
if (this.x 25 > width || this.x 25 < 0) {
this.speedX *= -1;
}
if (this.x - 25 > width || this.x - 25 < 0) {
this.speedX *= -1;
}
if (this.y > height || this.y < 0) {
this.speedY = this.speedY * -1;
}
if (this.y 40 > height || this.y 40 < 0) {
this.speedY = this.speedY * -1;
}
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.1.9/p5.min.js"></script>
Ответ №1:
Используйте преобразования матрицы для поворота, масштабирования и преобразования фигуры. Операции rotate
scale
и translate
определяют новую матрицу преобразования и умножают текущую матрицу на новую матрицу.
Если вы хотите преобразовать одну фигуру (треугольник), вам нужно сохранить текущую матрицу перед преобразованием с push
помощью и восстановить матрицу после преобразования с pop
помощью .
push();
// [...] scale, rotate, translate
// [...] draw shape
pop();
Если вы хотите повернуть фигуру вокруг локальной точки поворота, вам нужно нарисовать фигуру вокруг (0, 0) . Поверните фигуру и переместите повернутую фигуру в ее целевое положение:
shapeTrasformation = translate * rotate * scale
Локальное вращение равностороннего треугольника:
push()
translate(this.x, this.y, this.z);
rotate(this.angle)
scale(30);
triangle(-0.866, 0.5, 0.866, 0.5, 0, -1);
pop();
this.angle = 0.01;
let triangle1;
let speedX;
let speedY;
let startColor;
let endColor;
let amt = 0;
function setup() {
startColor = color("hsl(144, 100%, 61%)");
endColor = color("hsl(0,77%,36%)");
createCanvas(windowWidth, windowHeight);
//creer notre triangle
triangle1 = new Triangles(200, 100, 0, 4);
}
function draw() {
colorMode(RGB);
background(252, 238, 10);
triangle1.show();
triangle1.move();
}
class Triangles {
//configuration de l'objet
constructor(triX, triY, speedX, speedY) {
this.x = triX;
this.y = triY;
this.speedX = speedX;
this.speedY = speedY;
this.angle = 0;
}
show() {
if (amt >= 1) {
amt = 0;
let tmpColor = startColor;
startColor = endColor;
endColor = tmpColor;
}
amt = 0.03;
let colorTransition = lerpColor(startColor, endColor, amt);
noStroke();
fill(colorTransition);
push()
translate(this.x, this.y, this.z);
rotate(this.angle)
scale(30);
triangle(-0.866, 0.5, 0.866, 0.5, 0, -1);
pop();
this.angle = 0.01;
}
move() {
this.x = this.speedX;
this.y = this.speedY;
if (this.x > width || this.x < 0) {
this.speedX *= -1;
}
if (this.x 25 > width || this.x 25 < 0) {
this.speedX *= -1;
}
if (this.x - 25 > width || this.x - 25 < 0) {
this.speedX *= -1;
}
if (this.y > height || this.y < 0) {
this.speedY = this.speedY * -1;
}
if (this.y 40 > height || this.y 40 < 0) {
this.speedY = this.speedY * -1;
}
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.1.9/p5.min.js"></script>
Комментарии:
1. Хорошо, спасибо за помощь! Я попробовал перевести и повернуть, но я не понял полезности push() и pop ()! Также поместить позицию в translate — хорошая идея, и я так не думал .. Так что большое вам спасибо за ваше время, я лучше понимаю! 🙂
2. @QuentinSerda
push
помещает матрицу в стек иpop
помещает ее. Перейдите по ссылкам, чтобы получить более подробную информацию. Спасибо. Пожалуйста.