Revision 19945

View differences:

trunk/extensions/extRasterTools-SE/src-test-ui/org/gvsig/raster/beans/canvas/GCanvasTest.java
25 25
import org.gvsig.raster.beans.canvas.layers.GraphicHistogram;
26 26
import org.gvsig.raster.beans.canvas.layers.InfoLayer;
27 27
import org.gvsig.raster.beans.canvas.layers.MinMaxLines;
28
import org.gvsig.raster.beans.canvas.layers.functions.BaseFunction;
29
import org.gvsig.raster.beans.canvas.layers.functions.StraightLine;
28
import org.gvsig.raster.beans.canvas.layers.functions.LogaritmicExponentialLine;
30 29
import org.gvsig.rastertools.TestUI;
31 30
/**
32 31
 * Test para comprobar el funcionamiento basico de un GCanvas
......
37 36
public class GCanvasTest implements IGCanvasListener {
38 37
	private TestUI       jFrame = null;
39 38
	private GCanvas  component = null;
40
	private BaseFunction line = null;
39
	private LogaritmicExponentialLine line = null;
41 40
	private MinMaxLines  minMaxLines = null;
42 41
	private InfoLayer infoLayer = null;
43 42

  
......
51 50
		GraphicHistogram gHistR = new GraphicHistogram(histR, Color.RED);
52 51
		gHistR.setType(GraphicHistogram.TYPE_FILL);
53 52
		
54
		line = new StraightLine(Color.YELLOW);
53
		line = new LogaritmicExponentialLine(Color.YELLOW, -1.0);
55 54
		//line = new ExponentialLine(Color.YELLOW);
56 55
		//line = new LogaritmicLine(Color.YELLOW);
57 56
		DrawableElement border = new Border(Color.WHITE);
trunk/extensions/extRasterTools-SE/src/org/gvsig/raster/beans/canvas/layers/functions/ExponentialLine.java
1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19
package org.gvsig.raster.beans.canvas.layers.functions;
20

  
21
import java.awt.Color;
22
import java.awt.Graphics;
23

  
24
import org.gvsig.raster.beans.canvas.GCanvas;
25

  
26

  
27
/**
28
 * Representa una linea con incremento exponencial.
29
 *
30
 * 14-oct-2007
31
 * @author Nacho Brodin (nachobrodin@gmail.com)
32
 */
33
public class ExponentialLine extends BaseFunction {
34
	int[]                    xPoints = null;
35
	int[]                    yPoints = null;
36
	
37
	/**
38
	 * Constructor. Asigna el color
39
	 * @param c
40
	 */
41
	public ExponentialLine(Color c) {
42
		setColor(c);
43
	}
44
	
45
	/*
46
	 *  (non-Javadoc)
47
	 * @see org.gvsig.gui.beans.canvas.DrawableElement#firstDraw()
48
	 */
49
	public void firstDrawActions() {
50
		xPoints = new int[canvas.getCanvasWidth()];
51
		yPoints = new int[canvas.getCanvasHeight()];
52
		double pos = Math.log(canvas.getCanvasMinY());
53
		double max = Math.log(canvas.getCanvasMaxY());
54
		double increase =  (max - pos) / canvas.getCanvasHeight();
55
		for (int i = canvas.getCanvasMinY(); i < canvas.getCanvasMaxY(); i++) {
56
			try {
57
			//yPoints[i] = value - (int)(value * Math.exp((double)i / 64) / Math.exp(3));
58
			yPoints[i - canvas.getCanvasMinY()] = canvas.getCanvasHeight() - (int)Math.round(Math.exp(pos));
59
			xPoints[i - canvas.getCanvasMinX()] = i;
60
			//System.out.println(xPoints[i] + " " + yPoints[i]);
61
			//System.out.println(Math.exp((double)i/85));
62
			System.out.println(xPoints[i - canvas.getCanvasMinX()] + " : " + pos + " : " + yPoints[i - canvas.getCanvasMinY()]);
63
			pos += increase;
64
			} catch(ArrayIndexOutOfBoundsException e) {}
65
		}
66
	}
67
	
68
	/**
69
	 * Dibujado de la l?nea de incremento exponencial sobre el canvas.
70
	 */
71
	protected void paint(Graphics g) {
72
		super.paint(g);
73
		g.setColor(color);
74
		g.drawPolyline(xPoints, yPoints, xPoints.length);
75
	}
76

  
77
	/**
78
	 * Asigna el objeto JComponent donde se pintan los elementos. Inicializa los puntos
79
	 * de inicio y fin de l?nea y asigna los listener
80
	 * @param canvas
81
	 */
82
	public void setCanvas(GCanvas canvas) {
83
		super.setCanvas(canvas);
84
	}
85

  
86
	public void firstActions() {}
87
}
trunk/extensions/extRasterTools-SE/src/org/gvsig/raster/beans/canvas/layers/functions/LogaritmicLine.java
1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19
package org.gvsig.raster.beans.canvas.layers.functions;
20

  
21
import java.awt.Color;
22
import java.awt.Graphics;
23

  
24
import org.gvsig.raster.beans.canvas.GCanvas;
25

  
26
/**
27
 * Representa una linea con incremento logaritmico.
28
 *
29
 * 14-oct-2007
30
 * @author Nacho Brodin (nachobrodin@gmail.com)
31
 */
