<commit_before>/*
 * Copyright (C) 2014 Prometheus
 *
 * 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.
 */

package gui;

import control.DatosCamara;
import control.DatosNino;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Timer;

/**
 * Componente para ver los datos de triangulación en tiempo real.
 */
public class RealTimePanel extends javax.swing.JComponent {
    private final static boolean DEBUG = false;
    private final static int MeterPixelRate = 33;
    private final static int OffsetX = 22;
    private final static int OffsetY = 22;
    
    private final List<DatosCamara> camData;
    private String currCamId;
    private DatosNino childData;
    
    private boolean showCams;
    private boolean showChild;

    /**
     * Inicializa una nueva instancia a partir de la lista que contendrá
     * las cámaras.
     * 
     * @param camaras Cámaras.
     */
    public RealTimePanel(final List<DatosCamara> camaras) {
        initComponents();
        this.camData = camaras;
        
        // Timer de refresco
        Timer childTimer = new Timer(500, new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                showChild = !showChild;
                repaint();
            }
        });
        childTimer.start();
    }
    
    /**
     * Establece si se muestran o no las cámaras.
     * 
     * @param value Si se muestran o no las cámaras.
     */
    public void setShowCams(final boolean value) {
        this.showCams = value;
    }
    
    /**
     * Establece el nuevo valor de localización del niño.
     * 
     * @param childData Valor de localización del niño.
     */
    public void setChild(final DatosNino childData) {
        this.childData = childData;
    }
    
    /**
     * Establece el ID de la cámara que enfoca al niño.
     * 
     * @param currCamId ID de la cámara que enfoca al niño.
     */
    public void setCurrentCamaraId(final String currCamId) {
        this.currCamId = currCamId;
    }
    
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        // Si no hay datos de niño no se conoce ni las dimensiones de la sala.
        if (this.childData == null)
            return;
        
        // Tamaño de la habitación en píxeles.
        int widPx = this.meter2Px(this.childData.getSalaW());
        int lenPx = this.meter2Px(this.childData.getSalaL());
        
        // Traslada para que se vea todo
        g.translate(OffsetX, OffsetY);
        
        // Pinta el fondo
        g.setColor(Color.white);
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
        
        // Pinta la habitación
        g.setColor(Color.blue);
        g.drawRect(0, 0, widPx, lenPx);
        
        // Pinta las cámara
        if (this.showCams) {
            // Pinta el ángulo de la cámara
            for (DatosCamara cam : this.camData) {
                // Según si es la cámara actual o no se pinta más oscuro.
                if (currCamId != null && cam.getCamId().equals(currCamId))
                    g.setColor(new Color(255, 0, 0, 128));
                else
                    g.setColor(new Color(128, 128, 128, 128));

                // Pinta el ángulo de vision.
                drawVision(g, cam);
            
                // Pinta el punto de la cámara
                g.setColor(Color.blue);
                fillCircle(g, meter2Px(cam.getPosX()), meter2Px(cam.getPosY()));
            }
        }
        
        // Pinta el punto con el niño
        if (this.showChild) {
            g.setColor(Color.red);
            fillCircle(g, meter2Px(this.childData.getPosX()),
                    meter2Px(this.childData.getPosY()));
        }
    }
    
    /**
     * Convierte de metros a píxeles.
     * 
     * @param meters El valor en metros a convertir.
     * @return El equivalente en píxeles.
     */
    private int meter2Px(final double meters) {
        return (int)Math.round(meters * MeterPixelRate);
    }
    
    /**
     * Dibuja el ángulo de visión de una cámara.
     * 
     * @param g Objeto para pintar en el objeto.
     * @param cam Cámara a pintar.
     */
    private void drawVision(Graphics g, DatosCamara cam) {
        final double ANGULO    = Math.toRadians(52.0);  // Ángulo de visión

        // Ángulo de la cámara (en sentido contrario a las agujas del reloj).
        double camAngle = 2*Math.PI - cam.getAngle();<commit_msg>Ampliado ángulo de visión. Cambiado sentido de los ángulos.<commit_after>/*
 * Copyright (C) 2014 Prometheus
 *
 * 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.
 */

package gui;

import control.DatosCamara;
import control.DatosNino;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Timer;

/**
 * Componente para ver los datos de triangulación en tiempo real.
 */
public class RealTimePanel extends javax.swing.JComponent {
    private final static boolean DEBUG = false;
    private final static int MeterPixelRate = 33;
    private final static int OffsetX = 22;
    private final static int OffsetY = 22;
    
    private final List<DatosCamara> camData;
    private String currCamId;
    private DatosNino childData;
    
    private boolean showCams;
    private boolean showChild;

    /**
     * Inicializa una nueva instancia a partir de la lista que contendrá
     * las cámaras.
     * 
     * @param camaras Cámaras.
     */
    public RealTimePanel(final List<DatosCamara> camaras) {
        initComponents();
        this.camData = camaras;
        
        // Timer de refresco
        Timer childTimer = new Timer(500, new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                showChild = !showChild;
                repaint();
            }
        });
        childTimer.start();
    }
    
    /**
     * Establece si se muestran o no las cámaras.
     * 
     * @param value Si se muestran o no las cámaras.
     */
    public void setShowCams(final boolean value) {
        this.showCams = value;
    }
    
    /**
     * Establece el nuevo valor de localización del niño.
     * 
     * @param childData Valor de localización del niño.
     */
    public void setChild(final DatosNino childData) {
        this.childData = childData;
    }
    
    /**
     * Establece el ID de la cámara que enfoca al niño.
     * 
     * @param currCamId ID de la cámara que enfoca al niño.
     */
    public void setCurrentCamaraId(final String currCamId) {
        this.currCamId = currCamId;
    }
    
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        // Si no hay datos de niño no se conoce ni las dimensiones de la sala.
        if (this.childData == null)
            return;
        
        // Tamaño de la habitación en píxeles.
        int widPx = this.meter2Px(this.childData.getSalaW());
        int lenPx = this.meter2Px(this.childData.getSalaL());
        
        // Traslada para que se vea todo
        g.translate(OffsetX, OffsetY);
        
        // Pinta el fondo
        g.setColor(Color.white);
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
        
        // Pinta la habitación
        g.setColor(Color.blue);
        g.drawRect(0, 0, widPx, lenPx);
        
        // Pinta las cámara
        if (this.showCams) {
            // Pinta el ángulo de la cámara
            for (DatosCamara cam : this.camData) {
                // Según si es la cámara actual o no se pinta más oscuro.
                if (currCamId != null && cam.getCamId().equals(currCamId))
                    g.setColor(new Color(255, 0, 0, 128));
                else
                    g.setColor(new Color(128, 128, 128, 128));

                // Pinta el ángulo de vision.
                drawVision(g, cam);
            
                // Pinta el punto de la cámara
                g.setColor(Color.blue);
                fillCircle(g, meter2Px(cam.getPosX()), meter2Px(cam.getPosY()));
            }
        }
        
        // Pinta el punto con el niño
        if (this.showChild) {
            g.setColor(Color.red);
            fillCircle(g, meter2Px(this.childData.getPosX()),
                    meter2Px(this.childData.getPosY()));
        }
    }
    
    /**
     * Convierte de metros a píxeles.
     * 
     * @param meters El valor en metros a convertir.
     * @return El equivalente en píxeles.
     */
    private int meter2Px(final double meters) {
        return (int)Math.round(meters * MeterPixelRate);
    }
    
    /**
     * Dibuja el ángulo de visión de una cámara.
     * 
     * @param g Objeto para pintar en el objeto.
     * @param cam Cámara a pintar.
     */
    private void drawVision(Graphics g, DatosCamara cam) {
        final double ANGULO    = Math.toRadians(65.0);  // Ángulo de visión

        // Ángulo de la cámara (en sentido contrario a las agujas del reloj).
        double camAngle = cam.getAngle();
{'fraction_non_alphanumeric': 0.08524995248051702, 'fraction_numerical': 0.011879870747006272, 'mean_word_length': 1.9818645508642676, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2870390', 'n_tokens_mistral': 3300, 'n_tokens_neox': 3169, 'n_words': 1032}