遇到一个数学问题,求助

image

71922e6cc361d1d79c04d15e1b4213cf

c74cacb157872f96bf005798fbe0f9cf

已知角度 ,求缩放比

代码我已经写出来, 但是太多了 看看有没有简单办法

我的建议是不如问chatgpt

没验证,要不你试试?

你是不是想说让红色方框转的时候正好可以包住白色

限定在0-90度之间吗?可以这么写。

    let scale = 1;
    if (angle <= 45) {
        scale = 1 + (0.5 * (angle / 45));
    } else {
        scale = 1.5 - (0.5 * ((angle - 45) / 45));
    }

redNode.scale = 1+(Math.sqrt(2)-1)*Math.sin(((redNode.angle%90)*2)*Math.PI/180);

效果

1723212609812

代码:

1 + (-Math.cos(angle / 14.33) + 1) * 0.25

参数:

  • angle:角度
2赞

你如果目标是45度时缩放是1.5的话那就是上面这些方法

不过如果目标只是旋转后的正方形刚好外切,45度时缩放比其实是根号2的话
那缩放比就是

sin(angle)+cos(angle)

testRotate
image
float scaleValue = 1.5f - (Mathf.Abs((currentAngle % 90.0f) - 45.0f))/45.0f * 0.5f;
只用一个abs函数

1赞

刚刚测了一下性能,貌似我的更快,哈哈
image

let loop_n = 1000000000;

{
    let start_time_ms_n = Date.now();
    let angle_n = 0;
    for (let k_n = 0; k_n < loop_n; ++k_n) {
        let value = 1 + (-Math.cos(angle_n / 14.33) + 1) * 0.25;
        angle_n++;
    }
    console.log(1, Date.now() - start_time_ms_n)
}

{
    let start_time_ms_n = Date.now();
    let angle_n = 0;
    for (let k_n = 0; k_n < loop_n; ++k_n) {
        let value = 1.5 - (Math.abs((angle_n % 90) - 45)) / 45 * 0.5;
        angle_n++;
    }
    console.log(2, Date.now() - start_time_ms_n)
}


我就跑了一次,不过这个无所谓吧

我 chrome 跑的,可能环境差异吧,使用的人自己用上面的代码测就行了

你这么一说,我就严谨一点,看了一下感觉abs比cos耗时就觉得不可思议
let loop_n = 1000000000;

{
let start_time_ms_n = Date.now();
let angle_n = 0;
let total = 0;
for (let k_n = 0; k_n < loop_n; ++k_n) {
let value = 1 + (-Math.cos(angle_n / 14.33) + 1) * 0.25;
total = total + value;
angle_n++;
}
console.log(1, Date.now() - start_time_ms_n, total)
}

{
let start_time_ms_n = Date.now();
let angle_n = 0;
let total = 0;
for (let k_n = 0; k_n < loop_n; ++k_n) {
let value = 1.5 - (Math.abs((angle_n % 90) - 45)) / 45 * 0.5;
total = total + value;
angle_n++;
}
console.log(2, Date.now() - start_time_ms_n, total)
}
然后你再跑跑这个试试看?

image

也许是优化了没使用的值,Math.abs更好一些

闲着无聊优化了下性能

image

let loop_n = 1000000000;

{
    let start_time_ms_n = Date.now();
    let angle_n = 0;
    let total_n = 0;
    for (let k_n = 0; k_n < loop_n; ++k_n) {
        let value = 1.5 - (Math.abs((angle_n % 90) - 45)) / 45 * 0.5;
        angle_n++;
        total_n += value;
    }
    console.log(1, Date.now() - start_time_ms_n, total_n)
}

{
    let start_time_ms_n = Date.now();
    let angle_n = 0;
    let total_n = 0;
    for (let k_n = 0; k_n < loop_n; ++k_n) {
        let value = angle_n - 45 - ~~(angle_n * 0.011111111111111112) * 90;
        
        value = 1.5 - ((value + (value >> 31)) ^ value >> 31) * 0.011111111111111112;
        angle_n++;
        total_n += value;
    }
    console.log(2, Date.now() - start_time_ms_n, total_n)
}

用了 没啥问题

let value = angle_n - 45 - ~~(angle_n * 0.011111111111111112) * 90;
这句写成
let value = (angle_n % 90) - 45;
就行吧,效率也会更高

可以的12