Graficación UNIDAD II.- TRANSFORMACIONES GEOMÉTRICAS ___________________________________________________________________ LECCIÓN 2.1 Transformaciones bidimensionales. ___________________________________________________________________ 2.1.8.- Colores, Gradientes y Texturas Color: Para definir un color se utiliza el método setColor – void setColor(Color c) Colores: black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, white, yellow Creando un color basado en el contructor y los valores RGB – Color(int r, int g, int b); – Color(int rgb); – Color(float r, float g, float b); package ejemplosgraphics2d; import javax.swing.*; import java.awt.*; import java.awt.geom.*; public class Colores extends JPanel{ public void paintComponent(Graphics g){ int red = 255; int green = 255; int blue = 255; Graphics2D g2 = (Graphics2D)g; Shape rc = new Ellipse2D.Double(100, 113, 200, 200); Rafael Rivera López 1 Graficación Shape gc = new Ellipse2D.Double(50, 200, 200, 200); Shape bc = new Ellipse2D.Double(150, 200, 200, 200); Area ra = new Area(rc); Area ga = new Area(gc); Area ba = new Area(bc); Area rga = new Area(rc); rga.intersect(ga); Area gba = new Area(gc); gba.intersect(ba); Area bra = new Area(bc); bra.intersect(ra); Area rgba = new Area(rga); rgba.intersect(ba); ra.subtract(rga); ra.subtract(bra); ga.subtract(rga); ga.subtract(gba); ba.subtract(bra); ba.subtract(gba); // fill the color regions g2.setColor(new Color(red,0,0)); g2.fill(ra); g2.setColor(new Color(0,green,0)); g2.fill(ga); g2.setColor(new Color(0,0,blue)); g2.fill(ba); g2.setColor(new Color(red,green,0)); g2.fill(rga); g2.setColor(new Color(0,green,blue)); g2.fill(gba); g2.setColor(new Color(red,0,blue)); g2.fill(bra); g2.setColor(new Color(red,green,blue)); g2.fill(rgba); // draw three circles g2.setColor(Color.black); g2.draw(rc); g2.draw(gc); g2.draw(bc); } } Rafael Rivera López 2 Graficación Interfaz Paint – La interfaz Paint es una generalización de color. – Se utiliza el método setPaint(Paint p). Clase GredientPaint – Define el pintado usando varios colores. – Se define con dos puntos y dos colores. El color cambia del primero al segundo del punto inicial al final. – Este cambio puede ser cíclico o no Aciclico: – GradientPaint(float x1, float y1, Color c1, float x2, float y2, Color c2); Cíclico o acíclico: – GradientPaint(float x1, float y1, Color c1, float x2, float y2, Color c2, boolean cycl); Rafael Rivera López 3 Graficación Clase TexturePaint - Define una textura para un objeto gráfico. - TexturePaint(BufferImage image, Rectangle2D anchor); package ejemplosgraphics2d; import import import import import import javax.swing.*; java.awt.*; java.awt.geom.*; java.awt.image.*; javax.imageio.*; java.io.*; public class ClasePaint extends JPanel{ public void paintComponent(Graphics g){ BufferedImage image = null; try{ image = ImageIO.read(new File("World.jpg")); } catch(IOException e){ System.err.println("Error"); } Graphics2D g2 = (Graphics2D)g; GradientPaint gp = new GradientPaint(100,50,Color.white, 150,50, Color.gray, true); g2.setPaint(gp); g2.fillRect(100, 40, 300, 20); gp = new GradientPaint(100,50,Color.white, 150, 50, Color.gray, false); g2.setPaint(gp); g2.fillRect(100, 80, 300, 20); TexturePaint tp = new TexturePaint(image, new Rectangle2D.Double(100, 100, image.getWidth(),image.getHeight())); g2.setPaint(tp); Shape ellipse = new Ellipse2D.Double(100, 100, image.getWidth(),image.getHeight()); g2.fill(ellipse); Rafael Rivera López 4 Graficación } GradientPaint paint = new GradientPaint(100, 300, Color.white, 400, 400, Color.black); g2.setPaint(paint); Font font = new Font("Serif", Font.BOLD, 144); g2.setFont(font); g2.drawString("Java", 100, 400); } 2.1.9.- Trazado de Líneas Trazos: Son los detalles del trazado de líneas Clase para trazado: BasicStroke. – BasicStroke() – BasicStroke(float width) – BasicStroke(float width, int cap, int join) – BasicStroke(float width, int cap, int join, float miterlimit) – BasicStroke(float width, int cap, int join, float miterlimit, float[] dash, float dashphase) Tabla: Parámetros para el trazado Parámetros Descripción width El ancho del trazo. cap Estilo de la terminación de la línea: CAP_BUTT, CAP_ROUND, CAP_SQUARE join El estilo de la unión de trazos: JOIN_BEVEL, JOIN_MITER, JOIN_ROUND miterlimit Ajusta el límite de un JOIN_MITER cuando el ángulo dentre las líneas es muy pequeño. dash El patrón de punteado de los segmetos dashphase El punto inicial del patron de punteado. Rafael Rivera López 5 Graficación El método que se utiliza para definir un trazo es: – void setStroke(Stroke s) package ejemplosgraphics2d; import javax.swing.*; import java.awt.*; import java.awt.geom.*; public class Trazos extends JPanel{ public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; GeneralPath path = new GeneralPath(GeneralPath.WIND_EVEN_ODD); path.moveTo(0,120); path.lineTo(80,0); path.lineTo(160,120); Stroke stroke = new BasicStroke(20, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); g2.setStroke(stroke); g2.translate(50,50); g2.draw(path); g2.drawString("JOIN_BEVEL",100,0); g2.drawString("CAP_BUTT", 40, 120); stroke = new BasicStroke(20, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER); g2.setStroke(stroke); g2.translate(200,0); g2.draw(path); g2.drawString("JOIN_MITER",100,0); g2.drawString("CAP_ROUND", 40, 120); stroke = new BasicStroke(20,BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND); g2.setStroke(stroke); g2.translate(200,0); g2.draw(path); g2.drawString("JOIN_ROUND",100,0); g2.drawString("CAP_SQUARE", 40, 120); float[] dashArray = {60,20,20,40}; float dashPhase = 0; stroke = new BasicStroke(10, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, dashArray, dashPhase); Rafael Rivera López 6 Graficación g2.setStroke(stroke); g2.translate(-400,200); g2.drawLine(100, 50, 550, 50); g2.drawString("dash=60 20 20 40", 250, 10); g2.drawString("phase=0", 0, 50); dashPhase = 20; stroke = new BasicStroke(10, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, dashArray, dashPhase); g2.setStroke(stroke); g2.translate(0,50); g2.drawLine(100, 50, 550, 50); g2.drawString("phase=20", 0, 50); } } 2.1.10.- Transformación afín Una trasformación afín genera un objeto gráfico que conserva las líneas paralelas – Traslación – Rotación – Reflexión – Escalado – Cizallado Clase AffineTransform: Define una transformación afín: void setToRotation(double theta) void setToRotation(double theta, double x, double y) void setToScale(double sx, double sy) void setToShear(double shx, double shy) void setToTranslation(double tx, double ty) Rafael Rivera López 7 Graficación Forma de definir una transformación afín: – – – AffineTransform tr = new AffineTransform(); tr.setToTranslation(x,y); Shape x = tr.createTransformedShape(drawShape); package ejemplosgraphics2d; import javax.swing.*; import java.awt.*; import java.awt.geom.*; public class Traslación extends JPanel{ public void paintComponent(Graphics g){ Graphics2D g2 = (Graphics2D)g; GeneralPath path = new GeneralPath(GeneralPath.WIND_EVEN_ODD); path.moveTo(0,120); path.lineTo(80,0); path.lineTo(160,120); AffineTransform tr = new AffineTransform(); tr.setToTranslation(200,200); Shape path1 = tr.createTransformedShape(path); g2.draw(path); g2.draw(path1); } } Rafael Rivera López 8