mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/terrain/DomainUtil.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2003, The Institute for Genomic Research (TIGR).
2 26 Feb 07 jari 3 All rights reserved.
2 26 Feb 07 jari 4 */
2 26 Feb 07 jari 5 /*
2 26 Feb 07 jari 6  * $RCSfile: DomainUtil.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.4 $
2 26 Feb 07 jari 8  * $Date: 2006/02/23 20:59:56 $
2 26 Feb 07 jari 9  * $Author: caliente $
2 26 Feb 07 jari 10  * $State: Exp $
2 26 Feb 07 jari 11  */
2 26 Feb 07 jari 12 package org.tigr.microarray.mev.cluster.gui.impl.terrain;
2 26 Feb 07 jari 13
2 26 Feb 07 jari 14 import java.awt.Color;
2 26 Feb 07 jari 15 import java.awt.GradientPaint;
2 26 Feb 07 jari 16 import java.awt.Graphics2D;
2 26 Feb 07 jari 17 import java.awt.image.BufferedImage;
2 26 Feb 07 jari 18
2 26 Feb 07 jari 19 import javax.vecmath.Point2f;
2 26 Feb 07 jari 20
2 26 Feb 07 jari 21 public class DomainUtil {
2 26 Feb 07 jari 22
2 26 Feb 07 jari 23     private static final float MAX_HEIGHT = 0.2f;
2 26 Feb 07 jari 24     /**
2 26 Feb 07 jari 25      * @param locations - the array of (x,y) normalized coords from 0f to 1f values.
2 26 Feb 07 jari 26      * @param energy - the array of genes energy. 
2 26 Feb 07 jari 27      * @param size - a desired size of the output array.
2 26 Feb 07 jari 28      * @return a square array of heights.
2 26 Feb 07 jari 29      */
2 26 Feb 07 jari 30     public static float[][] getHeights(float[][] locations, int size, float sigma) {
2 26 Feb 07 jari 31         return getHeights(locations, size, sigma, new Point2f(), new Point2f(1, 1));
2 26 Feb 07 jari 32     }
2 26 Feb 07 jari 33
2 26 Feb 07 jari 34     /**
2 26 Feb 07 jari 35      * @param locations - the array of (x,y) normalized coords from 0f to 1f values.
2 26 Feb 07 jari 36      * @param energy - the array of genes energy. 
2 26 Feb 07 jari 37      * @param size - a desired size of the output array.
2 26 Feb 07 jari 38      * @param p1 - left upper corner of the selection area.
2 26 Feb 07 jari 39      * @param p2 - right bottom corner of the selection area.
2 26 Feb 07 jari 40      * @return a square array of heights.
2 26 Feb 07 jari 41      */
2 26 Feb 07 jari 42     public static float[][] getHeights(float[][] locations, int size, float sigma, Point2f p1, Point2f p2) {
2 26 Feb 07 jari 43         float side_size = Math.max(Math.abs(p2.x-p1.x), Math.abs(p2.y-p1.y));
2 26 Feb 07 jari 44         float step = side_size/size;
2 26 Feb 07 jari 45         float x1 = p1.x+step/2;
2 26 Feb 07 jari 46         float y1 = p1.y+step/2;
2 26 Feb 07 jari 47         float x2;
2 26 Feb 07 jari 48         float y2;
2 26 Feb 07 jari 49         float sum;
2 26 Feb 07 jari 50         float[][] heights = new float[size][size];
2 26 Feb 07 jari 51         for (int i=0; i<size; i++) {
2 26 Feb 07 jari 52             for (int j=0; j<size; j++) {
2 26 Feb 07 jari 53                 sum = 0f;
2 26 Feb 07 jari 54                 for (int gene=0; gene<locations.length; gene++) {
2 26 Feb 07 jari 55                     x2 = locations[gene][0];
2 26 Feb 07 jari 56                     y2 = locations[gene][1];
2 26 Feb 07 jari 57                     sum += disperse(sigma, x1, y1, x2, y2);
2 26 Feb 07 jari 58                 }
2 26 Feb 07 jari 59                 heights[i][j] = sum;
2 26 Feb 07 jari 60                 x1 += step;
2 26 Feb 07 jari 61             }
2 26 Feb 07 jari 62             x1 = p1.x+step/2;
2 26 Feb 07 jari 63             y1 += step;
2 26 Feb 07 jari 64         }
2 26 Feb 07 jari 65         normalize(heights);
2 26 Feb 07 jari 66         return heights;
2 26 Feb 07 jari 67     }
2 26 Feb 07 jari 68
2 26 Feb 07 jari 69     private static void normalize(float[][] heights) {
2 26 Feb 07 jari 70         int size = heights.length;
2 26 Feb 07 jari 71         float min = Float.MAX_VALUE;
2 26 Feb 07 jari 72         float max = -Float.MAX_VALUE;
2 26 Feb 07 jari 73         for (int i=0; i<size; i++) {
2 26 Feb 07 jari 74             for (int j=0; j<size; j++) {
2 26 Feb 07 jari 75                 min = Math.min(min, heights[i][j]);
2 26 Feb 07 jari 76                 max = Math.max(max, heights[i][j]);
2 26 Feb 07 jari 77             }
2 26 Feb 07 jari 78         }
2 26 Feb 07 jari 79         float scale = max == min ? 1f : MAX_HEIGHT/(max-min);
2 26 Feb 07 jari 80         for (int i=0; i<size; i++) {
2 26 Feb 07 jari 81             for (int j=0; j<size; j++) {
2 26 Feb 07 jari 82                 heights[i][j] = (heights[i][j]-min)*scale;
2 26 Feb 07 jari 83             }
2 26 Feb 07 jari 84         }
2 26 Feb 07 jari 85     }
2 26 Feb 07 jari 86
2 26 Feb 07 jari 87     /**
2 26 Feb 07 jari 88      * @return a disperse value.
2 26 Feb 07 jari 89      */
2 26 Feb 07 jari 90     private static double disperse(float sigma, float x1, float y1, float x2, float y2) {
2 26 Feb 07 jari 91         float r2 = (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
2 26 Feb 07 jari 92         float sigma2 = sigma*sigma;
2 26 Feb 07 jari 93         if (r2 > 4*sigma2) return 0;
2 26 Feb 07 jari 94         return Math.exp(-r2/(2*sigma2));
2 26 Feb 07 jari 95     }
2 26 Feb 07 jari 96
2 26 Feb 07 jari 97     public static BufferedImage createGradientImage(int size) {
2 26 Feb 07 jari 98         BufferedImage gradient = new BufferedImage(size, 1, BufferedImage.TYPE_3BYTE_BGR);
2 26 Feb 07 jari 99         //BufferedImage image = (BufferedImage)this.createImage(size, 1);
2 26 Feb 07 jari 100         Graphics2D graphics = gradient.createGraphics();
2 26 Feb 07 jari 101         GradientPaint gp = new GradientPaint(0, 0, Color.green, size-1, 0, Color.red);
2 26 Feb 07 jari 102         graphics.setPaint(gp);
2 26 Feb 07 jari 103         graphics.drawRect(0, 0, size-1, 1);
2 26 Feb 07 jari 104         graphics.dispose();
2 26 Feb 07 jari 105         return gradient;
2 26 Feb 07 jari 106     }
2 26 Feb 07 jari 107 }