2017-01-16 2 views
0

Привет, коллеги-программисты,Вращение изображения Java не работает должным образом

Я делаю игру, и я хочу иметь возможность поворачивать мои изображения. Я не использую Graphics2d, потому что сам сделал класс рендеринга (в основном).

Проблема заключается в том, что мой текущий метод вращения оставляет дыры в новом (повернутый) картина также не размещать новые пиксели на нужном месте ...

я не вижу проблемы, так что, возможно, вы можете помочь :)

функция
public void drawRotatedImage(Image image, int offX, int offY, double degree){ 
    int Iwidth = image.width; 
    int Iheight = image.height; 

    double angle = Math.toRadians(degree); 
    double sin = Math.sin(angle); 
    double cos = Math.cos(angle); 
    double x0 = 0.5 * (Iwidth - 1);  // point to rotate about 
    double y0 = 0.5 * (Iheight - 1);  // center of image 

    for(int x = 0; x < Iwidth; x++){ 
     for(int y = 0; y < Iheight; y++){ 
      double a = x - x0; 
      double b = y - y0; 
      int xx = (int) (+a * cos - b * sin + x0); 
      int yy = (int) (+a * sin + b * cos + y0); 

      if(xx >= 0 && xx < width && yy >= 0 && yy < height){ 
       setPixel(x+offX, y+offY, image.pixels[xx + yy*image.width]); 
      } 
     } 
    } 
} 

SetPixel выглядит следующим образом:

public void setPixel(int x, int y, int color){ 
    if((x < 0 || x >= width || y < 0 || y >= height) || color == 0xffff00ff){ 
     return; 
    } 
    pixels[x + y * width] = color; 


} 

Это прекрасно работает для не повернутых изображений ... но когда я повернуть это дает странное дерьмо За исключением случаев, когда я использую идеальный квадрат в качестве изображения, а затем поворачиваюсь как 90 или 180 Но в остальном я получаю образы, полные отверстий и неправильных пикселей ....

Итак, чтобы быть ясным, это не ошибка или что-то в этом роде что ... им просто нужно найти лучшее решение или что-то, что нужно заполнить.

+0

Почему не просто 'x0 = 0,5 * Iwidth' &&' y0 = 0,5 * Iheight'? – TiMr

+0

Потому что это не средний – Neriesta

+0

смотреть на свой язык, это не ваш задний двор !! – gpasch

ответ

0

Проблема заключается в том, что вы устанавливаете источник (оригинал) точки с цветом назначения до вращения:

setPixel(x+offX, y+offY, image.pixels[xx + yy*image.width]);// you get the color of destination (xx,yy) and set it to source (x,y). 

Именно поэтому она работает, когда степень 180, потому что обратная сторона операции выглядит правильно в то время как он по-прежнему отменяется.

Правильный путь:

setPixel(xx+offX, yy+offY, image.pixels[x+ y*image.width]); 
+0

все в порядке, но я все еще получаю дыры в новом изображении ... – Neriesta

Смежные вопросы