View difference between Paste ID: nD6MT8eS and kWngeSzX
SHOW: | | - or go back to the newest paste.
1-
package com.aiko.kontrol.geotechnical.interpolation;
1+
2
import java.awt.Point;
3
import java.awt.image.BufferedImage;
4
import java.io.File;
5
import java.io.IOException;
6
import java.util.ArrayList;
7
import java.util.List;
8
import java.util.Random;
9
10
import javax.imageio.ImageIO;
11
12
public class Interpolation {
13
14
    private List<WeightedPoint> weightedPoints = new ArrayList<WeightedPoint>();
15
    private List<ColorRange> colorRanges = new ArrayList<ColorRange>();
16
    private Point origin = new Point(0, 0);
17
18
    int power = 4;
19
    Random random = new Random();
20
21
    public static void main(String[] args) {
22
        // TODO Auto-generated method stub
23
24
        try {
25
            File imageFile = new File("newImage.png");
26
            ImageIO.write(new Interpolation().getImage(1366, 768), "png",
27
                    imageFile);
28
        } catch (IOException ex) {
29
30
        }
31
    }
32
33
    public BufferedImage getImage(int width, int height) {
34
35
        BufferedImage bufferedImage = new BufferedImage(width, height,
36
                BufferedImage.TYPE_INT_RGB);
37
38
        initialState();
39
        interpolateImage(bufferedImage);
40
41
        return bufferedImage;
42
    }
43
44
    public void addWeightedPoint(WeightedPoint p) {
45
        weightedPoints.add(p);
46
    }
47
48
    public void addColorRange(ColorRange c) {
49
        colorRanges.add(c);
50
    }
51
52
    public Point getOrigin() {
53
        return origin;
54
    }
55
56
    public void setOrigin(Point origin) {
57
        this.origin = origin;
58
    }
59
60
    private void initialState() {
61
62
        float r = 0.34f;
63
        int n = 10;
64
        int max = 101;
65
66
        for (int i = 0; i < n; i++) {
67
            r -= 0.3333f / n;
68
69
            colorRanges.add(new ColorRange(i * (max / n), i * (max / n)
70
                    + (max / n), Color.getHSBColor(r, 1f, 1f)));
71
        }
72
73
        /* Agregar puntos */
74
        weightedPoints.add(new WeightedPoint(100, 100, 100));
75
        weightedPoints.add(new WeightedPoint(300, 200, 0));
76
        weightedPoints.add(new WeightedPoint(800, 550, 10));
77
        weightedPoints.add(new WeightedPoint(100, 500, 50));
78
        weightedPoints.add(new WeightedPoint(1200, 400, 80));
79
        weightedPoints.add(new WeightedPoint(1100, 700, 70));
80
        weightedPoints.add(new WeightedPoint(800, 550, 10));
81
82
    }
83
84
    private void interpolateImage(BufferedImage bufferedImage) {
85
86
        for (int i = 0; i < bufferedImage.getWidth(); i++) {
87
            for (int j = 0; j < bufferedImage.getHeight(); j++) {
88
                bufferedImage.setRGB(i, j, getValueShepard(i, j));
89
            }
90
        }
91
    }
92
93
    private int getValueShepard(int i, int j) {
94
95
        double dTotal = 0.0;
96
        double result = 0.0;
97
98
        for (WeightedPoint p : weightedPoints) {
99
100
            double d = distance(p.getX() - origin.getX(),
101
                    p.getY() - origin.getY(), i, j);
102
            if (power != 1) {
103
                d = Math.pow(d, power);
104
            }
105
            d = Math.sqrt(d);
106
            if (d > 0.0) {
107
                d = 1.0 / d;
108
            } else { // if d is real small set the inverse to a large number
109
                     // to avoid INF
110
                d = 1.e20;
111
            }
112
            result += p.getValue() * d;
113
            dTotal += d;
114
        }
115
116
        if (dTotal > 0) {
117
            return getColor(result / dTotal);
118
        } else {
119
            return getColor(0);
120
        }
121
122
    }
123
124
    private int getColor(double val) {
125
        for (ColorRange r : colorRanges) {
126
            if (val >= r.min && val < r.max) {
127
                return r.color.getRGB();
128
            }
129
        }
130
        return 0;
131
    }
132
133
    /**
134
     * Calculates the distance between two points.
135
     * 
136
     * @param xDataPt
137
     *            the x coordinate.
138
     * @param yDataPt
139
     *            the y coordinate.
140
     * @param xGrdPt
141
     *            the x grid coordinate.
142
     * @param yGrdPt
143
     *            the y grid coordinate.
144
     * 
145
     * @return The distance between two points.
146
     */
147
    private double distance(double xDataPt, double yDataPt, double xGrdPt,
148
            double yGrdPt) {
149
        double dx = xDataPt - xGrdPt;
150
        double dy = yDataPt - yGrdPt;
151
        return Math.sqrt(dx * dx + dy * dy);
152
    }
153
154
    // bufferedImage.setRGB(i, j, new Random(100).nextInt());
155
156
    public class WeightedPoint {
157
        int x;
158
        int y;
159
        int value;
160
161
        public WeightedPoint(int x, int y, int value) {
162
163
            this.x = x;
164
            this.y = y;
165
            this.value = value;
166
        }
167
168
        public int getX() {
169
            return x;
170
        }
171
172
        public void setX(int x) {
173
            this.x = x;
174
        }
175
176
        public int getY() {
177
            return y;
178
        }
179
180
        public void setY(int y) {
181
            this.y = y;
182
        }
183
184
        public int getValue() {
185
            return value;
186
        }
187
188
        public void setValue(int value) {
189
            this.value = value;
190
        }
191
    }
192
193
    public class ColorRange {
194
        int min;
195
        int max;
196
        Color color;
197
198
        public ColorRange(int min, int max, Color color) {
199
200
            this.min = min;
201
            this.max = max;
202
            this.color = color;
203
        }
204
205
        public int getMin() {
206
            return min;
207
        }
208
209
        public void setMin(int min) {
210
            this.min = min;
211
        }
212
213
        public int getMax() {
214
            return max;
215
        }
216
217
        public void setMax(int max) {
218
            this.max = max;
219
        }
220
221
        public Color getColor() {
222
            return color;
223
        }
224
225
        public void setColor(Color color) {
226
            this.color = color;
227
        }
228
229
    }
230
231
}