[java] images rotaten

Pagina: 1
Acties:

  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

Topicstarter
Ik wil het volgende voor elkaar krijgen:

Afbeeldingslocatie: http://occultforces.mine.nu/~scorpion/rotate.jpg

Maar niet gebruik maken van een API oid. Dus heb ik een int[]-array, waarin de picture gesaved is. 32x32 (of 64x64.. whatever..) En wil deze dus rond kunnen draaien aan de hand van een aantal graden die ik opgeef (0-360). Ik kan een draadmodel wel rond laten draaien, maar het enigste probleem is nog om de image te vullen. Weet iemand hier de beste manier voor? Iets met interpolating oid? Of gewoon de 4 hoeken berekenen, en daar lijnen tussen tekenen oid (<- wat een lelijk resultaat geeft)

  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Goh, nog geen antwoorden? Dan probeer ik 't maar...
Even een recap: wat je dus wilt is een plaatje 2d roteren - expliciet NIET 3d.

Je zou dit kunnen doen door een texturemapping class te maken, ofzo, maar dat lijkt me nogal overkill als je echt alleen maar een plaatje rondjes wilt laten draaien.

En tjsa, als je geen bestaande api's wilt gebruiken, dan kom 't uiteindelijk toch aan op zelf een interpolatie-functie bouwen, zoals je zelf al suggereerd. Zo te horen weet je enigsinds waar je 't over hebt, maar just in case - even uitgaande van 't tweede plaatje (maar zou dus in alle gevallen moeten werken):

1. trace de zijkanten van 't vierkant en sla de begin- en eind 'coordinaten' van 't plaatje op
2. teken nu van boven naar beneden (of omgekeerd voor mijn part) de horizontale lijnen, uitgaande van de verkregen data in stap 1, dmv interpolatie de pixels van 't plaatje.

Stap 2 kan je natuurlijk ook bufferen ofzo, maar dat mag je zelf allemaal uitvogelen. Dit is overigens ongeveer wat je zegt, maar als je 't goed doet dan is het resultaat niet lelijk. Tegenwoordig zijn computers snel genoeg om met floating point waardes de coordinaten in 't plaatje te bepalen. In 'the old days' moesten we 't helaas zonder floating point algorithm stellen.

[ specs ] [ Tweaker gallery ]


  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

Topicstarter
zo had ik het dus ook in gedachten. is het nog mogelijk dat je me het interpoleren kan uitleggen? :) ik weet ongeveer wel hoe ik het wil gaan doen, maar misschien dat het me nog even wat duidelijker kan worden gemaakt.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:51

Janoz

Moderator Devschuur®

!litemod

Je kunt het beste gebruik maken van een transformatie. Dit kun je doen met een simpele 2x2 matrix die je alsvolgt opbouwd:
code:
1
2
/ sin(a) , cos(a) \
\ cos(a) ,-sin(a) /

Deze reken je 1 keer uit en vervolgens ga je samples maken. Let er wel op dat deze matrix roteerd om het punt 0,0. Als je wilt draaien om een ander punt, dan zul je ook een translatie moeten doen.

Om te voorkomen dat er gaten in het uitvoer beeld komen, kun je het beste 'backwards' samplen. Dit betekend dat je een punt op het uitvoerbeeld neemten mbv de translaties kijkt welk punt daarbij hoort in het invoer beeld. Met deze methode ga e alle punten van het uitvoerbeeld bijlangs. Let er wel op dat er ook punten buiten je invoerbeeld kunnen vallen. Hier moet je ff een soort check voor maken.

Bij het samplen van het invoerbeeld kun je idd goed interpolatie gebruiken. Als je de translatie mbv reals uitrekend kun je mbv floor en ceil bepalen wat de buurpixels zijn. Het gedeelte achter de komma kun je vervolgens gebruiken om de gewichten te bepalen van de verschillende buurpixels. Als het resultaat belangrijk is (zoals bv bij grafische applicaties) en niet de snelheid (zoals bij spellen) kun je mbv pythagoras uitrekenen wat de afstand tot de buurpixels is. Let wel op, hoe langer de afstand, hoe minder het pixel mee moet tellen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

Topicstarter
snelheid is belangrijker dan kwaliteit in dit geval, als de gedraaide picture maar geen gaten bevat, en er goed uitziet is het goed genoeg imho.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:51

Janoz

Moderator Devschuur®

!litemod

Dan neem je ipv pythagoras gewoon de Manhattan distance (dx+dy ipv SQRT(dx^2 + dy^2) )

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

Topicstarter
Op maandag 01 oktober 2001 11:36 schreef Janoz het volgende:
Dan neem je ipv pythagoras gewoon de Manhattan distance (dx+dy ipv SQRT(dx^2 + dy^2) )
Hmmm ik volg niet helemaal wat je hier mee wilt berijken. Ik snap dat je de kleur van de buurt-pixels wil berekenen right?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:51

