001 /*
002 * Copyright 2011 Christian Kumpe http://kumpe.de/christian/java
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package de.kumpe.hadooptimizer.examples.neurons;
017
018 import java.awt.BorderLayout;
019 import java.awt.Color;
020 import java.awt.Dimension;
021 import java.awt.Graphics2D;
022 import java.awt.image.BufferedImage;
023
024 import javax.swing.JFrame;
025 import javax.swing.JPanel;
026 import javax.swing.JSlider;
027 import javax.swing.event.ChangeEvent;
028 import javax.swing.event.ChangeListener;
029
030 public class ResultPainter {
031 private int factor = 100;
032
033 NeuronalNetEvaluator evaluator;
034
035 public void draw(final double[] weights) {
036
037 final JFrame frame = new JFrame("Netz");
038
039 final JPanel panel = new JPanel() {
040 private static final long serialVersionUID = 1L;
041
042 @Override
043 protected void paintComponent(final java.awt.Graphics g) {
044 final int width = getWidth();
045 final int height = getHeight();
046 final int xrange = width / 2;
047 final int yrange = height / 2;
048 g.translate(xrange, yrange);
049 ((Graphics2D) g).scale(1, -1);
050
051 final BufferedImage image = new BufferedImage(width, height,
052 BufferedImage.TYPE_BYTE_GRAY);
053
054 final int[] buf = new int[width * height];
055
056 for (int x = 0; x < width; x++) {
057 for (int y = 0; y < height; y++) {
058 final double value = evaluate(weights,
059 (double) (x - xrange) / factor,
060 (double) (y - yrange) / factor);
061 buf[x + y * width] = (int) (value * 255);
062 }
063 }
064 image.getRaster().setSamples(0, 0, width, height, 0, buf);
065 g.drawImage(image, -xrange, -yrange, null);
066
067 g.setXORMode(Color.GRAY);
068 g.setColor(Color.BLACK);
069 g.drawLine(-width, 0, width, 0);
070 g.drawLine(0, -height, 0, height);
071 g.drawArc(-factor, -factor, factor * 2, factor * 2, 0, 360);
072 g.drawLine(0, factor, factor, factor);
073 g.drawLine(factor, factor, factor, 0);
074 };
075 };
076
077 panel.setPreferredSize(new Dimension(200, 200));
078 frame.add(panel, BorderLayout.CENTER);
079 final JSlider slider = new JSlider(1, 1000, 100);
080 slider.addChangeListener(new ChangeListener() {
081
082 @Override
083 public void stateChanged(final ChangeEvent e) {
084 factor = slider.getValue();
085 panel.repaint();
086 }
087 });
088 frame.add(slider, BorderLayout.SOUTH);
089 frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
090 frame.pack();
091 frame.setVisible(true);
092 }
093
094 double evaluate(final double[] weights, final double x, final double y) {
095 return evaluator.evaluate(weights, new double[] { x, y });
096 }
097 }