Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpmoxhay <pmoxhay@earthlink.net>2009-06-05 11:43:37 (GMT)
committer pmoxhay <pmoxhay@earthlink.net>2009-06-05 11:43:37 (GMT)
commit89d634579e872666a0b536a94bc406dbf1715ce2 (patch)
treec58c10bb0dbefbd5d3ea74c518c5ca0caf5c8143
parentb9f59225110d47cb04962d7e482c7738bdbeffe3 (diff)
Doesn't repeat recently used problems.
Fix bug with line segment drops getting rejected. Progresses to next level once >, <, = problems for a given level are solved correctly.
-rw-r--r--TODO2
-rw-r--r--amountproblem.py25
-rw-r--r--areaproblem.py73
-rw-r--r--compare3lesson.py66
-rw-r--r--cuttingproblem.py31
-rw-r--r--draggableobject.py26
-rw-r--r--lengthproblem.py53
-rw-r--r--linesegmentdroptarget.py27
-rw-r--r--linesegmentmovableobject.py6
-rw-r--r--linesegmentobject.py10
-rw-r--r--massproblem.py26
-rw-r--r--movableobject.py54
-rw-r--r--signsdroptarget.py12
-rw-r--r--volumeobject.py3
-rw-r--r--volumeproblem.py52
15 files changed, 307 insertions, 159 deletions
diff --git a/TODO b/TODO
index d849fa6..6137012 100644
--- a/TODO
+++ b/TODO
@@ -19,7 +19,7 @@ Compare3 Lesson
+ Display intersection between Shapes in a different color? IntersectionObject maybe?
- Mass comparison: fit into answer box.
- Fix drawing of mass parallelopipeds (ThreeDObjects).
-+ Fix behavior of line segments (drops getting rejected).
+- Fix behavior of line segments (drops getting rejected).
+ Volume comparison: fit into answer box.
+ Amount comparison: fit into answer box (maybe make wider and reposition).
+ Amount comparison: refine appearance of object groups.
diff --git a/amountproblem.py b/amountproblem.py
index f2327dc..bea98cd 100644
--- a/amountproblem.py
+++ b/amountproblem.py
@@ -38,6 +38,8 @@ class AmountProblem(Problem):
self.letter1 = letter1
self.letter2 = letter2
+ self.problem_number = -1
+
self.generate_problem()
self.show_problem()
@@ -74,11 +76,14 @@ class AmountProblem(Problem):
original_position2_model = Vector(1000, 200)
# The total number of problems.
- n_problems = 8
+ self.n_problems = 8
# Choose a random problem.
shape_scheme = random.randrange(0,6)
- problem_number = random.randrange(0,n_problems)
+
+ # Choose a random problem.
+ while (self.problem_number in self.container.recently_used):
+ self.problem_number = random.randrange(0, self.n_problems)
self.n_shape1 = 8
self.n_shape2 = 7
@@ -94,35 +99,35 @@ class AmountProblem(Problem):
#problem_number = 1
#print "problem_number =", problem_number
- if problem_number == 0:
+ if self.problem_number == 0:
self.n_shape1 = 6
self.n_shape2 = 6
self.shape1_in_pair = False
- elif problem_number == 1:
+ elif self.problem_number == 1:
self.n_shape1 = 6
self.n_shape2 = 6
self.shape1_in_pair = True
- elif problem_number == 2:
+ elif self.problem_number == 2:
self.n_shape1 = 6
self.n_shape2 = 5
self.shape1_in_pair = False
- elif problem_number == 3:
+ elif self.problem_number == 3:
self.n_shape1 = 6
self.n_shape2 = 5
self.shape1_in_pair = True
- elif problem_number == 4:
+ elif self.problem_number == 4:
self.n_shape1 = 4
self.n_shape2 = 4
self.shape1_in_pair = False
- elif problem_number == 5:
+ elif self.problem_number == 5:
self.n_shape1 = 4
self.n_shape2 = 4
self.shape1_in_pair = True
- elif problem_number == 6:
+ elif self.problem_number == 6:
self.n_shape1 = 4
self.n_shape2 = 3
self.shape1_in_pair = False
- elif problem_number == 7:
+ elif self.problem_number == 7:
self.n_shape1 = 4
self.n_shape2 = 3
self.shape1_in_pair = True
diff --git a/areaproblem.py b/areaproblem.py
index ca03632..bc3c6cc 100644
--- a/areaproblem.py
+++ b/areaproblem.py
@@ -35,6 +35,8 @@ class AreaProblem(Problem):
self.letter1 = letter1
self.letter2 = letter2
+ self.problem_number = -1
+
self.generate_problem()
self.show_problem()
@@ -103,12 +105,6 @@ class AreaProblem(Problem):
SMALL_IRREG_PENTAGON_SHAPE_2 = self.smaller(IRREG_PENTAGON_SHAPE_2)
LARGE_IRREG_PENTAGON_SHAPE_2 = self.larger(IRREG_PENTAGON_SHAPE_2)
- ## Choose two random letter to represent the two quantities
- #letter1 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T'])
- #letter2 = letter1
- #while letter2 == letter1:
- # letter2 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T'])
-
# Standard initial positions for the shapes.
upper_left_position = Vector(300, 300)
lower_right_position = Vector(900, 400)
@@ -126,112 +122,113 @@ class AreaProblem(Problem):
(0, math.pi/4), (math.pi/4, 0), (0, math.pi/4), (math.pi/4, 0), (0, 0), (math.pi/2, 0), (0, math.pi/2) ])
# The total number of problems.
- n_problems = 30
+ self.n_problems = 30
# Choose a random problem.
- problem_number = random.randrange(0,n_problems)
+ while (self.problem_number in self.container.recently_used):
+ self.problem_number = random.randrange(0, self.n_problems)
# Uncomment to test a particular problem.
#problem_number = 0
# Define the various problems.
- if problem_number == 0:
+ if self.problem_number == 0:
object1 = SQUARE_SHAPE
object2 = LARGE_SQUARE_SHAPE
- elif problem_number == 1:
+ elif self.problem_number == 1:
object1 = SMALL_SQUARE_SHAPE
object2 = SQUARE_SHAPE
- elif problem_number == 2:
+ elif self.problem_number == 2:
object1 = SQUARE_SHAPE
object2 = SQUARE_SHAPE
- elif problem_number == 3:
+ elif self.problem_number == 3:
object1 = RECTANGLE_SHAPE
object2 = LARGE_RECTANGLE_SHAPE
- elif problem_number == 4:
+ elif self.problem_number == 4:
object1 = SMALL_RECTANGLE_SHAPE
object2 = RECTANGLE_SHAPE
- elif problem_number == 5:
+ elif self.problem_number == 5:
object1 = RECTANGLE_SHAPE
object2 = RECTANGLE_SHAPE
- elif problem_number == 6:
+ elif self.problem_number == 6:
object1 = TRIANGLE_SHAPE
object2 = LARGE_TRIANGLE_SHAPE
- elif problem_number == 7:
+ elif self.problem_number == 7:
object1 = SMALL_TRIANGLE_SHAPE
object2 = TRIANGLE_SHAPE
- elif problem_number == 8:
+ elif self.problem_number == 8:
object1 = TRIANGLE_SHAPE
object2 = TRIANGLE_SHAPE
- elif problem_number == 9:
+ elif self.problem_number == 9:
object1 = RT_ANGLE_TRAPEZOID_SHAPE
object2 = LARGE_RT_ANGLE_TRAPEZOID_SHAPE
- elif problem_number == 10:
+ elif self.problem_number == 10:
object1 = SMALL_RT_ANGLE_TRAPEZOID_SHAPE
object2 = RT_ANGLE_TRAPEZOID_SHAPE
- elif problem_number == 11:
+ elif self.problem_number == 11:
object1 = RT_ANGLE_TRAPEZOID_SHAPE
object2 = RT_ANGLE_TRAPEZOID_SHAPE
- elif problem_number == 12:
+ elif self.problem_number == 12:
object1 = TRAPEZOID_SHAPE
object2 = LARGE_TRAPEZOID_SHAPE
- elif problem_number == 13:
+ elif self.problem_number == 13:
object1 = SMALL_TRAPEZOID_SHAPE
object2 = TRAPEZOID_SHAPE
- elif problem_number == 14:
+ elif self.problem_number == 14:
object1 = TRAPEZOID_SHAPE
object2 = TRAPEZOID_SHAPE
- elif problem_number == 15:
+ elif self.problem_number == 15:
object1 = PARALLELOGRAM_SHAPE
object2 = LARGE_PARALLELOGRAM_SHAPE
- elif problem_number == 16:
+ elif self.problem_number == 16:
object1 = SMALL_PARALLELOGRAM_SHAPE
object2 = PARALLELOGRAM_SHAPE
- elif problem_number == 17:
+ elif self.problem_number == 17:
object1 = PARALLELOGRAM_SHAPE
object2 = PARALLELOGRAM_SHAPE
- elif problem_number == 18:
+ elif self.problem_number == 18:
object1 = IRREG_TRIANGLE_SHAPE_1
object2 = LARGE_IRREG_TRIANGLE_SHAPE_1
- elif problem_number == 19:
+ elif self.problem_number == 19:
object1 = SMALL_IRREG_TRIANGLE_SHAPE_1
object2 = IRREG_TRIANGLE_SHAPE_1
- elif problem_number == 20:
+ elif self.problem_number == 20:
object1 = IRREG_TRIANGLE_SHAPE_1
object2 = IRREG_TRIANGLE_SHAPE_1
- elif problem_number == 21:
+ elif self.problem_number == 21:
object1 = IRREG_QUADRIATERAL_SHAPE_1
object2 = LARGE_IRREG_QUADRIATERAL_SHAPE_1
- elif problem_number == 22:
+ elif self.problem_number == 22:
object1 = self.smaller(SMALL_SQUARE_SHAPE)
object2 = self.smaller(SQUARE_SHAPE)
- elif problem_number == 23:
+ elif self.problem_number == 23:
object1 = IRREG_QUADRIATERAL_SHAPE_1
object2 = IRREG_QUADRIATERAL_SHAPE_1
- elif problem_number == 24:
+ elif self.problem_number == 24:
object1 = IRREG_QUADRIATERAL_SHAPE_2
object2 = LARGE_IRREG_QUADRIATERAL_SHAPE_2
- elif problem_number == 25:
+ elif self.problem_number == 25:
object1 = self.larger(self.larger(IRREG_QUADRIATERAL_SHAPE_2))
object2 = LARGE_IRREG_QUADRIATERAL_SHAPE_2
- elif problem_number == 26:
+ elif self.problem_number == 26:
object1 = IRREG_QUADRIATERAL_SHAPE_2
object2 = IRREG_QUADRIATERAL_SHAPE_2
- elif problem_number == 27:
+ elif self.problem_number == 27:
object1 = IRREG_PENTAGON_SHAPE_1
object2 = LARGE_IRREG_PENTAGON_SHAPE_1
- elif problem_number == 28:
+ elif self.problem_number == 28:
object1 = self.larger(LARGE_IRREG_PENTAGON_SHAPE_2)
object2 = LARGE_IRREG_PENTAGON_SHAPE_2
- elif problem_number == 29:
+ elif self.problem_number == 29:
object1 = IRREG_PENTAGON_SHAPE_1
object2 = IRREG_PENTAGON_SHAPE_1
diff --git a/compare3lesson.py b/compare3lesson.py
index e40a627..7bbeed5 100644
--- a/compare3lesson.py
+++ b/compare3lesson.py
@@ -66,6 +66,9 @@ class Compare3Lesson(ObjectArea):
self.last_alphabetical_letter1 = 'A'
self.last_alphabetical_letter2 = 'A'
+ self.problem_number = -1
+ self.recently_used = [-1, -1, -1, -1, -1, -1, -1, -1]
+
self.progress = ProgressObject(Vector(10, 700), 30)
self.add_object(self.progress)
@@ -79,6 +82,10 @@ class Compare3Lesson(ObjectArea):
self.moons_visible = False
self.n_errors = 0
+ self.n_equals_problems_correct = 0
+ self.n_greater_than_problems_correct = 0
+ self.n_less_than_problems_correct = 0
+
#TODO- Put this code in the ShapeObjects themselves.
def check_problem_solved(self):
@@ -138,9 +145,30 @@ class Compare3Lesson(ObjectArea):
self.problem_type ='cutting'
#print "... so self.problem_type is now: ", self.problem_type
+
+ self.recently_used = []
+
+ if self.problem_type == 'length':
+ n_problems = 18
+ elif self.problem_type == 'amount':
+ n_problems = 8
+ elif self.problem_type == 'mass':
+ n_problems = 9
+ elif self.problem_type == 'volume':
+ n_problems = 12
+ elif self.problem_type == 'cutting':
+ n_problems = 12
+ else:
+ n_problems = 30
+
+ for i in range(0, n_problems - 3):
+ self.recently_used.append(-1)
+
+ #print ""
+ #print "self.recently_used = ", self.recently_used
# Uncomment this to choose a particular problem type.
- #self.problem_type = 'amount'
+ #self.problem_type = 'length'
if self.problem_type == 'length':
self.problem = LengthProblem(self, self.color_scheme, (self.alphabetical_letter1, self.alphabetical_letter2) )
@@ -154,6 +182,15 @@ class Compare3Lesson(ObjectArea):
self.problem = CuttingProblem(self, self.color_scheme, (self.alphabetical_letter1, self.alphabetical_letter2) )
else:
self.problem = AreaProblem(self, self.color_scheme, (self.alphabetical_letter1, self.alphabetical_letter2) )
+
+ # Choose a random problem.
+ while (self.problem_number in self.recently_used):
+ self.problem_number = self.problem.problem_number
+
+ #print "self.problem_number = ", self.problem_number
+ self.recently_used.insert(0, self.problem_number)
+ self.recently_used.pop()
+ #print "Now self.recently_used = ", self.recently_used
self.answer = self.problem.find_answer()
self.problem_solved_stage1()
@@ -205,6 +242,7 @@ class Compare3Lesson(ObjectArea):
self.problem.shape2.calculate_bounds()
def pose_problem_stage2(self):
+ #print "pose_problem_stage2 called"
self.stage = 2
self.instructions.text = 'Show the result using line segments'
#print "pose_problem_stage2: string to call find_answer"
@@ -341,12 +379,34 @@ class Compare3Lesson(ObjectArea):
self.instructions.text = 'The ' + quantity_name + ' ' + self.letter1.symbol + ' is ' \
+ text + ' the ' + quantity_name + ' ' + self.letter2.symbol
- if (self.n_errors == 0):
+ if (self.n_errors == 0 and self.n_equals_problems_correct > 0 \
+ and self.n_greater_than_problems_correct > 0 and self.n_less_than_problems_correct > 0):
self.level += 1
- print "self.level is now:", self.level
+ #print "self.level is now:", self.level
+ self.recently_used = [-1, -1, -1, -1, -1, -1, -1, -1]
self.progress.take_a_step()
+ self.n_equals_problems_correct = 0
+ self.n_greater_than_problems_correct = 0
+ self.n_less_than_problems_correct = 0
+ #else:
+ # print ""
+ # print "n_equals_problems_correct =", self.n_equals_problems_correct
+ # print "n_greater_than_problems_correct =", self.n_greater_than_problems_correct
+ # print "n_less_than_problems_correct =", self.n_less_than_problems_correct
self.pose_next_problem_arrow()
+
+ def increment_n_equals_problems_correct(self):
+ if self.n_errors == 0:
+ self.n_equals_problems_correct += 1
+
+ def increment_n_greater_than_problems_correct(self):
+ if self.n_errors == 0:
+ self.n_greater_than_problems_correct += 1
+
+ def increment_n_less_than_problems_correct(self):
+ if self.n_errors == 0:
+ self.n_less_than_problems_correct += 1
def pose_next_problem_arrow(self):
# Put it all in an answer box.
diff --git a/cuttingproblem.py b/cuttingproblem.py
index 2185c78..e846d62 100644
--- a/cuttingproblem.py
+++ b/cuttingproblem.py
@@ -62,6 +62,8 @@ class CuttingProblem(Problem):
self.letter1 = letter1
self.letter2 = letter2
+ self.problem_number = -1
+
self.generate_problem()
self.show_problem()
@@ -126,10 +128,11 @@ class CuttingProblem(Problem):
(original_angle1, original_angle2) = (0, 0)
# The total number of problems.
- n_problems = 12
+ self.n_problems = 12
# Choose a random problem.
- problem_number = random.randrange(0,n_problems)
+ while (self.problem_number in self.container.recently_used):
+ self.problem_number = random.randrange(0, self.n_problems)
# Uncomment to test a particular problem.
#problem_number = 0
@@ -138,76 +141,76 @@ class CuttingProblem(Problem):
self.sub_shapes2_points = [ ]
# Define the various problems.
- if problem_number == 0:
+ if self.problem_number == 0:
object1 = SQUARE_SHAPE
object2 = TRIANGLE_SHAPE
(original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) )
self.sub_shapes1_points = [ [ Vector(0, 0), Vector(200, 0), Vector(0, 200) ], [ Vector(200, 0), Vector(200, 200), Vector(0, 200) ] ]
self.sub_shapes2_points = [ [ Vector(0, 0), Vector(200, -200), Vector(200, 0) ], [ Vector(200, 0), Vector(200, -200), Vector(400, 0) ] ]
- elif problem_number == 1:
+ elif self.problem_number == 1:
object1 = LARGE_SQUARE_SHAPE
object2 = TRIANGLE_SHAPE
(original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) )
self.sub_shapes1_points = [ [ Vector(0, 0), Vector(250, 0), Vector(0, 250) ], [ Vector(250, 0), Vector(250, 250), Vector(0, 250) ] ]
self.sub_shapes2_points = [ [ Vector(0, 0), Vector(200, -200), Vector(200, 0) ], [ Vector(200, 0), Vector(200, -200), Vector(400, 0) ] ]
- elif problem_number == 2:
+ elif self.problem_number == 2:
object1 = SQUARE_SHAPE
object2 = LARGE_TRIANGLE_SHAPE
(original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) )
self.sub_shapes1_points = [ [ Vector(0, 0), Vector(200, 0), Vector(0, 200) ], [ Vector(200, 0), Vector(200, 200), Vector(0, 200) ] ]
self.sub_shapes2_points = [ [ Vector(0, 0), Vector(250, -250), Vector(250, 0) ], [ Vector(250, 0), Vector(250, -250), Vector(500, 0) ] ]
- elif problem_number == 3:
+ elif self.problem_number == 3:
object1 = SQUARE_SHAPE
object2 = RECTANGLE_SHAPE
(original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) )
self.sub_shapes1_points = [ [ Vector(0, 0), Vector(100, 0), Vector(100, 200), Vector(0, 200) ], [ Vector(100, 0), Vector(200, 0), Vector(200, 200), Vector(100, 200) ] ]
self.sub_shapes2_points = [ [ Vector(0, 0), Vector(200, 0), Vector(200, 100), Vector(0, 100) ], [ Vector(200, 0), Vector(400, 0), Vector(400, 100), Vector(200, 100) ] ]
- elif problem_number == 4:
+ elif self.problem_number == 4:
object1 = SQUARE_SHAPE
object2 = SMALL_RECTANGLE_SHAPE
(original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) )
self.sub_shapes1_points = [ [ Vector(0, 0), Vector(100, 0), Vector(100, 200), Vector(0, 200) ], [ Vector(100, 0), Vector(200, 0), Vector(200, 200), Vector(100, 200) ] ]
self.sub_shapes2_points = [ [ Vector(0, 0), Vector(175, 0), Vector(175, 75), Vector(0, 75) ], [ Vector(175, 0), Vector(350, 0), Vector(350, 75), Vector(175, 75) ] ]
- elif problem_number == 5:
+ elif self.problem_number == 5:
object1 = SQUARE_SHAPE
object2 = LARGE_RECTANGLE_SHAPE
(original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) )
self.sub_shapes1_points = [ [ Vector(0, 0), Vector(100, 0), Vector(100, 200), Vector(0, 200) ], [ Vector(100, 0), Vector(200, 0), Vector(200, 200), Vector(100, 200) ] ]
self.sub_shapes2_points = [ [ Vector(0, 0), Vector(225, 0), Vector(225, 125), Vector(0, 125) ], [ Vector(225, 0), Vector(450, 0), Vector(450, 125), Vector(225, 125) ] ]
- elif problem_number == 6:
+ elif self.problem_number == 6:
object1 = PARALLELOGRAM_SHAPE
object2 = TRIANGLE_SHAPE
(original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) )
self.sub_shapes1_points = [ [ Vector(0, 0), Vector(200, 0), Vector(200, 200) ], [ Vector(200, 0), Vector(400, 200), Vector(200, 200) ] ]
self.sub_shapes2_points = [ [ Vector(0, 0), Vector(200, -200), Vector(200, 0) ], [ Vector(200, 0), Vector(200, -200), Vector(400, 0) ] ]
- elif problem_number == 7:
+ elif self.problem_number == 7:
object1 = PARALLELOGRAM_SHAPE
object2 = LARGE_TRIANGLE_SHAPE
(original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) )
self.sub_shapes1_points = [ [ Vector(0, 0), Vector(200, 0), Vector(200, 200) ], [ Vector(200, 0), Vector(400, 200), Vector(200, 200) ] ]
self.sub_shapes2_points = [ [ Vector(0, 0), Vector(250, -250), Vector(250, 0) ], [ Vector(250, 0), Vector(250, -250), Vector(500, 0) ] ]
- elif problem_number == 8:
+ elif self.problem_number == 8:
object1 = PARALLELOGRAM_SHAPE
object2 = SMALL_TRIANGLE_SHAPE
(original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) )
self.sub_shapes1_points = [ [ Vector(0, 0), Vector(200, 0), Vector(200, 200) ], [ Vector(200, 0), Vector(400, 200), Vector(200, 200) ] ]
self.sub_shapes2_points = [ [ Vector(0, 0), Vector(175, -175), Vector(175, 0) ], [ Vector(175, 0), Vector(175, -175), Vector(350, 0) ] ]
- elif problem_number == 9:
+ elif self.problem_number == 9:
object1 = TRAPEZOID_SHAPE
object2 = RECTANGLE_2_SHAPE
(original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) )
self.sub_shapes1_points = [ [ Vector(0, 0), Vector(0, 150), Vector(-150, 150) ], [ Vector(0, 0), Vector(150, 0), Vector(300, 150), Vector(0, 150) ] ]
self.sub_shapes2_points = [ [ Vector(0, 0), Vector(150,0), Vector(300, 150), Vector(0, 150)], [ Vector(300, 150), Vector(150, 150), Vector(150, 0) ] ]
- elif problem_number == 10:
+ elif self.problem_number == 10:
object1 = TRAPEZOID_SHAPE
object2 = LARGE_RECTANGLE_2_SHAPE
(original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) )
self.sub_shapes1_points = [ [ Vector(0, 0), Vector(0, 150), Vector(-150, 150) ], [ Vector(0, 0), Vector(150, 0), Vector(300, 150), Vector(0, 150) ] ]
self.sub_shapes2_points = [ [ Vector(0, 0), Vector(175,0), Vector(350, 175), Vector(0, 175)], [ Vector(175, 0), Vector(350, 175), Vector(175, 175) ] ]
- elif problem_number == 11:
+ elif self.problem_number == 11:
object1 = TRAPEZOID_SHAPE
object2 = SMALL_RECTANGLE_2_SHAPE
(original_position1, original_position2) = ( Vector (250, 250), Vector(500, 600) )
diff --git a/draggableobject.py b/draggableobject.py
index 360e30b..bdf2063 100644
--- a/draggableobject.py
+++ b/draggableobject.py
@@ -13,6 +13,9 @@
#
# You should have received a copy of the GNU General Public License
# along with Math. If not, see <http://www.gnu.org/licenses/>.
+
+DEBUG = False
+
from objectarea import Object
from droptargetobject import DropTargetObject
from vector import Vector
@@ -79,31 +82,48 @@ class DraggableObject(Object):
i += 1
if o.contains(self.get_bounds()) and not o.full:
o.hilite = True
- #print "DraggableObject: DropTarget's hilite set to True, queue draw"
+ if DEBUG:
+ print "DraggableObject: DropTarget's hilite set to True, queue draw"
o.queue_draw()
else:
o.hilite = False
- #print "DraggableObject: DropTarget's hilite set to False, queue draw"
+ if DEBUG:
+ print "DraggableObject: DropTarget's hilite set to False, queue draw"
o.queue_draw()
# End the drag.
elif event.type == gtk.gdk.BUTTON_RELEASE:
+ if DEBUG:
+ print "DraggableObject: BUTTON_RELEASE"
self.dragged = False
+
if self.container:
self.container.snap_to_grid(self)
b = False
#Check whether the drop is inside a drop target.
+ if DEBUG:
+ print "DraggableObject: has ", len(self.drop_targets), "drop targets"
+
for o in self.drop_targets:
- if o.contains(self.get_bounds()):
+ #if o.contains(self.get_bounds()):
+ # Try this: 6/4/09
+ if o.hilite:
b = True
+ if DEBUG:
+ print "DraggableObject: trying to call processDrop"
if o.processDrop(self):
return True
if not b:
+ if DEBUG:
+ print "DraggableObject: not in a DropTarget"
o.hilite = False
self.drop_origin.reset()
+ else:
+ if DEBUG:
+ print "DraggableObject: IS in a DropTarget!"
# If drag is not already in progress.
elif self.contains_point(epos):
diff --git a/lengthproblem.py b/lengthproblem.py
index 9965233..3c503e4 100644
--- a/lengthproblem.py
+++ b/lengthproblem.py
@@ -35,6 +35,8 @@ class LengthProblem(Problem):
self.letter1 = letter1
self.letter2 = letter2
+ self.problem_number = -1
+
self.generate_problem()
self.show_problem()
@@ -68,13 +70,7 @@ class LengthProblem(Problem):
LENGTH_13 = [ Vector(0, 0), Vector(50, 0), Vector(50, 500), Vector(0, 500) ]
LENGTH_14 = [ Vector(0, 0), Vector(50, 0), Vector(50, 525), Vector(0, 525) ]
LENGTH_15 = [ Vector(0, 0), Vector(50, 0), Vector(50, 550), Vector(0, 550) ]
-
- ## Choose two random letter to represent the two quantities
- #letter1 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T'])
- #letter2 = letter1
- #while letter2 == letter1:
- # letter2 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T'])
-
+
# Standard initial positions for the shapes.
upper_left_position = Vector(300, 300)
lower_right_position = Vector(900, 400)
@@ -92,75 +88,76 @@ class LengthProblem(Problem):
(0, math.pi/4), (math.pi/4, 0), (0, math.pi/4), (math.pi/4, 0), (0, 0), (math.pi/2, 0), (0, math.pi/2) ])
# The total number of problems.
- n_problems = 18
+ self.n_problems = 18
# Choose a random problem.
- problem_number = random.randrange(0, n_problems)
+ while (self.problem_number in self.container.recently_used):
+ self.problem_number = random.randrange(0, self.n_problems)
# Uncomment to test a particular problem.
- #problem_number = 0
+ #problem_number = 3
# Define the various problems.
- if problem_number == 0:
+ if self.problem_number == 0:
object1 = LENGTH_1
object2 = LENGTH_1
- elif problem_number == 1:
+ elif self.problem_number == 1:
object1 = LENGTH_3
object2 = LENGTH_3
- elif problem_number == 2:
+ elif self.problem_number == 2:
object1 = LENGTH_5
object2 = LENGTH_5
- elif problem_number == 3:
+ elif self.problem_number == 3:
object1 = LENGTH_1
object2 = LENGTH_3
- elif problem_number == 4:
+ elif self.problem_number == 4:
object1 = LENGTH_2
object2 = LENGTH_4
- elif problem_number == 5:
+ elif self.problem_number == 5:
object1 = LENGTH_7
object2 = LENGTH_7
- elif problem_number == 6:
+ elif self.problem_number == 6:
object1 = LENGTH_3
object2 = LENGTH_5
- elif problem_number == 7:
+ elif self.problem_number == 7:
object1 = LENGTH_4
object2 = LENGTH_6
- elif problem_number == 8:
+ elif self.problem_number == 8:
object1 = LENGTH_5
object2 = LENGTH_7
- elif problem_number == 9:
+ elif self.problem_number == 9:
object1 = LENGTH_6
object2 = LENGTH_8
- elif problem_number == 10:
+ elif self.problem_number == 10:
object1 = LENGTH_9
object2 = LENGTH_9
- elif problem_number == 11:
+ elif self.problem_number == 11:
object1 = LENGTH_7
object2 = LENGTH_9
- elif problem_number == 12:
+ elif self.problem_number == 12:
object1 = LENGTH_8
object2 = LENGTH_10
- elif problem_number == 13:
+ elif self.problem_number == 13:
object1 = LENGTH_9
object2 = LENGTH_11
- elif problem_number == 14:
+ elif self.problem_number == 14:
object1 = LENGTH_10
object2 = LENGTH_12
- elif problem_number == 15:
+ elif self.problem_number == 15:
object1 = LENGTH_11
object2 = LENGTH_11
- elif problem_number == 16:
+ elif self.problem_number == 16:
object1 = LENGTH_11
object2 = LENGTH_13
- elif problem_number == 17:
+ elif self.problem_number == 17:
object1 = LENGTH_0
object2 = LENGTH_2
diff --git a/linesegmentdroptarget.py b/linesegmentdroptarget.py
index 82d6dfc..fd80510 100644
--- a/linesegmentdroptarget.py
+++ b/linesegmentdroptarget.py
@@ -19,6 +19,8 @@ from droptargetobject import DropTargetObject
from linesegmentobject import LineSegmentObject
from linesegmentmovableobject import LineSegmentMovableObject
+DEBUG = False
+
class LineSegmentDropTarget(DropTargetObject):
"""Drop target which line segments can be dropped."""
@@ -41,6 +43,11 @@ class LineSegmentDropTarget(DropTargetObject):
self.answer = 'equal'
def draw(self, cr):
+ #cr.set_source_rgb(0, 1, 1)
+ #self_bounds_mn, self_bounds_mx = self.get_bounds()
+ #cr.rectangle(self_bounds_mn.x, self_bounds_mn.y, self_bounds_mx.x - self_bounds_mn.x, self_bounds_mx.y - self_bounds_mn.y)
+ #cr.fill()
+
cr.rectangle(self.pos.x, self.pos.y, self.size.x, self.size.y)
cr.set_source_rgb(0, 0, 0)
@@ -63,7 +70,7 @@ class LineSegmentDropTarget(DropTargetObject):
return i
def get_bounds(self):
- return self.pos - Vector (2, 2), self.pos + self.size
+ return self.pos - Vector(2,2), self.pos + self.size
def contains(self, other_bounds):
self_bounds_mn, self_bounds_mx = self.get_bounds()
@@ -78,10 +85,16 @@ class LineSegmentDropTarget(DropTargetObject):
return False
def processDrop(self, draggable_object):
- #print "processDrop called on object at ", self.pos
+ if DEBUG:
+ print "LineSegmentDropTarget: processDrop called on object at ", self.pos
if not isinstance(draggable_object, LineSegmentObject) and not isinstance(draggable_object, LineSegmentMovableObject):
+ if DEBUG:
+ print "LineSegmentDropTarget: not a LineSegmentMovableObject"
return False
+ else:
+ if DEBUG:
+ print "LineSegmentDropTarget: IS LineSegmentMovableObject!"
if self.full:
self.drop_origin.reset()
@@ -113,14 +126,16 @@ class LineSegmentDropTarget(DropTargetObject):
movable_object.selectable = True
movable_object.drop_targets = self.drop_targets
movable_object.drop_origin = self.drop_origin
- self.container.add_object(movable_object)
+ if self.container:
+ self.container.add_object(movable_object)
self.contents = movable_object
self.full = True
self.hilite = False
self.queue_draw()
- if self.drop_origin:
- self.container.select_object(self.drop_origin.line1)
+ if self.drop_origin:
+ if self.container:
+ self.container.select_object(self.drop_origin.line1)
else:
if draggable_object.length == 100:
@@ -155,7 +170,7 @@ class LineSegmentDropTarget(DropTargetObject):
if not self.answer_correct() and self.all_drop_targets_full():
self.reset_all_drop_targets()
self.container.register_error()
- elif self.answer_correct():
+ elif self.answer_correct():
self.container.selected_object = None
self.freeze_drop_targets()
self.container.finish_problem_stage2()
diff --git a/linesegmentmovableobject.py b/linesegmentmovableobject.py
index 30fbd10..b363878 100644
--- a/linesegmentmovableobject.py
+++ b/linesegmentmovableobject.py
@@ -13,6 +13,9 @@
#
# You should have received a copy of the GNU General Public License
# along with Math. If not, see <http://www.gnu.org/licenses/>.
+
+DEBUG = False
+
from objectarea import Object
from draggableobject import DraggableObject
from vector import Vector
@@ -26,6 +29,9 @@ class LineSegmentMovableObject(MovableObject):
def __init__(self, pos, length, drop_targets, container):
MovableObject.__init__(self)
+
+ if DEBUG:
+ print "LineSegmentMovableObject: constructor called "
self.pos = pos
self.length = length
diff --git a/linesegmentobject.py b/linesegmentobject.py
index 71f17ba..c9a3647 100644
--- a/linesegmentobject.py
+++ b/linesegmentobject.py
@@ -13,6 +13,9 @@
#
# You should have received a copy of the GNU General Public License
# along with Math. If not, see <http://www.gnu.org/licenses/>.
+
+DEBUG = False
+
from objectarea import Object
from draggableobject import DraggableObject
from vector import Vector
@@ -40,7 +43,12 @@ class LineSegmentObject(DraggableObject):
self.drop_targets = drop_targets
self.container = container
- def draw(self, cr):
+ def draw(self, cr):
+ #cr.set_source_rgb(1, 0, 1)
+ #self_bounds_mn, self_bounds_mx = self.get_bounds()
+ #cr.rectangle(self_bounds_mn.x, self_bounds_mn.y, self_bounds_mx.x - self_bounds_mn.x, self_bounds_mx.y - self_bounds_mn.y)
+ #cr.fill()
+
cr.move_to(self.pos.x - 25, self.pos.y + self.length - self.line_segment_length)
cr.line_to(self.pos.x + 25, self.pos.y+ self.length - self.line_segment_length)
diff --git a/massproblem.py b/massproblem.py
index 411321c..4499323 100644
--- a/massproblem.py
+++ b/massproblem.py
@@ -37,6 +37,8 @@ class MassProblem(Problem):
self.letter1 = letter1
self.letter2 = letter2
+ self.problem_number = -1
+
self.generate_problem()
self.show_problem()
@@ -54,57 +56,59 @@ class MassProblem(Problem):
(color1, color2) = random.choice([(Color.RED, Color.BLUE), (Color.BLUE, Color.RED)])
# The total number of problems.
- n_problems = 9
+ self.n_problems = 9
+
# Choose a random problem.
- problem_number = random.randrange(0,n_problems)
+ while (self.problem_number in self.container.recently_used):
+ self.problem_number = random.randrange(0, self.n_problems)
# Uncomment to test a particular problem.
#problem_number = 0
# Define the various problems.
- if problem_number == 0:
+ if self.problem_number == 0:
size1 = 'short'
size2 = 'short'
self.mass1 = 1
self.mass2 = 2
- elif problem_number == 1:
+ elif self.problem_number == 1:
size1 = 'short'
size2 = 'short'
self.mass1 = 2
self.mass2 = 1
- elif problem_number == 2:
+ elif self.problem_number == 2:
size1 = 'short'
size2 = 'short'
self.mass1 = 1
self.mass2 = 1
- elif problem_number == 3:
+ elif self.problem_number == 3:
size1 = 'tall'
size2 = 'short'
self.mass1 = 1
self.mass2 = 2
- elif problem_number == 4:
+ elif self.problem_number == 4:
size1 = 'tall'
size2 = 'short'
self.mass1 = 2
self.mass2 = 1
- elif problem_number == 5:
+ elif self.problem_number == 5:
size1 = 'tall'
size2 = 'short'
self.mass1 = 1
self.mass2 = 2
- elif problem_number == 6:
+ elif self.problem_number == 6:
size1 = 'tall'
size2 = 'tall'
self.mass1 = 1
self.mass2 = 2
- elif problem_number == 7:
+ elif self.problem_number == 7:
size1 = 'tall'
size2 = 'tall'
self.mass1 = 2
self.mass2 = 1
- elif problem_number == 8:
+ elif self.problem_number == 8:
size1 = 'tall'
size2 = 'tall'
self.mass1 = 1
diff --git a/movableobject.py b/movableobject.py
index e382901..91e308d 100644
--- a/movableobject.py
+++ b/movableobject.py
@@ -17,6 +17,8 @@ from objectarea import Object
from droptargetobject import DropTargetObject
from vector import Vector
+DEBUG = False
+
import gtk, math
class MovableObject(Object):
@@ -90,16 +92,22 @@ class MovableObject(Object):
return boolean
def on_mouse(self, event):
- #print "MovableObject: on_mouse called)"
+ if DEBUG:
+ print "MovableObject: on_mouse called"
+
if not self.selectable:
- #print "MovableObject: on_mouse returning because not selectable: ", self
+ if DEBUG:
+ print "MovableObject: not self.selectable"
return
-
- #print "MovableObject: on_mouse continuing...:", self
-
+ else:
+ if DEBUG:
+ print "MovableObject: IS self.selectable!"
+
epos = Vector(event.x, event.y)
- #print "Movable Object: self.drag_type =", self.drag_type
+ if DEBUG:
+ print "MovableObject: self.drag_type =", self.drag_type
+
# Process in progress dragging, if active.
if self.drag_type:
if self.drag_type == 'rotate':
@@ -134,7 +142,10 @@ class MovableObject(Object):
o.queue_draw()
elif event.type == gtk.gdk.BUTTON_RELEASE:
- #print "movable object: BUTTON_RELEASE"
+
+ if DEBUG:
+ print "MovableObject: BUTTON_RELEASE: ", self
+
if self.container:
self.container.drag_object.dragged = False
@@ -147,20 +158,39 @@ class MovableObject(Object):
#Check whether the drop is inside a drop target.
for o in self.drop_targets:
has_drop_target = True
- #print "movable object: has a drop target"
+
+ if DEBUG:
+ print "MovableObject: has a drop target"
+
if o.contains(self.get_bounds()):
inside_drop_target = True
- #print "movable object: is inside target"
+ if DEBUG:
+ print "MovableObject: is inside target"
+
#if not has_drop_target:
- #print "movable object: try to call processDrop"
+ if DEBUG:
+ print "MovableObject: try to call processDrop"
+
if o.processDrop(self):
- #print "movable object: finished calling processDrop"
+ if DEBUG:
+ print "MovableObject: finished calling processDrop"
return True
self.drag_type = None
- if has_drop_target and not inside_drop_target :
+ if not has_drop_target:
+ if DEBUG:
+ print "MovableObject: No drop target"
+ else:
+ if DEBUG:
+ print "MovableObject: Has a drop target"
+
+ if has_drop_target and not inside_drop_target:
+
+ if DEBUG:
+ print "MovableObject: has_drop_target and not inside_drop_target"
+
self.container.remove_object(self)
if self.drop_origin:
self.drop_origin.select_primary_object()
diff --git a/signsdroptarget.py b/signsdroptarget.py
index 938366c..6c2506e 100644
--- a/signsdroptarget.py
+++ b/signsdroptarget.py
@@ -127,7 +127,9 @@ class SignsDropTarget(DropTargetObject):
movable_object.drop_targets = self.drop_targets
movable_object.drop_origin = self.drop_origin
- self.container.add_object(movable_object)
+ if self.container:
+ self.container.add_object(movable_object)
+
self.contents = movable_object
self.full = True
self.hilite = False
@@ -143,6 +145,14 @@ class SignsDropTarget(DropTargetObject):
elif self.answer_correct():
self.container.selected_object = None
self.freeze_drop_targets()
+
+ if self.answer == 'greater':
+ self.container.increment_n_greater_than_problems_correct()
+ elif self.answer == 'equal':
+ self.container.increment_n_equals_problems_correct()
+ elif self.answer == 'less':
+ self.container.increment_n_less_than_problems_correct()
+
self.container.finish_problem_stage3()
if self.drop_origin:
diff --git a/volumeobject.py b/volumeobject.py
index 88599ff..8f4c3c4 100644
--- a/volumeobject.py
+++ b/volumeobject.py
@@ -22,10 +22,9 @@ import gtk, math
class VolumeObject(MovableObject):
"""Quasi three-dimensional container object."""
- def __init__(self, color, symbol, pos, height = 400, lower_radius = 50, upper_radius = 100):
+ def __init__(self, symbol, pos, height = 400, lower_radius = 50, upper_radius = 100):
MovableObject.__init__(self)
- self.color = color
self.symbol = symbol
self.height = height
diff --git a/volumeproblem.py b/volumeproblem.py
index 3299a2a..730f97f 100644
--- a/volumeproblem.py
+++ b/volumeproblem.py
@@ -36,6 +36,8 @@ class VolumeProblem(Problem):
self.letter1 = letter1
self.letter2 = letter2
+ self.problem_number = -1
+
self.generate_problem()
self.show_problem()
@@ -49,27 +51,19 @@ class VolumeProblem(Problem):
#self.pan2_position = Vector(725, 500)
def generate_problem(self):
- # Choose two random colors.
- (color1, color2) = random.choice([(Color.RED, Color.BLUE), (Color.BLUE, Color.RED), \
- (Color.RED, Color.GREEN), (Color.GREEN, Color.RED), \
- (Color.BLUE, Color.GREEN), (Color.GREEN, Color.BLUE)])
-
- ## Choose two random letter to represent the two quantities
- #letter1 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T'])
- #letter2 = letter1
- #while letter2 == letter1:
- # letter2 = random.choice(['A', 'B', 'C', 'D', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'S', 'T'])
-
+
# The total number of problems.
- n_problems = 3
+ self.n_problems = 12
+
# Choose a random problem.
- problem_number = random.randrange(0,n_problems)
+ while (self.problem_number in self.container.recently_used):
+ self.problem_number = random.randrange(0, self.n_problems)
# Uncomment to test a particular problem.
#problem_number = 0
# Define the various problems.
- if problem_number == 0:
+ if self.problem_number == 0:
# First volume is a cylinder.
self.height1 = 230.0
self.lower_radius1 = 75
@@ -83,7 +77,7 @@ class VolumeProblem(Problem):
self.height2 = self.calculate_height_for_equal_volume(volume1, self.lower_radius2, self.upper_radius2)
volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2)
- elif problem_number == 1:
+ elif self.problem_number == 1:
# First volume is a cylinder.
self.height1 = 230.0
self.lower_radius1 = 75
@@ -97,7 +91,7 @@ class VolumeProblem(Problem):
self.height2 = self.calculate_height_for_equal_volume(1.1 * volume1, self.lower_radius2, self.upper_radius2)
volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2)
- elif problem_number == 2:
+ elif self.problem_number == 2:
# First volume is a cylinder.
self.height1 = 230.0
self.lower_radius1 = 75
@@ -111,7 +105,7 @@ class VolumeProblem(Problem):
self.height2 = self.calculate_height_for_equal_volume(0.9 * volume1, self.lower_radius2, self.upper_radius2)
volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2)
- elif problem_number == 3:
+ elif self.problem_number == 3:
# First volume is a cylinder.
self.height1 = 200.0
self.lower_radius1 = 90
@@ -125,7 +119,7 @@ class VolumeProblem(Problem):
self.height2 = self.calculate_height_for_equal_volume(volume1, self.lower_radius2, self.upper_radius2)
volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2)
- elif problem_number == 4:
+ elif self.problem_number == 4:
# First volume is a cylinder.
self.height1 = 200.0
self.lower_radius1 = 90
@@ -139,7 +133,7 @@ class VolumeProblem(Problem):
self.height2 = self.calculate_height_for_equal_volume(1.1 * volume1, self.lower_radius2, self.upper_radius2)
volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2)
- elif problem_number == 5:
+ elif self.problem_number == 5:
# First volume is a cylinder.
self.height1 = 200.0
self.lower_radius1 = 90
@@ -153,7 +147,7 @@ class VolumeProblem(Problem):
self.height2 = self.calculate_height_for_equal_volume(0.9 * volume1, self.lower_radius2, self.upper_radius2)
volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2)
- elif problem_number == 6:
+ elif self.problem_number == 6:
# First volume is a cylinder.
self.height1 = 180.0
self.lower_radius1 = 87
@@ -167,7 +161,7 @@ class VolumeProblem(Problem):
self.height2 = self.calculate_height_for_equal_volume(volume1, self.lower_radius2, self.upper_radius2)
volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2)
- elif problem_number == 7:
+ elif self.problem_number == 7:
# First volume is a cylinder.
self.height1 = 180.0
self.lower_radius1 = 87
@@ -181,7 +175,7 @@ class VolumeProblem(Problem):
self.height2 = self.calculate_height_for_equal_volume(1.1 * volume1, self.lower_radius2, self.upper_radius2)
volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2)
- elif problem_number == 8:
+ elif self.problem_number == 8:
# First volume is a cylinder.
self.height1 = 180.0
self.lower_radius1 = 87
@@ -195,7 +189,7 @@ class VolumeProblem(Problem):
self.height2 = self.calculate_height_for_equal_volume(0.9 * volume1, self.lower_radius2, self.upper_radius2)
volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2)
- elif problem_number == 9:
+ elif self.problem_number == 9:
# First volume is a cone.
self.height1 = 120.0
self.lower_radius1 = 45
@@ -209,7 +203,7 @@ class VolumeProblem(Problem):
self.height2 = self.calculate_height_for_equal_volume(volume1, self.lower_radius2, self.upper_radius2)
volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2)
- elif problem_number == 10:
+ elif self.problem_number == 10:
# First volume is a cone.
self.height1 = 120.0
self.lower_radius1 = 45
@@ -223,7 +217,7 @@ class VolumeProblem(Problem):
self.height2 = self.calculate_height_for_equal_volume(1.1* volume1, self.lower_radius2, self.upper_radius2)
volume2 = self.calculate_volume(self.height2, self.lower_radius2, self.upper_radius2)
- elif problem_number == 11:
+ elif self.problem_number == 11:
# First volume is a cone.
self.height1 = 120.0
self.lower_radius1 = 45
@@ -249,11 +243,11 @@ class VolumeProblem(Problem):
# Switch the shapes half the time (so we get > as well as < problems).
if random.choice([0,1]) == 0:
- self.shape1 = VolumeObject(color1, self.letter1, original_position1, self.height1, self.lower_radius1, self.upper_radius1)
- self.shape2 = VolumeObject(color2, self.letter2, original_position2, self.height2, self.lower_radius2, self.upper_radius2)
+ self.shape1 = VolumeObject(self.letter1, original_position1, self.height1, self.lower_radius1, self.upper_radius1)
+ self.shape2 = VolumeObject(self.letter2, original_position2, self.height2, self.lower_radius2, self.upper_radius2)
else:
- self.shape1 = VolumeObject(color1, self.letter2, original_position1, self.height1, self.lower_radius1, self.upper_radius1)
- self.shape2 = VolumeObject(color2, self.letter1, original_position2, self.height2, self.lower_radius2, self.upper_radius2)
+ self.shape1 = VolumeObject(self.letter2, original_position1, self.height1, self.lower_radius1, self.upper_radius1)
+ self.shape2 = VolumeObject(self.letter1, original_position2, self.height2, self.lower_radius2, self.upper_radius2)
self.faucet_object = FaucetObject(Vector(0, 100))
self.container.add_object(self.faucet_object)