个人用代码

这个函数接收角度 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值