/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Antialias-problem
Fra : Rune Zedeler


Dato : 10-02-07 01:54

Som sagt i tidligere post foretrækker jeg at undgå antialias, men hvis
der ikke er nogen vej udenom...

Antialias forsøger at emulere at man arbejder i højere opløsning, ved at
farve pixels, der kun er "delvist fyldte" lysere. Hvis f.eks. halvdelen
af en pixel er sort og den anden halvdel er hvid skal resultatet være
mellemgråt.
Dette lille program tegner en figur bestående af tre tynde sorte linjer,
hvoraf to af dem ligger oven i hinanden, og tegner den med antialias:

import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
public class TestGfx2D extends JPanel {
public TestGfx2D() {
JFrame f = new JFrame();
setPreferredSize(new Dimension(1024,768));
f.add(this);
f.pack();
f.setVisible(true);
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.scale(.25,.25);

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_PURE);

GeneralPath p = new GeneralPath();
p.moveTo(100,2000);
p.lineTo(2000,2200);
p.moveTo(100,2500);
p.lineTo(2000,2700);
p.moveTo(100,2500);
p.lineTo(2000,2700);
g2.draw(p);
}
public static void main(String[] args) {
new TestGfx2D();
}
}

Da stregerne er 1/4 pixel tykke skal de være lysegrå. Da man ikke kan se
forskel på en sort streg og to sorte streger tegnet oven i hinaden skal
de to streger være ens.
Desværre bliver den nederste streg (der består af to streger oven i
hinanden) mørkere, hvilket er ukorrekt.
Hvordan får jeg ægte antialias?

-Rune

 
 
Filip Larsen (10-02-2007)
Kommentar
Fra : Filip Larsen


Dato : 10-02-07 14:56

Rune Zedeler wrote:

> Da stregerne er 1/4 pixel tykke skal de være lysegrå. Da man ikke kan se
> forskel på en sort streg og to sorte streger tegnet oven i hinaden skal
> de to streger være ens.
> Desværre bliver den nederste streg (der består af to streger oven i
> hinanden) mørkere, hvilket er ukorrekt.

Så vidt jeg kan se er det et ganske "korrekt" effekt med antialiasering,
da tegneoperationer indenfor een pixel jo netop bliver "slået sammen i
rum".

> Hvordan får jeg ægte antialias?

Du kan få en bedre antialisering ved først at tegne et billede i høj
opløsning og derefter reducere opløsningen inden rendering på skærmen. I
dit tilfælde kører du med 1/4 pixel linjebredde, så hvis du tegner i 4x4
så stor opløsning og nedsampler skulle du få præcis hvad du ønsker.

Du kan også forsøge at klippe grafiske elementer der skygger for
hinanden væk på modelniveau, ganske som man bliver nødt til at gøre i
3D-rendering hvor man ikke kan benytte malermetoden, fx. som ved
udskrivning til plotter. Dine linjer kan du fx. modellere som aflange 2D
rektangler som du klipper mod hinanden ved skæring. Du kunne måske
ovenikøbet lave (eller finde) en generel Path konverteringsmetode så du
kan "selv-klippe" en vilkårlig Path.


Mvh,
--
Filip Larsen

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste