Problem z obrotem obrazka o kąt

0

Witam, mam problem. Pisze program który ma obrocic dowolny obrazek o jakiś zadany z góry kąt z tym ze po obrocie obrazka : user image robi sie cos takiego : user image

FPS to zadany kąt
Oto kod:

class GraphicsUtils{
public static void setPixel(Graphics g,Color t, int x, int y) {
g.setColor(t);
g.fillRect(x, y, 1, 1);
}
}

double cosinus = Math.cos((fpsMath.PI)/180);
double sinus = Math.sin((fps
Math.PI)/180);
for(int i=0;i<img.getWidth();i++){
for(int j=0;j<img.getHeight();j++){
x=(double)i;
y=(double)j;

            double kx = (double)x - (double)(img.getWidth()/2);
            double ky = (double)y - (double)(img.getHeight()/2);
            x=(double)(cosinus*kx)-(double)(sinus*ky) + (double)img.getWidth()/2;
            y=(double)(sinus*kx)+(double)(cosinus*ky) + (double)img.getHeight()/2;
            //Color kolor1=new Color(img.getRGB(i, j));
            GraphicsUtils.setPixel(g, new Color(img.getRGB(i, j)), (int)(x+0.5), (int)(y+0.5));



            }
        }

Probowalem juz na wszystkie sposoby z rzutowaniem , nawet te dodanie 0.5 zadzialalo przy obrocie 180 stopnii no i nie wiem w czym tkwi błąd ;/ po prostu jak widać na drugim obrazku są białe kropki i to są kropki koloru panelu to nie jest bład pobrania koloru z obrazka, po prostu nie trafia w miejsce ;/
Z góry dzieki za pomoc.

0

Klasa AffineTransform i jej metoda rotation.

0

o to chodzi ze nie moge korzystać z zadnych metod ;/

0

Hm... IMO błąd polega na tym, że przy kątach innych niż wielokrotności 90 należy uwzględnić "granulację" obrazu. Przy obracaniu obliczasz nowe położenie danego piksela, ale wyliczona wartość jest typu double (dobrze) rzutując ją na int sprawiasz, że pojawiają się prześwity tam gdzie piksel nie wpadł w żadne wyliczenia. Przypomina to trochę efekt rysowania łuku - nigdy nie będzie to łuk, ale zlepek bardzo krótkich odcinków, które z odległości udają łuk. Takie małe ograniczenie techniczne.
Rozwiązanie problemu, moje podejście. Po obrocie przejdź przez całą tablicę i sprawdź czy nie masz "nullpiksela" w obrazku. Jeżeli taki wystąpi wyznacz jego kolor na podstawie sąsiadów.

0

Źródła Javy są jawne, podejrzyj kod metody rotate() w klasie AffineTransform.

0

Robisz na odwrót...
Ty idziesz pixel po pixelu ze starego obrazka (miejsca) i obliczasz pozycję do umieszczenia go na nowym.
A powinieneś iść pixel po pixelu po nowym miejscu i obliczać który pixel ze starego należy pobrać... (możesz też uwzględniać do którego pixela wyliczoneu miejscu najbliżej i na proporcje brać też kolory jego sąsiadów :P)

0

witam,

  • mam podobny problem muszę jakiś tam wczytany obrazek BufferedImage imageIn obrócić o zadany kąt idt
  • próbuję to zrobić poprzez iterowanie pixel po pixelu na imageOut i na pozycję (z podwójnej pętli) ustawiam kolor pobrany z imageIn poprzez getRGB(icos(kąt)-jsin(kąt) , isin(kąt)+jcos(kąt))
  • i tutaj właśnie pojawia się problem bo nie wiem do końca czy pętla może lecieć po rozmiarze imageOut, który to ma być: większy od imageIn czy równy czy też inny?
  • o poza tym wywala mi wykroczenie poza zakres

proszę o wskazówkę...

1 użytkowników online, w tym zalogowanych: 0, gości: 1