/* author: Louis Hugues - created on 13 janv. 2005 *//* * Simbad - Robot Simulator * Copyright (C) 2004 Louis Hugues * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ----------------------------------------------------------------------------- * $Author: sioulseuguh $ * $Date: 2005/08/07 12:24:57 $ * $Revision: 1.3 $ * $Source: /cvsroot/simbad/src/simbad/sim/LightSensor.java,v $ */ package org.myrobotlab.mapper.sim; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.text.DecimalFormat; import javax.swing.JPanel; /** * This class models a single light sensor. The sensor outputs a float * proportionnal to received light. <br> * Implementation Note: <br> * We use a small camera to implement the light sensor. The camera must look * back at the sensor body so as to measured the light received. */ public class LightSensor extends Eye { /* * a JPanel for displaying the eye image. */ public class LigthSensorJPanel extends JPanel { private static final long serialVersionUID = 1L; Color color; Font font; DecimalFormat format; final static int HEIGHT = 12; public LigthSensorJPanel() { color = new Color(0, 0, 0); Dimension d = new Dimension(50, HEIGHT); setPreferredSize(d); setMinimumSize(d); font = new Font("Arial", Font.PLAIN, HEIGHT - 2); // display format for numbers format = new DecimalFormat(); format.setMaximumFractionDigits(2); format.setMinimumFractionDigits(2); format.setPositivePrefix(""); format.setMinimumIntegerDigits(1); } /* should not be called too often */ @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.setFont(font); color = new Color(luminance, luminance, luminance); g.setColor(color); g.fillRect(0, 0, HEIGHT, HEIGHT); g.setColor(Color.BLACK); g.drawString("luminance=" + format.format(luminance), HEIGHT + 10, HEIGHT - 1); } } float luminance; public LightSensor() { super(0.5f, 10, 10); // super(0.5f, 50, 50); luminance = 0; rotateY(Math.PI); } @Override void create3D(float radius) { // small body super.create3D(0.05f); } @Override public JPanel createInspectorPanel() { return new LigthSensorJPanel(); } /** * Returns the measured luminance. * * @return 0.0 means no light , 1.0 f maximum enlightment */ public float getAverageLuminance() { return luminance; } /** Called by simulator */ @Override protected void update() { super.update(); visionImage.getRGB(0, 0, imageWidth, imageHeight, tempRGBABuffer, 0, imageWidth); float sum = 0; int n = tempRGBABuffer.length; for (int i = 0; i < n; i++) { int pix = tempRGBABuffer[i]; int r = (pix >> 16) & 0xff; int g = (pix >> 8) & 0xff; int b = (pix) & 0xff; sum += (r * 0.299f + 0.587f * g + 0.114f * b) / 255.0f; } luminance = sum / n; } }