• Facebook
  • Twitter
  • Reddit
  • StumbleUpon
  • Digg
  • email

#------------------------------------------------------------------------------
# Copyright (C) 2007 Richard W. Lincoln
#
# 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; version 2 dated June, 1991.
#
# This software is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANDABILITY 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#------------------------------------------------------------------------------
 
"""
A N-segments Arm
 
"""
 
#------------------------------------------------------------------------------
#  Imports:
#------------------------------------------------------------------------------
 
# Standard library imports.
import logging
 
import math
 
# Enthought library imports
from enthought.traits.api import List, Float, Instance, Bool
 
# Local imports:
from abstract_member import AbstractMember
 
from maabac_state import MaabacState
 
 
# Setup a logger for this module.
logger = logging.getLogger(__name__)
 
#------------------------------------------------------------------------------
#  "Arm" class:
#------------------------------------------------------------------------------
 
class Arm(AbstractMember):
    """
    A N-segments Arm
 
    """
 
    # Arm angles
    angles = List(Float)
 
    max_dist = Float
 
    # Graphical interface
#    design_area = Instance(ArmDesign)
 
    graphics_enabled = Bool(False)
 
    is_visible = Bool(False)
 
 
    def __init__(self,
                 segments,
                 x_target=0.0,
                 y_target=0.0,
                 r_target=0.2,
                 **traits):
 
        self.taille = 2 * segments
        self.angles = [float() for idx in range(segments)]
        self.x_target = math.sqrt(2.0)
        self.y_target = math.sqrt(2.0)
        self.initial_state = MaabacState(self, self.taille)
 
        for i in range(self.taille):
            self.initial_state.init(i, False)
        c = [int() for idx in range(self.taille)]
        m = [int() for idx in range(self.taille)]
 
        for i in range(self.taille):
            c[i] = self.initial_state.get_value(i)
            m[i] = self.initial_state.get_max_value(i)
 
        self.x = 0
        self.y = 0
 
        for i in range(segments):
            self.angles[i] = math.pi# * 1 + c[2 * i] / m[2 * i] + 0.0 - \
            #c[2 * i + 1] / m[2 * i + 1] + 0.0 / 2
 
            self.x += math.cos(self.angles[i])
            self.y += math.sin(self.angles[i])
 
        self.max_dist = 2.0 * segments * 1.0
        self.initial_state.set_dist(self.compute_dist())
        self.initial_state.set_dir(self.compute_dir())
        self.initial_state.set_d_dist(
            self.compute_d_dist() / self.max_dist
        )
        self.initial_state.set_d_dir(self.compute_d_dir())
 
        if x_target is not 0.0:
            self.x_target = x_target
        if y_target is not 0.0:
            self.y_target = y_target
        if r_target is not 0.2:
            self.r_target = r_target
 
        # FIXME: include all traits set above
        super(Arm, self).__init__(
            x=x_target,
            y=y_target,
            r=r_target,
            **traits)
 
 
    def set_state(self, c, m):
        super(Arm, self).set_state(c, m)
 
        self.x = 0
        self.y = 0
 
        for i in range(self.taille / 2):
            self.angles[i] = math.pi * 1 + c[2 * i] / m[2 * i] + 0.0 - \
            c[2 * i + 1] / m[2 * i + 1] + 0.0 / 2
            self.x += math.cos(self.angles[i])
            self.y += math.sin(self.angles[i])
 
 
    def successor_state(self, s, a):
        ms = s
        new = ms.copy()
        ca = a
 
        for i in range(self.taille):
            new.change_value(i, ca.get_action(i))
 
        self.x = 0
        self.y = 0
 
        for i in range(self.taille/2):
 
            self.angles[i] = math.pi * 1 + \
            ms.get_value(2 * i) / ms.get_max_value(2 * i) + 0.0 - \
            ms.get_value(2 * i + 1) / ms.get_max_value(2 * i + 1) + 0.0 / 2
 
            self.x += math.cos(self.angles[i])
            self.y += math.sin(self.angles[i])
 
        new.set_dist(self.compute_dist())
        new.set_dir(self.compute_dir())
        self.max_dist = self.taille * 1.0
        new.set_d_dist(self.compute_d_dist() / self.max_dist)
        new.set_d_dir(self.compute_d_dir())
 
        return new
 
 
#    def set_graphics(self):
#        self.graphics_enabled = True
#        self.is_visible = True
#        graf = JFrame()
#        graf.set_size(Dimension(taille + 2 * 50, taille + 2 * 50))
#
#
#        def window_closing(self, e):
#            print "On quitte"
#            System.exit(0)
#
#        graf.addWindowListener(WindowAdapter())
#        graf.getContentPane().setLayout(BoxLayout(graf.getContentPane(), BoxLayout.Y_AXIS))
#        self.designArea = ArmNDesign(taille + 2 * 50, taille + 2 * 50)
#        graf.getContentPane().add(self.designArea)
#        graf.setVisible(True)
 
 
#    def send_state(self, e):
#        if not self.graphics_enabled:
#            return
#        if not self.is_visible:
#            return
#        self.design_area.plot(self.angles, x_target, y_target, r_target)
 
 
#    def clear_graphics(self):
#        self.design_area.reinit()
 
 
#    def close_graphics(self):
#        if not self.graphics_enabled:
#            return
#        if not self.is_visible:
#            return
#        self.is_visible = False
#        graf.set_visible(False)
 
# EOF -------------------------------------------------------------------------