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    }