📄 fixedpoint.java
字号:
int k; n = -n; if ((n & (FIX_UNIT>>1)) != 0) k = (((n+FIX_UNIT)>>FIX_SHIFT)<<FIX_SHIFT); else k = (((n)>>FIX_SHIFT)<<FIX_SHIFT); return -k; }// ~else }/// END FUNC /** * @name sin * @brief sine function value read from table * @param x fixed point value [0..2PI] * @return FixedPoint sine of x [0..1] * @author Stellars Henson */ public static final int sin(int x) { x = (x<<8)/(2*FIXED_PI+1); return FIX_SIN[x & 0xff]; }/// END FUNC /** * @name cos * @brief cosine function value read from table * @param x fixed point value [0..2PI] * @return FixedPoint cosine of x [0..1] * @author Stellars Henson */ public static final int cos(int x) { x = (x<<8)/(2*FIXED_PI+1); return FIX_COS[x & 0xff]; }/// END FUNC /** * routinge returns FixedPoint angle * for line binding the given point (x,y) * and the point (0,0). The angle of 0 * is equal to x positive axis * @name angle * @brief calculates angle for given point * @version 1.4 * @param x horizontal coord (FixedPoint) * @param y vertical coord (FixedPoint) * @author Stellars Henson * @return angle FixedPoint [0..2PI] */ public static final int angle( int x, int y ) { /* prepare environment */ int sampleX = 0; int sampleY = 0; int sampleAngle = 0; int xSign = 1; int ySign = 1; int angleSign = 1; int angleOffset = 0; boolean swapCoords = false; /* special situations */ if( x == 0 && y == 0 ) return 0; /* * calculate in which of * eight fracts the point is. * move counterclockwise */ /* first quarter, x>0, y>0 */ if( x>=0 && y>=0 && x>=y ) { swapCoords = false; xSign = 1; ySign = 1; angleSign = 1; angleOffset = 0; } else if( x>0 && y>0 && x<y ) { swapCoords = true; xSign = 1; ySign = 1; angleSign = -1; angleOffset = FIXED_HALFPI; }// ~elseif /* second quarter, x<0, y>0 */ else if( x<=0 && y>=0 && (-x)<=y ) { swapCoords = true; xSign = -1; ySign = 1; angleSign = 1; angleOffset = FIXED_HALFPI; } else if( x<0 && y>0 && (-x)>y ) { swapCoords = false; xSign = -1; ySign = 1; angleSign = -1; angleOffset = FIXED_PI; }// ~elseif /* third quarter, x<0, y<0 */ else if( x<=0 && y<=0 && (-x)>=(-y) ) { swapCoords = false; xSign = -1; ySign = -1; angleSign = 1; angleOffset = FIXED_PI; } else if( x<0 && y<0 && (-x)<(-y) ) { swapCoords = true; xSign = -1; ySign = -1; angleSign = -1; angleOffset = 3 * FIXED_HALFPI; }// ~elseif /* fourth quarter, x>0, y<0 */ else if( x>=0 && y<=0 && x<=(-y) ) { swapCoords = true; xSign = 1; ySign = -1; angleSign = 1; angleOffset = 3 * FIXED_HALFPI; } else if( x>0 && y<0 && x>(-y) ) { swapCoords = false; xSign = 1; ySign = -1; angleSign = -1; angleOffset = 4 * FIXED_HALFPI; }// ~elseif /* calculate sample coords */ if( swapCoords == false ) { sampleX = xSign * x; sampleY = ySign * y; }// ~if else { sampleX = ySign * y; sampleY = xSign * x; }// ~else /* now, calculate the sample angle */ sampleAngle = FIX_ATAN[ (( Div(sampleY,sampleX) )>>8) & 0xff ]; /* and return the real angle */ return ( angleOffset + angleSign * sampleAngle ); }/// END FUNC /** * @name toString * @brief translates fixedpoint value to String * @param f fixedpoint value * @return string reprezentation of fixedpoint */ public static final String fpToStr(int f) { byte[] pow = gP; byte[] acc = gA; int digit, carry; boolean neg; StringBuffer sb = gB; digit = 0; do pow[digit] = acc[digit] = 0; while (++digit < 21); pow[9] = 1; pow[10] = 5; pow[11] = 2; pow[12] = 5; pow[13] = 8; pow[14] = 7; pow[15] = 8; pow[16] = 9; pow[17] = 0; pow[18] = 6; pow[19] = 2; pow[20] = 5; if (neg = f < 0) f = -f; while (f != 0) { if ((f & 1) != 0) { digit = 20; carry = 0; do { acc[digit] = (byte)(acc[digit] + pow[digit] + carry); if (acc[digit] > 9) { acc[digit] -= 10; carry = 1; } else carry = 0; } while (--digit >= 0); } digit = 20; carry = 0; do { pow[digit] = (byte)(pow[digit] + pow[digit] + carry); if (pow[digit] > 9) { pow[digit] -= 10; carry = 1; } else carry = 0; } while (--digit >= 0); f >>>= 1; }// ~while sb.setLength(0); if (neg) sb.append('-'); for (f = 0; f < 21 && acc[f] == 0; f++) ; if (f > 4) sb.append('0'); for (digit = f; digit < 5; digit++) sb.append(acc[digit]); for (f = 20; f >= 0 && acc[f] == 0; f--) ; if (f > 4) sb.append('.'); for (digit = 5; digit <= f; digit++) sb.append(acc[digit]); return sb.toString(); }/// END FUNC ///////////////////////////////////////////////////////// /// Lookup tables /// ///////////////////////////////////////////////////////// /** Private */ /* sine values table */ private static final int[] FIX_SIN = { (int)(0.000000*FIX_UNIT), (int)(0.024541*FIX_UNIT), (int)(0.049068*FIX_UNIT), (int)(0.073565*FIX_UNIT), (int)(0.098017*FIX_UNIT), (int)(0.122411*FIX_UNIT), (int)(0.146730*FIX_UNIT), (int)(0.170962*FIX_UNIT), (int)(0.195090*FIX_UNIT), (int)(0.219101*FIX_UNIT), (int)(0.242980*FIX_UNIT), (int)(0.266713*FIX_UNIT), (int)(0.290285*FIX_UNIT), (int)(0.313682*FIX_UNIT), (int)(0.336890*FIX_UNIT), (int)(0.359895*FIX_UNIT), (int)(0.382683*FIX_UNIT), (int)(0.405241*FIX_UNIT), (int)(0.427555*FIX_UNIT), (int)(0.449611*FIX_UNIT), (int)(0.471397*FIX_UNIT), (int)(0.492898*FIX_UNIT), (int)(0.514103*FIX_UNIT), (int)(0.534998*FIX_UNIT), (int)(0.555570*FIX_UNIT), (int)(0.575808*FIX_UNIT), (int)(0.595699*FIX_UNIT), (int)(0.615232*FIX_UNIT), (int)(0.634393*FIX_UNIT), (int)(0.653173*FIX_UNIT), (int)(0.671559*FIX_UNIT), (int)(0.689541*FIX_UNIT), (int)(0.707107*FIX_UNIT), (int)(0.724247*FIX_UNIT), (int)(0.740951*FIX_UNIT), (int)(0.757209*FIX_UNIT), (int)(0.773010*FIX_UNIT), (int)(0.788346*FIX_UNIT), (int)(0.803208*FIX_UNIT), (int)(0.817585*FIX_UNIT), (int)(0.831470*FIX_UNIT), (int)(0.844854*FIX_UNIT), (int)(0.857729*FIX_UNIT), (int)(0.870087*FIX_UNIT), (int)(0.881921*FIX_UNIT), (int)(0.893224*FIX_UNIT), (int)(0.903989*FIX_UNIT), (int)(0.914210*FIX_UNIT), (int)(0.923880*FIX_UNIT), (int)(0.932993*FIX_UNIT), (int)(0.941544*FIX_UNIT), (int)(0.949528*FIX_UNIT), (int)(0.956940*FIX_UNIT), (int)(0.963776*FIX_UNIT), (int)(0.970031*FIX_UNIT), (int)(0.975702*FIX_UNIT), (int)(0.980785*FIX_UNIT), (int)(0.985278*FIX_UNIT), (int)(0.989177*FIX_UNIT), (int)(0.992480*FIX_UNIT), (int)(0.995185*FIX_UNIT), (int)(0.997290*FIX_UNIT), (int)(0.998795*FIX_UNIT), (int)(0.999699*FIX_UNIT), (int)(1.000000*FIX_UNIT), (int)(0.999699*FIX_UNIT), (int)(0.998795*FIX_UNIT), (int)(0.997290*FIX_UNIT), (int)(0.995185*FIX_UNIT), (int)(0.992480*FIX_UNIT), (int)(0.989177*FIX_UNIT), (int)(0.985278*FIX_UNIT), (int)(0.980785*FIX_UNIT), (int)(0.975702*FIX_UNIT), (int)(0.970031*FIX_UNIT), (int)(0.963776*FIX_UNIT),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -