ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
поворот картинки
Сообщение от Romanzes
Файл MathFP.java взял с какого-то сайта (между прочим, этот же самый файл, только немного переработанный, используется и в MP).
|
а я не знал ..( пришлось помучаться:

// значения косинусов * 65535
public static final int[] cos_table_180 =
{
65536, 65470, 65470, 65404, 65339, 65273, 65142, 65011, 64880, 64684,
64487, 64290, 64094, 63832, 63569, 63242, 62980, 62652, 62324, 61931,
61538, 61145, 60751, 60293, 59834, 59375, 58851, 58392, 57802, 57278,
56754, 56164, 55574, 54919, 54329, 53673, 53018, 52297, 51642, 50921,
50200, 49414, 48693, 47906, 47120, 46333, 45481, 44630, 43843, 42991,
42074, 41222, 40304, 39387, 38469, 37552, 36634, 35651, 34668, 33751,
32768, 31719, 30736, 29687, 28704, 27656, 26607, 25559, 24510, 23461,
22413, 21299, 20250, 19136, 18022, 16908, 15794, 14680, 13565, 12451,
11337, 10223, 9109, 7929, 6815, 5701, 4521, 3407, 2228, 1114, 0,
-1114, -2228, -3407, -4521, -5701, -6815, -7929, -9109, -10223,
-11337, -12451, -13565, -14680, -15794, -16908, -18022, -19136, -20250, -21299,
-22413, -23461, -24510, -25559, -26607, -27656, -28704, -29687, -30736, -31719,
-32702, -33751, -34668, -35651, -36634, -37552, -38469, -39387, -40304, -41222,
-42074, -42991, -43843, -44630, -45481, -46333, -47120, -47906, -48693, -49414,
-50200, -50921, -51642, -52297, -53018, -53673, -54329, -54919, -55574, -56164,
-56754, -57278, -57802, -58392, -58851, -59375, -59834, -60293, -60751, -61145,
-61538, -61931, -62324, -62652, -62980, -63242, -63569, -63832, -64094, -64290,
-64487, -64684, -64880, -65011, -65142, -65273, -65339, -65404, -65470, -65470,
-65536
};
// вычисление косинуса, если кто не догадался ..)
public static int cos(int a) {
int c = 0;
a %= 360;
a = (a < 0) ? 360 + a : a;
if (a > 180) {
c = -cos_table_180[a - 180];
} else {
c = cos_table_180[a];
}
return c;
}
// вычисление тангенса
// ...шутю
public static int sin(int a)
{
return cos(90 - a);
}
// хранение промежуточных результатов:
// результат поворота
private int tx = 0;
private int ty = 0;
// центр битмапа
private int cx = 0;
private int cy = 0;
// синус, косинус
private int sa = 0;
private int ca = 0;
// возвращает большее из 2 чисел
public static int max(int a, int b) {
return (a > b) ? a : b;
}
// возвращает меньшее из 2 чисел
public static int min(int a, int b) {
return (a < b) ? a : b;
}
// возвращает большее из 4 чисел
public static int max(int a, int b, int c, int d) {
return max(a, b) > max(c, d) ? max(a, b) : max(c, d);
}
// возвращает меньшее из 4 чисел
public static int min(int a, int b, int c, int d) {
return min(a, b) < min(c, d) ? min(a, b) : min(c, d);
}
// поворот точки на угол вокруг центра
// [cx, cy] - центр
private void xyRotate(int x, int y) {
int dx = x - cx;
int dy = y - cy;
tx = cx + ((dx * ca) >> 16) - ((dy * sa) >> 16);
ty = cy + ((dx * sa) >> 16) + ((dy * ca) >> 16);
}
// возвращает повернутую картинку
public static Image imgrotate(int angle) {
sa = sin(angle);
ca = cos(angle);
int x = 0;
int y = 0;
int w = pwid;
int h = phei;
cx = x + (w >> 1);
cy = y + (h >> 1);
xyrotate(x, y);
int x1 = tx;
int y1 = ty;
xyrotate(x + w - 1, y);
int x2 = tx;
int y2 = ty;
xyrotate(x + w - 1, y + h - 1);
int x3 = tx;
int y3 = ty;
xyrotate(x, y + h - 1);
int x4 = tx;
int y4 = ty;
tx = min4(x1, x2, x3, x4);
ty = min4(y1, y2, y3, y4);
int neww = max4(x1, x2, x3, x4) - tx + 1;
int newh = max4(y1, y2, y3, y4) - ty + 1;
int l = neww * newh;
int[] bmp2 = null;
bmp2 = new int[l];
int dx = (neww - w) >> 1;
int dy = (newh - h) >> 1;
for(x = 0; x < neww; x++)
for(y = 0; y < newh; y++) {
xyrotate(x - dx, y - dy);
int i = x + y * neww;
if ((i >= 0) && (i < l)) {
bmp2[i] = point(tx, ty);
}
}
return Image.createRGBImage(bmp2, neww, newh, true);
}
зато не требует каких либо библиотек
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
Последний раз редактировалось barsunduk, 05.11.2011 в 13:31.
|