但是SIN我们可以自己使用查表法模拟实现.
// 0, 10, 20, 30, 40, 50, 60, 70, 80, 90角度的sin值 ,全部乘以256得到的一个对应表数组
private static final int[] SINES =
{ 0, 44, 88, 128, 165, 196, 222, 241, 252, 256 };
// angle是实际角度除以10,所以90度的angle就为9,360度全圆的angle就是36
private static int sineTimes256(int angle)
{
angle %= 36; // 360度以上
if (angle <= 9) // 0到90度
{
return SINES;
}
else if (angle <= 18) // 90到180度
{
return SINES;
}
else if (angle <= 27) // 180到270度
{
return -SINES;
}
else // 270到360度 {
return -SINES;
}
}
// angle是实际角度除以10,所以90度的angle就为9,360度全圆的angle就是36
private static int cosineTimes256(int angle)
{
return sineTimes256(angle + 9);
}
之后只要调用sineTimes256和cosineTimes256函数就OK了,参数传角度的1/10
但这仅仅是模拟运算,求值是不精确的,效率比较高.
当然,你可以考虑使用更详细的表,当然会牺牲一些效率. 上帝给了我们手和脑,就是让我们去创造.没有平方根函数的话,继续自己写咯~
private final int sqrt(int n)
{
int r, l, t;
// 100以内数字求平方根
if (n < 100)
{
r = 9;
while (n < r * r)
{
r--;
}
}
else {
// 大于100的数
r = sqrt(n / 100);
l = n - r * r * 100;
t = l / (r * 20);
while (t * (r * 20 + t) > l) t--;
r = r * 10 + t;
}
return r;
}
唉呀呀......又被抢先了..... 不得不说.真配服duzhi3658我想的算法的复杂度太高了....而且结果也不精确.....配服配服.....
我的想法是先转成STRING类....按两位进行存储.....最后在手动开方方法来解决....唉....突然发现算法效率不高.... 引用第8楼好人卡的神话于2007-06-13 00:28发表的:
这个有点Orz了。。。还是避免使用平方根好了。其实sin cos的那个把1-90的全部都算出来存住就精确多了。
放大10000倍后的SIN,COS数组
public static int SIN[] = {
0, 174, 348, 523, 697, 871, 1045, 1218, 1391,
1564, 1736,
1908, 2079, 2249, 2419, 2588, 2756, 2923, 3090,
3255, 3420,
3583, 3746, 3907, 4067, 4226, 4383, 4539, 4694,
4848, 4999,
5150, 5299, 5446, 5591, 5735, 5877, 6018, 6156,
6293, 6427,
6560, 6691, 6819, 6946, 7071, 7193, 7313, 7431,
7547, 7660,
7771, 7880, 7986, 8090, 8191, 8290, 8386, 8480,
8571, 8660,
8746, 8829, 8910, 8987, 9063, 9135, 9205, 9271,
9335, 9396,
9455, 9510, 9563, 9612, 9659, 9702, 9743, 9781,
9816, 9848,
9876, 9902, 9925, 9945, 9961, 9975, 9986, 9993,
9998, 10000,
9998, 9993, 9986, 9975, 9961, 9945, 9925, 9902,
9876, 9848,
9816, 9781, 9743, 9702, 9659, 9612, 9563, 9510,
9455, 9396,
9335, 9271, 9205, 9135, 9063, 8987, 8910, 8829,
8746, 8660,
8571, 8480, 8386, 8290, 8191, 8090, 7986, 7880,
7771, 7660,
7547, 7431, 7313, 7193, 7071, 6946, 6819, 6691,
6560, 6427,
6293, 6156, 6018, 5877, 5735, 5591, 5446, 5299,
5150, 4999,
4848, 4694, 4539, 4383, 4226, 4067, 3907, 3746,
3583, 3420,
3255, 3090, 2923, 2756, 2588, 2419, 2249, 2079,
1908, 1736,
1564, 1391, 1218, 1045, 871, 697, 523, 348, 174,
0,
-174, -348, -523, -697, -871, -1045, -1218, -1391,
-1564, -1736,
-1908, -2079, -2249, -2419, -2588, -2756, -2923,
-3090, -3255, -3420,
-3583, -3746, -3907, -4067, -4226, -4383, -4539,
-4694, -4848, -5000,
-5150, -5299, -5446, -5591, -5735, -5877, -6018,
-6156, -6293, -6427,
-6560, -6691, -6819, -6946, -7071, -7193, -7313,
-7431, -7547, -7660,
-7771, -7880, -7986, -8090, -8191, -8290, -8386,
-8480, -8571, -8660,
-8746, -8829, -8910, -8987, -9063, -9135, -9205,
-9271, -9335, -9396,
-9455, -9510, -9563, -9612, -9659, -9702, -9743,
-9781, -9816, -9848,
-9876, -9902, -9925, -9945, -9961, -9975, -9986,
-9993, -9998, -10000,
-9998, -9993, -9986, -9975, -9961, -9945, -9925,
-9902, -9876, -9848,
-9816, -9781, -9743, -9702, -9659, -9612, -9563,
-9510, -9455, -9396,
-9335, -9271, -9205, -9135, -9063, -8987, -8910,
-8829, -8746, -8660,
-8571, -8480, -8386, -8290, -8191, -8090, -7986,
-7880, -7771, -7660,
-7547, -7431, -7313, -7193, -7071, -6946, -6819,
-6691, -6560, -6427,
-6293, -6156, -6018, -5877, -5735, -5591, -5446,
-5299, -5150, -5000,
-4848, -4694, -4539, -4383, -4226, -4067, -3907,
-3746, -3583, -3420,
-3255, -3090, -2923, -2756, -2588, -2419, -2249,
-2079, -1908, -1736,
-1564, -1391, -1218, -1045, -871, -697, -523,
-348, -174};
public static int COS[] = {
10000, 9998, 9993, 9986, 9975, 9961, 9945, 9925,
9902, 9876, 9848,
9816, 9781, 9743, 9702, 9659, 9612, 9563, 9510,
9455, 9396,
9335, 9271, 9205, 9135, 9063, 8987, 8910, 8829,
8746, 8660,
8571, 8480, 8386, 8290, 8191, 8090, 7986, 7880,
7771, 7660,
7547, 7431, 7313, 7193, 7071, 6946, 6819, 6691,
6560, 6427,
6293, 6156, 6018, 5877, 5735, 5591, 5446, 5299,
5150, 5000,
4848, 4694, 4539, 4383, 4226, 4067, 3907, 3746,
3583, 3420,
3255, 3090, 2923, 2756, 2588, 2419, 2249, 2079,
1908, 1736,
1564, 1391, 1218, 1045, 871, 697, 523, 348, 174,
0,
-174, -348, -523, -697, -871, -1045, -1218, -1391,
-1564, -1736,
-1908, -2079, -2249, -2419, -2588, -2756, -2923,
-3090, -3255, -3420,
-3583, -3746, -3907, -4067, -4226, -4383, -4539,
-4694, -4848, -4999,
-5150, -5299, -5446, -5591, -5735, -5877, -6018,
-6156, -6293, -6427,
-6560, -6691, -6819, -6946, -7071, -7193, -7313,
-7431, -7547, -7660,
-7771, -7880, -7986, -8090, -8191, -8290, -8386,
-8480, -8571, -8660,
-8746, -8829, -8910, -8987, -9063, -9135, -9205,
-9271, -9335, -9396,
-9455, -9510, -9563, -9612, -9659, -9702, -9743,
-9781, -9816, -9848,
-9876, -9902, -9925, -9945, -9961, -9975, -9986,
-9993, -9998, -10000,
-9998, -9993, -9986, -9975, -9961, -9945, -9925,
-9902, -9876, -9848,
-9816, -9781, -9743, -9702, -9659, -9612, -9563,
-9510, -9455, -9396,
-9335, -9271, -9205, -9135, -9063, -8987, -8910,
-8829, -8746, -8660,
-8571, -8480, -8386, -8290, -8191, -8090, -7986,
-7880, -7771, -7660,
-7547, -7431, -7313, -7193, -7071, -6946, -6819,
-6691, -6560, -6427,
-6293, -6156, -6018, -5877, -5735, -5591, -5446,
-5299, -5150, -5000,
-4848, -4694, -4539, -4383, -4226, -4067, -3907,
-3746, -3583, -3420,
-3255, -3090, -2923, -2756, -2588, -2419, -2249,
-2079, -1908, -1736,
-1564, -1391, -1218, -1045, -871, -697, -523,
-348, -174, 0,
174, 348, 523, 697, 871, 1045, 1218, 1391, 1564,
1736,
1908, 2079, 2249, 2419, 2588, 2756, 2923, 3090,
3255, 3420,
3583, 3746, 3907, 4067, 4226, 4383, 4539, 4694,
4848, 5000,
5150, 5299, 5446, 5591, 5735, 5877, 6018, 6156,
6293, 6427,
6560, 6691, 6819, 6946, 7071, 7193, 7313, 7431,
7547, 7660,
7771, 7880, 7986, 8090, 8191, 8290, 8386, 8480,
8571, 8660,
8746, 8829, 8910, 8987, 9063, 9135, 9205, 9271,
9335, 9396,
9455, 9510, 9563, 9612, 9659, 9702, 9743, 9781,
9816, 9848,
9876, 9902, 9925, 9945, 9961, 9975, 9986, 9993,
9998};
值得注意的是,这俩数组占用内存为2.8K.恩,若是手机平台,真的要悠着点用
页:
[1]
2