32
public class LogaritmicLine extends BaseFunction {
33
	
34
	int[]                    xPoints = null;
35
	int[]                    yPoints = null;
36
	
37
	/**
38
	 * Constructor. Asigna el color
39
	 * @param c
40
	 */
41
	public LogaritmicLine(Color c) {
42
		setColor(c);
43
	}
44
	
45
	/*
46
	 *  (non-Javadoc)
47
	 * @see org.gvsig.gui.beans.canvas.DrawableElement#firstDraw()
48
	 */
49
	public void firstDrawActions() {
50
		int value = Math.min(canvas.getCanvasWidth(), canvas.getCanvasHeight());
51
		xPoints = new int[value];
52
		yPoints = new int[value];
53
		int pos = 0;
54
		for (int i = canvas.getCanvasMinY(); i < canvas.getCanvasMaxY(); i++) {
55
			yPoints[pos] = value - (int)(value * Math.log(1 + pos) / Math.log(value + 1));
56
			xPoints[pos] = i;
57
			//System.out.println(xPoints[pos] + " " + yPoints[pos]);
58
			pos ++;
59
		}
60
	}
61
	
62
	/**
63
	 * Dibujado de las l?nea de incremento logaritmico sobre el canvas
64
	 */
65
	protected void paint(Graphics g) {
66
		super.paint(g);
67
		g.setColor(color);
68
		g.drawPolyline(xPoints, yPoints, xPoints.length);
69
	}
70

  
71
	/**
72
	 * Asigna el objeto JComponent donde se pintan los elementos. Inicializa los puntos
73
	 * de inicio y fin de l?nea y asigna los listener
74
	 * @param canvas
75
	 */
76
	public void setCanvas(GCanvas canvas) {
77
		super.setCanvas(canvas);
78
	}
79

  
80
	public void firstActions() {}
81
}
trunk/extensions/extRasterTools-SE/src/org/gvsig/raster/beans/canvas/layers/functions/LogaritmicExponentialLine.java
1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19
package org.gvsig.raster.beans.canvas.layers.functions;
20

  
21
import java.awt.Color;
22
import java.awt.Cursor;
23
import java.awt.event.MouseEvent;
24
import java.util.ArrayList;
25

  
26
import org.gvsig.raster.beans.canvas.layers.InfoLayer;
27
import org.gvsig.raster.util.RasterToolsUtil;
28
/**
29
 * Representa una funcion con posibilidad de arrastre para las funciones
30
 * logaritmicas y exponenciales. Con el raton se puede pasar de una a otra
31
 * directamente.
32
 * 
33
 * Las formas mas logicas de uso seria pasandole:
34
 * 1.0: Para una funcion logaritmica
35
 * -1.0: Para una funcion exponencial
36
 * 0.0: Para una funcion lineal
37
 * 
38
 * @version 02/04/2008
39
 * @author BorSanZa - Borja S?nchez Zamorano (borja.sanchez@iver.es)
40
 */
