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