Problem z obrotem obrazka o kąt

Odpowiedz Nowy wątek
2009-12-08 14:33

Rejestracja: 10 lat temu

Ostatnio: 10 lat temu

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 ;/ poprostu jak widać na drugim obrazku są białe kropki i to są kropki koloru panelu to nie jest bład pobrania koloru z obrazka, poprostu nie trafia w miejsce ;/
Z góry dzieki za pomoc.

Pozostało 580 znaków

2009-12-08 14:41
Moderator

Rejestracja: 12 lat temu

Ostatnio: 3 minuty temu

Lokalizacja: Stacktrace

0

Klasa AffineTransform i jej metoda rotation.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException

Pozostało 580 znaków

2009-12-08 14:47

Rejestracja: 10 lat temu

Ostatnio: 10 lat temu

0

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

Pozostało 580 znaków

2009-12-08 15:13
Moderator

Rejestracja: 12 lat temu

Ostatnio: 3 minuty temu

Lokalizacja: Stacktrace

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.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException

Pozostało 580 znaków

bogdans_niezalogowan
2009-12-08 15:22
bogdans_niezalogowan
0

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

Pozostało 580 znaków

2009-12-08 16:31

Rejestracja: 11 lat temu

Ostatnio: 5 miesięcy temu

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)

Pozostało 580 znaków

2011-04-06 22:43

Rejestracja: 9 lat temu

Ostatnio: 3 lata temu

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ę...

Pozostało 580 znaków

Odpowiedz

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