41
public class LogaritmicExponentialLine extends StraightLine {
42
	/**
43
	 * Numero de puntos que contiene esta funci?n
44
	 */
45
	double num = 50.0;
46
	
47
	/**
48
	 * Constructor. Asigna el color y establece la posicion de la funcion.
49
	 * Los valores normales son 1.0 para logaritmica y -1.0 para exponencial.
50
	 * El rango va desde -2.0 hasta 2.0. Siendo 0.0 una funcion lineal.
51
	 * @param c
52
	 */
53
	public LogaritmicExponentialLine(Color c, double point) {
54
		super(c);
55
		setShowSquares(false);
56

  
57
		recalcList(point);
58
	}
59

  
60
	/**
61
	 * Actualiza la barra informativa para saber en que estado se encuentra el
62
	 * componente.
63
	 * Cuando el porcentaje es mayor a 0 siempre estamos en la Logaritmica
64
	 * Cuando el porcentaje es menor a 0 siempre estamos en la exponencial
65
	 * @param perc
66
	 */
67
	private void setInfoPoint(Double perc) {
68
		if (canvas != null) {
69
			ArrayList list = canvas.getDrawableElements(InfoLayer.class);
70
			if (list.size() > 0) {
71
				InfoLayer infoLayer = (InfoLayer) list.get(0);
72
				
73
				if (perc == null) {
74
					infoLayer.setStatusLeft(null);
75
					infoLayer.setStatusRight(null);
76
					canvas.repaint();
77
					return;
78
				}
79

  
80
				if (perc.doubleValue() > 0.0)
81
					infoLayer.setStatusLeft(RasterToolsUtil.getText(this, "logarithmical"));
82
				else
83
					infoLayer.setStatusLeft(RasterToolsUtil.getText(this, "exponential"));
84
				infoLayer.setStatusRight("");
85
			}
86
		}
87
	}
88
	
89
	/**
90
	 * Recalcula todos los puntos de la funcion
91
	 * Posibles rangos para perc:
92
	 * ( 0.0 a  1.0) - Funcion logaritmica con aproximacion al centro
93
	 * ( 1.0 a  2.0) - Funcion logaritmica con aproximacion al borde
94
	 * ( 0.0 a -1.0) - Funcion exponencial con aproximacion al centro
95
	 * (-1.0 a -2.0) - Funcion exponencial con aproximacion al borde
96
	 * 
97
	 * @param perc
98
	 */
99
	private void recalcList(double perc) {
100
		double x, y;
101
		
102
		setInfoPoint(new Double(perc));
103

  
104
		if (perc > 2.0) perc = 2.0;
105
		if (perc < -2.0) perc = -2.0;
106
		
107
		this.listSquare.clear();
108
		this.listSquare.add(new Square(0.0, 0.0));
109
		do {
110
			// Aproximacion al centro de una funcion logaritmica
111
			if (perc >= 0 && perc <= 1.0) {
112
				for (int i = 1; i < num; i++) {
113
					x = i / num;
114
					y = Math.log10(1.0 + (i * 99.0 / num)) / 2.0;
115
	
116
					y = x + ((y - x) * perc);
117
	
118
					this.listSquare.add(new Square(x, y));
119
				}
120
				break;
121
			}
122
			// Aproximacion al borde de una funcion logaritmica
123
			if (perc >= 1.0 && perc <= 2.0) {
124
				for (int i = 1; i < num; i++) {
125
					x = i / num;
126
					y = Math.log10(1.0 + (i * 99.0 / num)) / 2.0;
127
	
128
					y = y + ((1.0 - y) * (perc - 1.0));
129
	
130
					this.listSquare.add(new Square(x, y));
131
				}
132
				break;
133
			}
134
			// Aproximacion al centro de una funcion exponencial
135
			if (perc >= -1.0 && perc <= 0.0) {
136
				for (int i = 1; i < num; i++) {
137
					x = i / num;
138
					double b = 6.0;
139
					y = (Math.exp(((i - 1.0) / num) * b) - 1.0) / (Math.exp(b) - 1.0);
140
	
141
					y = x - ((x - y) * Math.abs(perc));
142
	
143
					this.listSquare.add(new Square(x, y));
144
				}
145
				break;
146
			}
147
			// Aproximacion al borde de una funcion exponencial
148
			if (perc >= -2.0 && perc <= -1.0) {
149
				for (int i = 1; i < num; i++) {
150
					x = i / num;
151
					double b = 6.0;
152
					y = (Math.exp(((i - 1.0) / num) * b) - 1.0) / (Math.exp(b) - 1.0);
153
	
154
					y = y * (1.0 - (Math.abs(perc) - 1.0));
155
	
156
					this.listSquare.add(new Square(x, y));
157
				}
158
				break;
159
			}
160
		} while (false);
161
		this.listSquare.add(new Square(1.0, 1.0));
162
	}
163
	
164
	/* (non-Javadoc)
165
	 * @see org.gvsig.raster.beans.canvas.layers.functions.StraightLine#mouseDragged(java.awt.event.MouseEvent)
166
	 */
167
	public boolean mouseDragged(MouseEvent e) {
168
		if (canvas.getCursor().getType() != Cursor.DEFAULT_CURSOR)
169
			return true;
170

  
171
		double x = pixelToValueX(e.getX());
172
		double y = pixelToValueY(e.getY());
173
		
174
		double perc = 0.0;
175
		
176
		// Localizamos el punto del raton para pasar un porcentaje correcto y que 
177
		// asi coincida la funcion con el raton
178
		if (y >= x) {
179
			double	y2 = Math.log10(1.0 + (x * 99.0)) / 2.0;
180
			if (y < y2)
181
				perc = (y - x) / (y2 - x);
182
			else
183
				perc = ((y - y2) / (1.0 - y2)) + 1.0;
184
		} else {
185
			double	y2 = 1.0 - (Math.log10(1.0 + ((1.0 - x) * 99.0)) / 2.0);
186
			y2 = (Math.exp(x * 6.0) - 1.0) / (Math.exp(6.0) - 1.0);
187
			
188
			if (y > y2)
189
				perc = -Math.abs((y - x) / (y2 - x));
190
			else
191
				perc = -Math.abs((y2 - y) / y2)  - 1.0;
192
		}
193
		
194
		recalcList(perc);
195
		canvas.repaint();
196
		canvas.callDataDragged("line", this);
197
		return false;
198
	}
199

  
200
	/* (non-Javadoc)
201
	 * @see org.gvsig.raster.beans.canvas.layers.functions.StraightLine#mouseMoved(java.awt.event.MouseEvent)
202
	 */
203
	public boolean mouseMoved(MouseEvent e) {
204
		return true;
205
	}
206

  
207
	/* (non-Javadoc)
208
	 * @see org.gvsig.raster.beans.canvas.layers.functions.StraightLine#mousePressed(java.awt.event.MouseEvent)
209
	 */
210
	public boolean mousePressed(MouseEvent e) {
211
		return mouseDragged(e);
212
	}
213

  
214
	/* (non-Javadoc)
215
	 * @see org.gvsig.raster.beans.canvas.layers.functions.StraightLine#mouseReleased(java.awt.event.MouseEvent)
216
	 */
217
	public boolean mouseReleased(MouseEvent e) {
218
		setInfoPoint(null);
219
		return true;
220
	}
221
}
trunk/extensions/extRasterTools-SE/src/org/gvsig/raster/beans/canvas/layers/functions/StraightLine.java
52 52
		private double y      = 0.0D;
