gpt4 book ai didi

java - 在Android中生成强度范围内的振动模式的算法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:09 24 4
gpt4 key购买 nike

我正在尝试以编程方式生成开启和关闭“微脉冲”的 Android 振动模式,以控制最终用户感受到的振动强度。这是我在一些类似主题中推荐的解决方案,用于解决 API 未提供用于控制振动强度的接口(interface)的问题(据我所知,由于硬件的功能)。

然而,生成这些模式的算法似乎只是暗示,而没有发布实际算法。

我想做的是,给定一个介于 0.0f 和 1.0f 之间的输入强度,生成一个遵循如下模式的数组:

(zero intensity)
[20,0]

[9,1,9,1]
...

[3,1,3,1,3,1,3,1,3,1]

[2,1,2,1,2,1,2,1,2,1,2,1,2]

(half intensity)
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]

[1,2,1,2,1,2,1,2,1,2,1,2,1,1]

[1,3,1,3,1,3,1,3,1,3]
...

[1,9,1,9]

(full intensity)
[0,20]

对编写此类算法有任何帮助(或对实现相同目标的更好策略的建议)吗?

编辑:我添加了 100 声望的赏金:)

最佳答案

在研究这个问题一段时间后,由于数学天赋不高,我想出了一个过于简化的算法(与 Dithermaster 向我指出那个方向后我发现的一些 PWM 公式相比)。我做出的几个假设首先是短脉冲宽度始终为 1,长脉冲宽度是 1 和振动持续时间之间的整数。我还假设长脉冲宽度是振动强度的线性函数。特别是,后一种假设是不准确的。我猜该函数应该更像是分贝计算(振动的“强度”类似于声音的“响度”)。

发布我的简化解决方案,以防它对最终来到这里的其他人有用。这对于我正在使用它的应用程序来说已经足够接近了,但我仍然想要更好的东西。如果有人发布替代答案,我会测试并接受它是否更好。

public long[] genVibratorPattern( float intensity, long duration )
{
float dutyCycle = Math.abs( ( intensity * 2.0f ) - 1.0f );
long hWidth = (long) ( dutyCycle * ( duration - 1 ) ) + 1;
long lWidth = dutyCycle == 1.0f ? 0 : 1;

int pulseCount = (int) ( 2.0f * ( (float) duration / (float) ( hWidth + lWidth ) ) );
long[] pattern = new long[ pulseCount ];

for( int i = 0; i < pulseCount; i++ )
{
pattern[i] = intensity < 0.5f ? ( i % 2 == 0 ? hWidth : lWidth ) : ( i % 2 == 0 ? lWidth : hWidth );
}

return pattern;
}

关于java - 在Android中生成强度范围内的振动模式的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20808479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com