package org.jzy3d.plot3d.rendering.view;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
// import org.apache.log4j.Logger;
import org.jzy3d.chart.Chart;
import org.jzy3d.maths.IntegerCoord2d;
import org.jzy3d.maths.PolygonArray;
import org.jzy3d.maths.Rectangle;
import org.jzy3d.maths.Statistics;
/** Helps understanding how overlay is actually performed by JOGL2. */
public class OverlayUtils {
// static Logger logger = Logger.getLogger(OverlayUtils.class);
public void drawSelection(Graphics2D g2d, IntegerCoord2d in, int width, int height) {
// shows mouse pointer
//IntegerCoord2d trans = viewportToCanvas( in );
//drawPixel(g2d, java.awt.Color.RED, trans.x, trans.y, 6); // the canvas coordinates are stretched by overlay afterward
//drawCanvasAndViewportDiagonalComparison(g2d);
}
public static void drawCanvasAndViewportDiagonalComparison(Chart chart, Graphics2D g2d){
// chart diagonal displayed on viewport diagonal!!
int wmax = chart.getCanvas().getRendererWidth();
int hmax = chart.getCanvas().getRendererHeight();
drawDiagonal(g2d, java.awt.Color.RED, wmax, hmax, true);
// viewport diagonal badly displayed!!
Rectangle r = chart.getView().getSceneViewportRectangle();
drawDiagonal(g2d, java.awt.Color.BLUE, r.width, r.height, false);
// logger.info(" BUT viewport.dim ("+r.width+","+r.height+")");
/// chart.getCanvas().getRendererWidth()
//g2d.drawRect(r.x, r.y, r.width, r.height);
drawChartBorder(g2d, java.awt.Color.GREEN, chart); // chart border is drawn on viewport border!
}
public static void drawPixel(Graphics2D g2d, java.awt.Color c, int x, int y, int width){
g2d.setColor(c);
if( width >= 2 )
g2d.fillRect(x-width/2, y-width/2, width, width);
else
g2d.fillRect(x, y, 1, 1);
}
public static void drawPixel(Graphics2D g2d, java.awt.Color c, int x, int y){
drawPixel(g2d, c, x, y, 1);
}
public static void drawText(Graphics2D g2d, java.awt.Color c, int x, int y, String txt){
g2d.setColor(c);
g2d.drawString(txt, x, y);
}
/** This shows a strange behaviour in the Overlay: when trying to draw a rectangle based on the CANVAS size (i.e. the window size),
* the border occupies the CHART (i.e. its actual viewport).*/
public static void drawChartBorder(Graphics2D g2d, java.awt.Color c, Chart chart){
g2d.setColor(c);
g2d.drawRect(1, 1, chart.getCanvas().getRendererWidth()-2, chart.getCanvas().getRendererHeight()-2);
// encadre le viewport du chart, ce qui montre que les coordonnees sont relative au viewport et
// pas a la fenetre
}
/** Diagonal made of points from (0,0) to (wmax, hmax).*/
public static void drawDiagonal(Graphics2D g2d, java.awt.Color c, int wmax, int hmax, boolean sysout){
int dmax = Math.max(wmax, hmax);
for (int i = 0; i < dmax; i++) { // try a diagonal
float r = ((float)i) / ((float)dmax);
int wcur = (int)( r * wmax );
int hcur = (int)( r * hmax );
//logger.info(wcur + " " + hcur);
drawPixel(g2d, c, wcur, hcur);
if(sysout){
if(i==0)
System.err.println(" diagonal from (" + wcur + "," + hcur + ")");
//logger.info(" diagonal from (" + wcur + "," + hcur + ")");
else if(i==(dmax-1))
System.err.println(" to (" + wcur + "," + hcur + ")");
//logger.info(" to (" + wcur + "," + hcur + ")");
}
}
}
/******************** CONVERSIONS **************************/
/** Needed when wishing to adapt a coordinate relative to the canvas to the viewport frame. If the mouse does not
* stand on top of the viewport (meaning the viewport is smaller than the canvas), then the output
* coordinate is (-1,-1).
*/
protected IntegerCoord2d canvasToViewport(MouseEvent e, Rectangle viewport){
if( viewport.x <= e.getX() && e.getX() <= (viewport.x+viewport.width)
&& viewport.y <= e.getY() && e.getY() <= (viewport.y+viewport.height) ){
IntegerCoord2d translation = new IntegerCoord2d( e.getX() - viewport.x, e.getY() - viewport.y );
return translation;
}
else{
return new IntegerCoord2d(-1,-1);
}
}
protected IntegerCoord2d canvasToViewport(IntegerCoord2d c, Rectangle viewport){
return canvasToViewport(viewport, c);
}
protected IntegerCoord2d canvasToViewport(Rectangle viewport, IntegerCoord2d c){
if( viewport.x <= c.x && c.x <= (viewport.x+viewport.width)
&& viewport.y <= c.y && c.y <= (viewport.y+viewport.height) ){
IntegerCoord2d translation = new IntegerCoord2d( c.x - viewport.x, c.y - viewport.y );
return translation;
}
else{
return new IntegerCoord2d(-1,-1);
}
}
protected PolygonArray canvasToViewport(PolygonArray p, Rectangle viewport){
int len = p.length();
float[] x = new float[len];
float[] y = new float[len];
for (int i = 0; i < len; i++)
x[i] = p.x[i] - viewport.x;
for (int j = 0; j < len; j++)
y[j] = p.y[j] - viewport.y;
return new PolygonArray(x, y, p.z);
}
/** Needed when wishing to display a coordinate relative to the viewport.
*
* Expect a coordinate in viewport frame to be converted to the canvas frame, since
* Overlay expect coordinates in the canvas frame and then stretch it to be displayed in viewport frame! */
protected IntegerCoord2d viewportToCanvas(Chart chart, IntegerCoord2d input, Rectangle viewport){
int canvasWidth = chart.getCanvas().getRendererWidth();
int canvasHeight = chart.getCanvas().getRendererHeight();
IntegerCoord2d output = new IntegerCoord2d();
output.x = (int)( ( ((float)input.x) / ((float)viewport.width) ) * canvasWidth );
output.y = (int)( ( ((float)input.y) / ((float)viewport.height) ) * canvasHeight );
return output;
}
protected void projectionStat(PolygonArray[][] array){
float min = Float.POSITIVE_INFINITY;
float max = Float.NEGATIVE_INFINITY;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
PolygonArray p = array[i][j];
float tmax = Statistics.max(p.x);
if(tmax > max)
max = tmax;
float tmin = Statistics.min(p.x);
if(tmin < min)
min = tmin;
}
}
// logger.info("xmin=" + min + " xmax=" + max);
}
}
Ads help maintain this website.