53 53
		private int    width  = 6;
54 54
		private Color  color  = Color.WHITE;
55
		private int    border = 2;
56 55
		
57 56
		
58 57
		/**
......
158 157
			return (int) Math.round(canvas.getCanvasMinX() + border + ((canvas.getCanvasMaxX() - canvas.getCanvasMinX() - (border * 2)) * value));
159 158
		}
160 159

  
161
		private double pixelToValueX(int pixel) {
162
			double value = ((double) (pixel - canvas.getCanvasMinX() - border) / (double) (canvas.getCanvasMaxX() - canvas.getCanvasMinX() - (border * 2.0D)));
163
			
164
			value = (value - minx) / (maxx - minx);
165
			
166
			return value;
167
		}
168

  
169 160
		private int valueToPixelY(double value) {
170 161
			value = 1.0D - value;
171 162
			return (int) Math.round(canvas.getCanvasMinY() + border + ((canvas.getCanvasMaxY() - canvas.getCanvasMinY() - (border * 2)) * value));
172 163
		}
173 164

  
174
		private double pixelToValueY(int pixel) {
175
			double div = (double) (canvas.getCanvasMaxY() - canvas.getCanvasMinY() - (border * 2.0D));
176
			if (div == 0.0D)
177
				return 0.0D;
178
			
179
			return (1.0D - ((double) (pixel - canvas.getCanvasMinY() - border) / div));
180
		}
181 165
	}
182 166
	
183 167
	/**
184 168
	 * Lista de cuadrados que intersectan con la recta
185 169
	 */
186
	protected ArrayList   listSquare        = new ArrayList();
187
	private int           pointDragged      = -1;
188
	Cursor                transparentCursor = null;
170
	protected ArrayList listSquare        = new ArrayList();
171
	private int         pointDragged      = -1;
