2 |
26 Feb 07 |
jari |
1 |
/* |
2 |
26 Feb 07 |
jari |
Copyright @ 1999-2003, The Institute for Genomic Research (TIGR). |
2 |
26 Feb 07 |
jari |
All rights reserved. |
2 |
26 Feb 07 |
jari |
4 |
*/ |
2 |
26 Feb 07 |
jari |
5 |
/* |
2 |
26 Feb 07 |
jari |
* $RCSfile: DomainUtil.java,v $ |
2 |
26 Feb 07 |
jari |
* $Revision: 1.4 $ |
2 |
26 Feb 07 |
jari |
* $Date: 2006/02/23 20:59:56 $ |
2 |
26 Feb 07 |
jari |
* $Author: caliente $ |
2 |
26 Feb 07 |
jari |
* $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 |
* @param locations - the array of (x,y) normalized coords from 0f to 1f values. |
2 |
26 Feb 07 |
jari |
* @param energy - the array of genes energy. |
2 |
26 Feb 07 |
jari |
* @param size - a desired size of the output array. |
2 |
26 Feb 07 |
jari |
* @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 |
* @param locations - the array of (x,y) normalized coords from 0f to 1f values. |
2 |
26 Feb 07 |
jari |
* @param energy - the array of genes energy. |
2 |
26 Feb 07 |
jari |
* @param size - a desired size of the output array. |
2 |
26 Feb 07 |
jari |
* @param p1 - left upper corner of the selection area. |
2 |
26 Feb 07 |
jari |
* @param p2 - right bottom corner of the selection area. |
2 |
26 Feb 07 |
jari |
* @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 |
* @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 |
//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 |
} |