#------------------------------------------------------------------------------
# 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 -------------------------------------------------------------------------