这个函数接收角度 angle、初始坐标 startX 和 startY、速度 speed、重力加速度 gravity 和时间间隔 interval,计算抛物线轨迹并返回一个坐标点数组。函数首先将角度转换为弧度,然后分别计算出水平和竖直方向上的速度 velocityX 和 velocityY。接着,使用一个循环计算出每个时间间隔内的坐标点,并将其添加到数组 trajectory 中。循环条件为坐标点的纵坐标 y 大于等于 0,表示在竖直方向上运动的物体还未落地。
getParabolicTrajectory(angle, startX, startY, speed, gravity, interval) {
const radians = (angle * Math.PI) / 180;
const velocityX = speed * Math.cos(radians);
const velocityY = speed * Math.sin(radians);
const trajectory = [{ x: startX, y: startY }];
let t = 0;
let x = startX;
let y = startY;
while (y >= 0) {
t += interval;
x = startX + velocityX * t;
y = startY + velocityY * t - 0.5 * gravity * t ** 2;
trajectory.push({ x, y });
}
return trajectory;
}
这个函数接收两个点坐标 point1 和 point2,每隔 30 输出这两点之间的一些坐标点。函数首先计算这两点之间的距离,然后使用勾股定理计算出横纵坐标上每单位距离的增量 unitX 和 unitY。接着,计算出每个输出坐标点之间的距离 interval,并使用一个循环输出每个坐标点。
getCoordinatesBetweenPoints(point1, point2) {
const distanceX = point2.x - point1.x;
const distanceY = point2.y - point1.y;
const distance = Math.sqrt(distanceX ** 2 + distanceY ** 2);
const unitX = distanceX / distance;
const unitY = distanceY / distance;
const interval = distance / Math.ceil(distance / 30);
const coordinates = [];
for (let i = 0; i <= Math.ceil(distance / 30); i++) {
const x = point1.x + unitX * interval * i;
const y = point1.y + unitY * interval * i;
coordinates.push({ x, y });
}
console.log(coordinates);
return coordinates;
}
用于生成多个随机位置不重叠的矩形
function generateRectangles(numRectangles: number, widthRange: [number, number], heightRange: [number, number]): [number, number, number, number][] {
const rectangles: [number, number, number, number][] = [];
for (let i = 0; i < numRectangles; i++) {
// 随机生成矩形的宽和高
const w = Math.floor(Math.random() * (widthRange[1] - widthRange[0] + 1)) + widthRange[0];
const h = Math.floor(Math.random() * (heightRange[1] - heightRange[0] + 1)) + heightRange[0];
// 随机生成矩形的左上角坐标,保证矩形不会超出已有矩形的范围
const x = Math.floor(Math.random() * (1000 - w));
const y = Math.floor(Math.random() * (1000 - h));
let overlap = false;
// 检查新生成的矩形是否与已有矩形重叠
for (const rect of rectangles) {
if (x < rect[0] + rect[2] && x + w > rect[0] && y < rect[1] + rect[3] && y + h > rect[1]) {
overlap = true;
break;
}
}
// 如果新生成的矩形与已有矩形重叠,则重新生成
if (overlap) {
i -= 1;
} else {
rectangles.push([x, y, w, h]);
}
}
return rectangles;
}