Matter-js - Как получить ширину и высоту прямоугольника?
Matter-js - Как получить ширину и высоту прямоугольника?
Мне нужно знать, есть ли метод возврата расстояния, реализованный в Matter-js .
// part.vertices[0] and part.vertices[1]
Я хочу интегрировать вариант плитки. Вот как выглядит критическая часть (я использую функцию переопределения для Render.bodies, это больше всего интересует меня) .
for (let x = 0; x < this.tiles; x++) {
c.drawImage(
texture,
texture.width * -part.render.sprite.xOffset * part.render.sprite.xScale,
texture.height * -part.render.sprite.yOffset * part.render.sprite.yScale,
texture.width * part.render.sprite.xScale,
texture.height * part.render.sprite.yScale);
}
1 ответ
const { min, max } = part.bounds
он будет содержать то, что вам нужно в { x, y }
просто вычесть max.x - min.x
& max.y - min.y
Я пошел с решением, очень похожим на следующее:
var width = 30;
var height = 30;
var rect = Bodies.rectangle(150, 100, width, height, {density:0.01, className:"brick", width:width, height:height});
console.log(rect.className, rect.width); // "brick", 30
Я решил сохранить исходную информацию о ширине / высоте вместе с другими пользовательскими свойствами, такими как className
Причина в том, что bounds
На это влияет вращение любого не идеально круглого объекта, например. границы повернутого прямоугольника могут быть на ~30% шире, чем его фактическая ширина.
Я нашел два решения.
1- Создайте класс для обертывания тела question.js, который также будет удерживать высоту и ширину. то есть:
class rectWrapper {
constructor(x, y, width, height, options){
this.width = width
this.height = height
this.body = Matter.Bodies.rectangle(x, y, width, height, options)
}
}
2- Другой способ - использовать магию математики для определения расстояния между двумя координатными точками, используя Body.vertices[0] и Body.vertices[1] для ширины, а также Body.vertices[0] и Body.vertices[3] для высоты. Это также будет учитывать любую ротацию. Эта ссылка четко объясняет это для двух и трех измерений:
https://sciencing.com/calculate-distance-between-two-coordinates-6390158.html
Я бы порекомендовал написать для этого свою собственную "служебную функцию". Тяжелый пример может выглядеть так:
function distance(x1, y1, x2, y2){
var x = Math.abs(x1-x2)
var y = Math.abs(y1-y2)
return Math.sqrt((x*x)+(y*y))
}
Итак, звонок может выглядеть так:
var rect = Matter.Bodies.rectangle(0,0,10,50)
var width = distance(rect.vertices[0].x, rect.verticies[0].y, rect.vertices[1].x, rect.vertices[1].y)
var height = distance(rect.vertices[0].x, rect.vertices[0].y, rect.vertices[3].x, rect.vertices[3].y)
В качестве альтернативы, если вы используете p5.js в качестве средства визуализации, вы можете использовать p5.dist(), который принимает x1, y1, x2, y2 в качестве аргументов и возвращает расстояние (в основном такое же, как функция выше):
https://p5js.org/reference/#/p5/dist
Обратите внимание, это будет работать только для прямоугольников. Если вы используете разные виды геометрии, я бы, наверное, сам сделал бы класс-оболочку.