Janoz

Moderator Devschuur®

!litemod

Het id is meer dat je alle punten van je destination image bij langs gaat, en kijkt welk punt op het source image daarbij hoort. Probeer dat eerst te maken, en gebruik dan voor je 'sampler' een nearest neighbour (dichtsbijzijnde pixel, gewoon de getransleerde punten afronden)..

Dat hele verhaal daarna gaat over interpolatie

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

Topicstarter
Op maandag 01 oktober 2001 11:50 schreef Janoz het volgende:
Het id is meer dat je alle punten van je destination image bij langs gaat, en kijkt welk punt op het source image daarbij hoort. Probeer dat eerst te maken, en gebruik dan voor je 'sampler' een nearest neighbour (dichtsbijzijnde pixel, gewoon de getransleerde punten afronden)..

Dat hele verhaal daarna gaat over interpolatie
je bedoelt het "nearest neighbour" gedoe?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:51

Janoz

Moderator Devschuur®

!litemod

Nou, omdat je een colega van Johan bent... hier maar ff wat code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static BufferedImage rotate(BufferedImage input, double angle) {

    int width = input.getWidth();
    int height = input.getHeight();
    BufferedImage output = new BufferedImage(width, height, input.getType());

    double a0 = Math.cos(angle*Math.PI/180.0);
    double b0 = Math.sin(angle*Math.PI/180.0);
    double a1 = -b0, b1 = a0;

    IntervalTimer timer = new IntervalTimer();
    timer.start();
    int rx, ry, n = 0;
    for (int y = 0; y < height; ++y)
    for (int x = 0; x < width; ++x) {
      rx = (int) Math.round(a0*x + a1*y);
      ry = (int) Math.round(b0*x + b1*y);
      if (rx >= 0 && rx < width && ry >= 0 && ry < height)
        output.setRGB(rx, ry, input.getRGB(x, y));
      else
        ++n;
    }
    System.out.println("Rotation complete [" + timer.stop() + " sec]");
    System.out.println(n + " pixels could not be mapped");

    return output;

  }

Dit is een stukje code uit een boek van me. Dit is een Forward rotation rond het punt 0,0. Helaas komen hier wel gaten in, maar het is waarschijnlijk niet lastig om te bouwen naar een backward rotation. Dan moet je door het output beeld heenlopen, en moet je iets als
code:
1
        output.setRGB(x, y, input.getRGB(rx, ry));

doen.

IMHO kun je hiervoor trouwens beter een AffineTransform gebruiken, maar je gaf aan het begin aan dat je niet met bestaande classes wil werken (wat imho best positief is in een tijd waarin veel mensen lukraak componenten aan elkaar rijgen zonder dat ze weten hoe ze precies werken :) )

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Tsjipmanz
  • Registratie: Oktober 2000
  • Laatst online: 13-05 14:52

Tsjipmanz

Der Rudi ist da

Hmm, Janoz, ik denk niet dat Nick Efford dit leuk zal vinden gezien de tekst voor in het boek:
No part of this publication may be reproduced [...] without the prior written permission of the publisher or a licence permitting restricted copying in the United Kingdom ussued by the Copyrifgt Licensing Agency Ltd, 90 Tottenham Court Road, Londom W1P 0LP.
Misschien is het dan wel zo netjes om de bron te vermelden (Digital Image Processing, a practical intorduction using Java - Nick Efford - ISBN 0-201-59623-7).

Dan kan Scorpion dat boek kopen en Nick nog wat extra centjes verdienen en word jij misschien niet aangeklaagd :)

There's no such thing as a mistake, just happy accidents - Bob Ross
Relaxte muziek: altijd okee!
- Soulseek rulez -


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:51

Janoz

Moderator Devschuur®

!litemod

Ik denk niet dat iemand slechts voor dit kleine klusje een boek van fl140,- aan gaat schaffen. Jij wilde het niet eens voor een heel vak!

Daarnaast denk ik ook niet dat Nick vaak op nederlandstalige fora rondneust :)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Tsjipmanz
  • Registratie: Oktober 2000
  • Laatst online: 13-05 14:52

Tsjipmanz

Der Rudi ist da

Op http://www.comp.leeds.ac.uk/staff/nde.html staat zn mailadres wel! :) Kan je gaan afpersen ;) Maar dit gaat teveel offtopic.

There's no such thing as a mistake, just happy accidents - Bob Ross
Relaxte muziek: altijd okee!
- Soulseek rulez -


  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

Topicstarter
jo, raden jullie me es ff een goed wiskunde boek aan, ik moet ff een goed boek voor wiskunde hebben met betrekking tot linaire algebra, etc... verdiep me in 3d coden, maar mijn wiskunde kennis is vrij beperkt... dus moet ff een goed boek hebben.
Pagina: 1