已知角度 ,求缩放比
代码我已经写出来, 但是太多了 看看有没有简单办法
我的建议是不如问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);
效果
代码:
1 + (-Math.cos(angle / 14.33) + 1) * 0.25
参数:
- angle:角度
你如果目标是45度时缩放是1.5的话那就是上面这些方法
不过如果目标只是旋转后的正方形刚好外切,45度时缩放比其实是根号2的话
那缩放比就是
sin(angle)+cos(angle)
float scaleValue = 1.5f - (Mathf.Abs((currentAngle % 90.0f) - 45.0f))/45.0f * 0.5f;
只用一个abs函数
刚刚测了一下性能,貌似我的更快,哈哈
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)
}
然后你再跑跑这个试试看?
也许是优化了没使用的值,Math.abs更好一些
闲着无聊优化了下性能
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