172
	private Cursor      transparentCursor = null;
173
	private boolean     showSquares       = true;
174
	private int         border            = 2;
189 175
	
190 176
	/**
191 177
	 * Constructor. Asigna el color
......
229 215
		}
230 216

  
231 217
		// Dibujamos los cuadrados de los puntos
232
		for (int i = 0; i < listSquare.size(); i++) {
233
			square = ((Square) listSquare.get(i));
234
			square.setColor(color);
235
			if (pointDragged != i)
236
				square.paint(g);
237
			else
238
				square.paintCursor(g);
218
		if (showSquares) {
219
			for (int i = 0; i < listSquare.size(); i++) {
220
				square = ((Square) listSquare.get(i));
221
				square.setColor(color);
222
				if (pointDragged != i)
223
					square.paint(g);
224
				else
225
					square.paintCursor(g);
226
			}
239 227
		}
240 228

  
241 229
		if (pointDragged != -1) {
......
496 484
	
497 485
	public void firstActions() {}
498 486
	public void firstDrawActions() {}
487

  
488
	/**
489
	 * @param showSquares the showSquares to set
490
	 */
491
	public void setShowSquares(boolean showSquares) {
492
		this.showSquares = showSquares;
493
	}
494

  
495
	protected double pixelToValueX(int pixel) {
496
		double value = ((double) (pixel - canvas.getCanvasMinX() - border) / (double) (canvas.getCanvasMaxX() - canvas.getCanvasMinX() - (border * 2.0D)));
497
		
498
		value = (value - minx) / (maxx - minx);
499
		
500
		return value;
501
	}
502

  
503
	protected double pixelToValueY(int pixel) {
504
		double div = (double) (canvas.getCanvasMaxY() - canvas.getCanvasMinY() - (border * 2.0D));
505
		if (div == 0.0D)
506
			return 0.0D;
507
		
508
		return (1.0D - ((double) (pixel - canvas.getCanvasMinY() - border) / div));
509
	}
499 510
}
trunk/extensions/extRasterTools-SE/src/org/gvsig/rastertools/enhanced/ui/EnhancedListener.java
198 198

  
199 199
			}
200 200
			if(((String)selectorsPanel.getEnhancedType().getSelectedItem()).equals("Logaritmic")) {
201

  
201
				graphicsPanel.getInputHistogram().setFunction(GraphicHistogram.FUNCTION_LOGARIT);
202
				updatePreview();
202 203
			}
203 204
			if(((String)selectorsPanel.getEnhancedType().getSelectedItem()).equals("Exponential")) {
204

  
205
				graphicsPanel.getInputHistogram().setFunction(GraphicHistogram.FUNCTION_EXPONENT);
206
				updatePreview();
205 207
			}
206 208
			if(((String)selectorsPanel.getEnhancedType().getSelectedItem()).equals("Equalization")) {
207 209
				int[] renderBands = enhancedDialog.getLayer().getRender().getRenderBands();
trunk/extensions/extRasterTools-SE/src/org/gvsig/rastertools/enhanced/graphics/InputHistogram.java
27 27
import org.gvsig.raster.beans.canvas.layers.MinMaxLines;
28 28
import org.gvsig.raster.beans.canvas.layers.functions.BaseFunction;
29 29
import org.gvsig.raster.beans.canvas.layers.functions.DensitySlicingLine;
30
import org.gvsig.raster.beans.canvas.layers.functions.LogaritmicExponentialLine;
30 31
import org.gvsig.raster.beans.canvas.layers.functions.StraightLine;
31 32
import org.gvsig.raster.datastruct.Histogram;
32 33
import org.gvsig.rastertools.enhanced.ui.EnhancedListener;
......
100 101
				if (!baseFunction.getClass().equals(StraightLine.class))
101 102
					baseFunction = new StraightLine(histogramDrawed.getBaseFunction().getColor());
102 103
				break;
104
			case GraphicHistogram.FUNCTION_LOGARIT:
105
				baseFunction = new LogaritmicExponentialLine(histogramDrawed.getBaseFunction().getColor(), 1.0);
106
				break;
107
			case GraphicHistogram.FUNCTION_EXPONENT:
108
				baseFunction = new LogaritmicExponentialLine(histogramDrawed.getBaseFunction().getColor(), -1.0);
109
				break;
103 110
		}
104 111
					
105 112
		histogramDrawed.setBaseFunction(baseFunction);

Also available in: Unified diff