Visualizing Linear Transformations in R 3
Worksheet by Michael K. May, S. J., revised by Russell Blyth
restart: with(LinearAlgebra): with(plots): with(plottools):
Warning, the name changecoords has been redefined
Warning, the assigned name arrow now has a global binding
Drawing a 3 dimensional car in Maple
We first need to get Maple to draw a 3 dimensional object. We follow the OnLine section in the student resource manual and work with the image of a car. We start by producing a two dimensional outline of a car.
listcar := [<0,.0954>, <.0102,.1612>, <.1425,.2237>, <.2124,.2336>,
<.2513, .2401>, <.2902, .2401>, <.3187, .3158>, <.3472, .3553>,
<.3912, .3684>, <.4611, .3750>, <.5104, .3783>, <.5674, .3783>,
<.6373, .3783>, <.6710, .3684>, <.6891, .3520>, <.7047, .3388>,
<.7202, .3191>, <.7306, .2961>, <.7409, .2763>, <.7876, .2664>,
<.8135, .2599>, <.8264, .2500>, <.8394, .2368>, <.8472, .2072>,
<.8497, .1612>, <.8497, .1513>, <.8497, .1283>, <.8497, .1020>,
<.7350, .1020>, <.7350, .0510>, <.6840, .0000>, <.6250, .0000>,
<.5740, .0510>, <.5740, .1020>, <.3410, .1020>, <.3410, .0510>,
<.2900, .0000>, <.2310, .0000>, <.1800, .0510>, <.1800, .1020>,
<.0020, .1020>]:
We trace the outline.
pointplot(listcar, style=line, view=[-0.2..1,0..0.5], axes=framed, scaling=constrained, color=black, labels=[x,z], labelfont=[TIMES, BOLD, 12], connect=true);
NiktSSdDVVJWRVNHNiQlKnByb3RlY3RlZEdJKF9zeXNsaWJHNiI2IzdLNyQkIiIhRi0kIiRhKiEiJTckJCIkLSJGMCQiJTc7RjA3JCQiJUQ5RjAkIiVQQUYwNyQkIiVDQEYwJCIlT0JGMDckJCIlOERGMCQiJSxDRjA3JCQiJS1IRjBGQzckJCIlKD0kRjAkIiVlSkYwNyQkIiVzTUYwJCIlYE5GMDckJCIlN1JGMCQiJSVvJEYwNyQkIiU2WUYwJCIlXVBGMDckJCIlL15GMCQiJSR5JEYwNyQkIiV1Y0YwRmluNyQkIiV0akYwRmluNyQkIiU1bkYwRlU3JCQiJSIqb0YwJCIlP05GMDckJCIlWnFGMCQiJSlRJEYwNyQkIiUtc0YwJCIlIj4kRjA3JCQiJTF0RjAkIiVoSEYwNyQkIiU0dUYwJCIlakZGMDckJCIld3lGMCQiJWtFRjA3JCQiJU4iKUYwJCIlKmYjRjA3JCQiJWsjKUYwJCIlK0RGMDckJCIlJVIpRjAkIiVvQkYwNyQkIiVzJSlGMCQiJXM/RjA3JCQiJShcKUYwRjQ3JEZnciQiJTg6RjA3JEZnciQiJSRHIkYwNyRGZ3IkIiU/NUYwNyQkIiVddEYwRmBzNyRGY3MkIiQ1JkYwNyQkIiVTb0YwRiw3JCQiJV1pRjBGLDckJCIlU2RGMEZmczckRl90RmBzNyQkIiU1TUYwRmBzNyRGY3RGZnM3JCQiJStIRjBGLDckJCIlNUJGMEYsNyQkIiUrPUYwRmZzNyRGXXVGYHM3JCQiIz9GMEZgcy1JJlNUWUxFR0YlNiNJJUxJTkVHRigtSSpBWEVTU1RZTEVHRiU2I0kmRlJBTUVHRiUtSStBWEVTTEFCRUxTR0YlNiVJInhHRihJInpHRigtSSVGT05UR0YoNiVJJlRJTUVTR0YoSSVCT0xER0YoIiM3LUkoU0NBTElOR0dGKDYjSSxDT05TVFJBSU5FREdGJS1JJVZJRVdHRiU2JDskISIjISIiJCIiIkYtO0YsJCIiJkZgdy1JJ0NPTE9VUkdGJTYmSSRSR0JHRihGLUYtRi0=
To turn the car into a 3 dimensional object, we insert a y coordinate in between the x and z coordinates. We make the car .35 units wide, with the right side in the x-z plane.
listcarright := map(u-> <u[1], 0, u[2]>,listcar):
listcarleft := map(u-> <u[1], 0.35, u[2]>,listcar):
Let's plot the two sides together, making the right side red and the left side blue. To plot the two sides with specified colors we use the display command. Note that the individual parts of the graph end with colons. The first plot shows two points in R 3 connected by a line segment (rotate the figure).
pointplot3d([<1,2,3>,<2,3,4>], connect=true,axes=boxed,color=red);
NiYtJSpBWEVTU1RZTEVHNiMlJEJPWEctJSdDVVJWRVNHNiM3JDclJCIiIiIiISQiIiNGLiQiIiRGLjclRi9GMSQiIiVGLi0lJkNPTE9SRzYmJSRSR0JHJCIjNSEiIiRGLkY8Rj0tJSxPUklFTlRBVElPTkc2JCQiJFsiRi4kIiNXRi4=
rightside:= pointplot3d(listcarright, connect=true, color=red):
leftside:= pointplot3d(listcarleft, color=blue, connect=true):
display({rightside,leftside},axes=normal, scaling=constrained);
NiYtSSdDVVJWRVNHNiQlKnByb3RlY3RlZEdJKF9zeXNsaWJHNiI2JDdLNyUkIiIhRi1GLCQiJGEqISIlNyUkIiQtIkYwRiwkIiU3O0YwNyUkIiVEOUYwRiwkIiVQQUYwNyUkIiVDQEYwRiwkIiVPQkYwNyUkIiU4REYwRiwkIiUsQ0YwNyUkIiUtSEYwRixGQzclJCIlKD0kRjBGLCQiJWVKRjA3JSQiJXNNRjBGLCQiJWBORjA3JSQiJTdSRjBGLCQiJSVvJEYwNyUkIiU2WUYwRiwkIiVdUEYwNyUkIiUvXkYwRiwkIiUkeSRGMDclJCIldWNGMEYsRmluNyUkIiV0akYwRixGaW43JSQiJTVuRjBGLEZVNyUkIiUiKm9GMEYsJCIlP05GMDclJCIlWnFGMEYsJCIlKVEkRjA3JSQiJS1zRjBGLCQiJSI+JEYwNyUkIiUxdEYwRiwkIiVoSEYwNyUkIiU0dUYwRiwkIiVqRkYwNyUkIiV3eUYwRiwkIiVrRUYwNyUkIiVOIilGMEYsJCIlKmYjRjA3JSQiJWsjKUYwRiwkIiUrREYwNyUkIiUlUilGMEYsJCIlb0JGMDclJCIlcyUpRjBGLCQiJXM/RjA3JSQiJShcKUYwRixGNDclRmdyRiwkIiU4OkYwNyVGZ3JGLCQiJSRHIkYwNyVGZ3JGLCQiJT81RjA3JSQiJV10RjBGLEZgczclRmNzRiwkIiQ1JkYwNyUkIiVTb0YwRixGLDclJCIlXWlGMEYsRiw3JSQiJVNkRjBGLEZmczclRl90RixGYHM3JSQiJTVNRjBGLEZgczclRmN0RixGZnM3JSQiJStIRjBGLEYsNyUkIiU1QkYwRixGLDclJCIlKz1GMEYsRmZzNyVGXXVGLEZgczclJCIjP0YwRixGYHMtSSdDT0xPVVJHRiU2JkkkUkdCR0YlJCIqKysrKyIhIilGLEYsLUYkNiQ3SzclRiwkIiNOISIjRi43JUYyRl52RjQ3JUY3Rl52Rjk3JUY8Rl52Rj43JUZBRl52RkM3JUZGRl52RkM3JUZJRl52Rks3JUZORl52RlA3JUZTRl52RlU3JUZYRl52Rlo3JUZnbkZedkZpbjclRlxvRl52RmluNyVGX29GXnZGaW43JUZib0ZedkZVNyVGZW9GXnZGZ283JUZqb0ZedkZccDclRl9wRl52RmFwNyVGZHBGXnZGZnA3JUZpcEZedkZbcTclRl5xRl52RmBxNyVGY3FGXnZGZXE3JUZocUZedkZqcTclRl1yRl52Rl9yNyVGYnJGXnZGZHI3JUZnckZedkY0NyVGZ3JGXnZGanI3JUZnckZedkZdczclRmdyRl52RmBzNyVGY3NGXnZGYHM3JUZjc0ZedkZmczclRmlzRl52Riw3JUZcdEZedkYsNyVGX3RGXnZGZnM3JUZfdEZedkZgczclRmN0Rl52RmBzNyVGY3RGXnZGZnM3JUZndEZedkYsNyVGanRGXnZGLDclRl11Rl52RmZzNyVGXXVGXnZGYHM3JUZhdUZedkZgcy1GZHU2JkZmdUYsRixGZ3UtSSpBWEVTU1RZTEVHRiU2I0knTk9STUFMR0YlLUkoU0NBTElOR0dGKDYjSSxDT05TVFJBSU5FREdGJQ==
To make it look like a single object we draw lines connecting the two sides of the car. We do that in green.
listcarcross := [seq(op([listcarright[k],listcarleft[k]]),k=1..41)]:
crossing:= pointplot3d(listcarcross, color=green, connect=true):
display({leftside,rightside,crossing},axes=normal, scaling=constrained);
NigtJSpBWEVTU1RZTEVHNiMlJkZSQU1FRy0lJ0NVUlZFU0c2JDdLNyUkIiIhRi1GLCQiJGEqISIlNyUkIiQtIkYwRiwkIiU3O0YwNyUkIiVEOUYwRiwkIiVQQUYwNyUkIiVDQEYwRiwkIiVPQkYwNyUkIiU4REYwRiwkIiUsQ0YwNyUkIiUtSEYwRixGQzclJCIlKD0kRjBGLCQiJWVKRjA3JSQiJXNNRjBGLCQiJWBORjA3JSQiJTdSRjBGLCQiJSVvJEYwNyUkIiU2WUYwRiwkIiVdUEYwNyUkIiUvXkYwRiwkIiUkeSRGMDclJCIldWNGMEYsRmluNyUkIiV0akYwRixGaW43JSQiJTVuRjBGLEZVNyUkIiUiKm9GMEYsJCIlP05GMDclJCIlWnFGMEYsJCIlKVEkRjA3JSQiJS1zRjBGLCQiJSI+JEYwNyUkIiUxdEYwRiwkIiVoSEYwNyUkIiU0dUYwRiwkIiVqRkYwNyUkIiV3eUYwRiwkIiVrRUYwNyUkIiVOIilGMEYsJCIlKmYjRjA3JSQiJWsjKUYwRiwkIiUrREYwNyUkIiUlUilGMEYsJCIlb0JGMDclJCIlcyUpRjBGLCQiJXM/RjA3JSQiJShcKUYwRixGNDclRmdyRiwkIiU4OkYwNyVGZ3JGLCQiJSRHIkYwNyVGZ3JGLCQiJT81RjA3JSQiJV10RjBGLEZgczclRmNzRiwkIiQ1JkYwNyUkIiVTb0YwRixGLDclJCIlXWlGMEYsRiw3JSQiJVNkRjBGLEZmczclRl90RixGYHM3JSQiJTVNRjBGLEZgczclRmN0RixGZnM3JSQiJStIRjBGLEYsNyUkIiU1QkYwRixGLDclJCIlKz1GMEYsRmZzNyVGXXVGLEZgczclJCIjP0YwRixGYHMtJSZDT0xPUkc2JiUkUkdCRyQiIzUhIiIkRi1GaXVGanUtRig2JDdLNyVGLCQiI04hIiNGLjclRjJGX3ZGNDclRjdGX3ZGOTclRjxGX3ZGPjclRkFGX3ZGQzclRkZGX3ZGQzclRklGX3ZGSzclRk5GX3ZGUDclRlNGX3ZGVTclRlhGX3ZGWjclRmduRl92RmluNyVGXG9GX3ZGaW43JUZfb0ZfdkZpbjclRmJvRl92RlU3JUZlb0ZfdkZnbzclRmpvRl92RlxwNyVGX3BGX3ZGYXA3JUZkcEZfdkZmcDclRmlwRl92RltxNyVGXnFGX3ZGYHE3JUZjcUZfdkZlcTclRmhxRl92RmpxNyVGXXJGX3ZGX3I3JUZickZfdkZkcjclRmdyRl92RjQ3JUZnckZfdkZqcjclRmdyRl92Rl1zNyVGZ3JGX3ZGYHM3JUZjc0ZfdkZgczclRmNzRl92RmZzNyVGaXNGX3ZGLDclRlx0Rl92Riw3JUZfdEZfdkZmczclRl90Rl92RmBzNyVGY3RGX3ZGYHM3JUZjdEZfdkZmczclRmd0Rl92Riw3JUZqdEZfdkYsNyVGXXVGX3ZGZnM3JUZddUZfdkZgczclRmF1Rl92RmBzLUZkdTYmRmZ1Rmp1Rmp1Rmd1LUYoNiQ3XnBGK0ZedkYxRmJ2RjZGY3ZGO0ZkdkZARmV2RkVGZnZGSEZndkZNRmh2RlJGaXZGV0ZqdkZmbkZbd0Zbb0Zcd0Zeb0Zdd0Zhb0Zed0Zkb0Zfd0Zpb0Zgd0ZecEZhd0ZjcEZid0ZocEZjd0ZdcUZkd0ZicUZld0ZncUZmd0ZcckZnd0ZhckZod0ZmckZpd0ZpckZqd0Zcc0ZbeEZfc0ZceEZic0ZdeEZlc0ZeeEZoc0ZfeEZbdEZgeEZedEZheEZhdEZieEZidEZjeEZldEZkeEZmdEZleEZpdEZmeEZcdUZneEZfdUZoeEZgdUZpeC1GZHU2JkZmdUZqdUZndUZqdS0lKFNDQUxJTkdHNiMlLENPTlNUUkFJTkVERy0lLE9SSUVOVEFUSU9ORzYkJCIjdkYtJCIjZ0Yt
Finally, we replace the axes with a garage. We will have transformations act on the car, while leaving the garage fixed so that it can act as a reference frame.
garage:=[<0,0,0>, <1,0,0>, <1,.35,0>, <1,0,0>, <1,0,.5>, <1,.35,.5>,
<1,0,.5>, <0,0,.5>, <0,.35,.5>, <0,0,.5>, <0,0,0>, <0,.35,0>,
<1,.35,0>, <1,.35,.5>, <0,.35,.5>, <0,.35,0>]:
garagel:= pointplot3d(garage, color=black, connect=true):
display({leftside,rightside,crossing,garagel}, axes=none, scaling=constrained);
NigtSSdDVVJWRVNHNiQlKnByb3RlY3RlZEdJKF9zeXNsaWJHNiI2JDdLNyUkIiIhRi1GLCQiJGEqISIlNyUkIiQtIkYwRiwkIiU3O0YwNyUkIiVEOUYwRiwkIiVQQUYwNyUkIiVDQEYwRiwkIiVPQkYwNyUkIiU4REYwRiwkIiUsQ0YwNyUkIiUtSEYwRixGQzclJCIlKD0kRjBGLCQiJWVKRjA3JSQiJXNNRjBGLCQiJWBORjA3JSQiJTdSRjBGLCQiJSVvJEYwNyUkIiU2WUYwRiwkIiVdUEYwNyUkIiUvXkYwRiwkIiUkeSRGMDclJCIldWNGMEYsRmluNyUkIiV0akYwRixGaW43JSQiJTVuRjBGLEZVNyUkIiUiKm9GMEYsJCIlP05GMDclJCIlWnFGMEYsJCIlKVEkRjA3JSQiJS1zRjBGLCQiJSI+JEYwNyUkIiUxdEYwRiwkIiVoSEYwNyUkIiU0dUYwRiwkIiVqRkYwNyUkIiV3eUYwRiwkIiVrRUYwNyUkIiVOIilGMEYsJCIlKmYjRjA3JSQiJWsjKUYwRiwkIiUrREYwNyUkIiUlUilGMEYsJCIlb0JGMDclJCIlcyUpRjBGLCQiJXM/RjA3JSQiJShcKUYwRixGNDclRmdyRiwkIiU4OkYwNyVGZ3JGLCQiJSRHIkYwNyVGZ3JGLCQiJT81RjA3JSQiJV10RjBGLEZgczclRmNzRiwkIiQ1JkYwNyUkIiVTb0YwRixGLDclJCIlXWlGMEYsRiw3JSQiJVNkRjBGLEZmczclRl90RixGYHM3JSQiJTVNRjBGLEZgczclRmN0RixGZnM3JSQiJStIRjBGLEYsNyUkIiU1QkYwRixGLDclJCIlKz1GMEYsRmZzNyVGXXVGLEZgczclJCIjP0YwRixGYHMtSSdDT0xPVVJHRiU2JkkkUkdCR0YlJCIqKysrKyIhIilGLEYsLUYkNiQ3SzclRiwkIiNOISIjRi43JUYyRl52RjQ3JUY3Rl52Rjk3JUY8Rl52Rj43JUZBRl52RkM3JUZGRl52RkM3JUZJRl52Rks3JUZORl52RlA3JUZTRl52RlU3JUZYRl52Rlo3JUZnbkZedkZpbjclRlxvRl52RmluNyVGX29GXnZGaW43JUZib0ZedkZVNyVGZW9GXnZGZ283JUZqb0ZedkZccDclRl9wRl52RmFwNyVGZHBGXnZGZnA3JUZpcEZedkZbcTclRl5xRl52RmBxNyVGY3FGXnZGZXE3JUZocUZedkZqcTclRl1yRl52Rl9yNyVGYnJGXnZGZHI3JUZnckZedkY0NyVGZ3JGXnZGanI3JUZnckZedkZdczclRmdyRl52RmBzNyVGY3NGXnZGYHM3JUZjc0ZedkZmczclRmlzRl52Riw3JUZcdEZedkYsNyVGX3RGXnZGZnM3JUZfdEZedkZgczclRmN0Rl52RmBzNyVGY3RGXnZGZnM3JUZndEZedkYsNyVGanRGXnZGLDclRl11Rl52RmZzNyVGXXVGXnZGYHM3JUZhdUZedkZgcy1GZHU2JkZmdUYsRixGZ3UtRiQ2JDdecEYrRl12RjFGYXZGNkZidkY7RmN2RkBGZHZGRUZldkZIRmZ2Rk1GZ3ZGUkZodkZXRml2RmZuRmp2RltvRlt3Rl5vRlx3RmFvRl13RmRvRl53RmlvRl93Rl5wRmB3RmNwRmF3RmhwRmJ3Rl1xRmN3RmJxRmR3RmdxRmV3RlxyRmZ3RmFyRmd3RmZyRmh3RmlyRml3RlxzRmp3Rl9zRlt4RmJzRlx4RmVzRl14RmhzRl54Rlt0Rl94Rl50RmB4RmF0RmF4RmJ0RmJ4RmV0RmN4RmZ0RmR4Rml0RmV4Rlx1RmZ4Rl91Rmd4RmB1Rmh4LUZkdTYmRmZ1RixGZ3VGLC1GJDYkNzI3JUYsRixGLDclJCIiIkYtRixGLDclRmV5Rl52RixGZHk3JUZleUYsJCIiJiEiIjclRmV5Rl52Rml5Rmh5NyVGLEYsRml5NyVGLEZedkZpeUZdekZjeTclRixGXnZGLEZneUZcekZeekZfei1GZHU2JkZmdUYtRi1GLS1JKkFYRVNTVFlMRUdGJTYjSSVOT05FR0YlLUkoU0NBTElOR0dGKDYjSSxDT05TVFJBSU5FREdGJQ==
To reduce typing we define a function that turns a list of points into an outline of the desired color
poly3d := (pointlist, shade) ->
pointplot3d(pointlist, style=line, color=shade, connect=true):
This allows us plot the 4 lists together as follows.
display(
{poly3d(listcarright,red), poly3d(listcarleft, blue),
poly3d(listcarcross, green), poly3d(garage, black)},
axes=none, scaling=constrained);
NigtSSdDVVJWRVNHNiQlKnByb3RlY3RlZEdJKF9zeXNsaWJHNiI2JTcyNyUkIiIhRi1GLEYsNyUkIiIiRi1GLEYsNyVGLyQiI04hIiNGLEYuNyVGL0YsJCIiJiEiIjclRi9GMkY2RjU3JUYsRixGNjclRixGMkY2RjpGKzclRixGMkYsRjFGOUY7RjwtSSdDT0xPVVJHRiU2JkkkUkdCR0YlRi1GLUYtLUkmU1RZTEVHRiU2I0klTElORUdGKC1GJDYlN15wNyVGLEYsJCIkYSohIiU3JUYsRjJGSTclJCIkLSJGS0YsJCIlNztGSzclRk5GMkZQNyUkIiVEOUZLRiwkIiVQQUZLNyVGVEYyRlY3JSQiJUNARktGLCQiJU9CRks3JUZaRjJGZm43JSQiJThERktGLCQiJSxDRks3JUZqbkYyRlxvNyUkIiUtSEZLRixGXG83JUZgb0YyRlxvNyUkIiUoPSRGS0YsJCIlZUpGSzclRmRvRjJGZm83JSQiJXNNRktGLCQiJWBORks3JUZqb0YyRlxwNyUkIiU3UkZLRiwkIiUlbyRGSzclRmBwRjJGYnA3JSQiJTZZRktGLCQiJV1QRks3JUZmcEYyRmhwNyUkIiUvXkZLRiwkIiUkeSRGSzclRlxxRjJGXnE3JSQiJXVjRktGLEZecTclRmJxRjJGXnE3JSQiJXRqRktGLEZecTclRmZxRjJGXnE3JSQiJTVuRktGLEZicDclRmpxRjJGYnA3JSQiJSIqb0ZLRiwkIiU/TkZLNyVGXnJGMkZgcjclJCIlWnFGS0YsJCIlKVEkRks3JUZkckYyRmZyNyUkIiUtc0ZLRiwkIiUiPiRGSzclRmpyRjJGXHM3JSQiJTF0RktGLCQiJWhIRks3JUZgc0YyRmJzNyUkIiU0dUZLRiwkIiVqRkZLNyVGZnNGMkZoczclJCIld3lGS0YsJCIla0VGSzclRlx0RjJGXnQ3JSQiJU4iKUZLRiwkIiUqZiNGSzclRmJ0RjJGZHQ3JSQiJWsjKUZLRiwkIiUrREZLNyVGaHRGMkZqdDclJCIlJVIpRktGLCQiJW9CRks3JUZedUYyRmB1NyUkIiVzJSlGS0YsJCIlcz9GSzclRmR1RjJGZnU3JSQiJShcKUZLRixGUDclRmp1RjJGUDclRmp1RiwkIiU4OkZLNyVGanVGMkZedjclRmp1RiwkIiUkRyJGSzclRmp1RjJGYnY3JUZqdUYsJCIlPzVGSzclRmp1RjJGZnY3JSQiJV10RktGLEZmdjclRmp2RjJGZnY3JUZqdkYsJCIkNSZGSzclRmp2RjJGXnc3JSQiJVNvRktGLEYsNyVGYndGMkYsNyUkIiVdaUZLRixGLDclRmZ3RjJGLDclJCIlU2RGS0YsRl53NyVGandGMkZedzclRmp3RixGZnY3JUZqd0YyRmZ2NyUkIiU1TUZLRixGZnY3JUZgeEYyRmZ2NyVGYHhGLEZedzclRmB4RjJGXnc3JSQiJStIRktGLEYsNyVGZnhGMkYsNyUkIiU1QkZLRixGLDclRmp4RjJGLDclJCIlKz1GS0YsRl53NyVGXnlGMkZedzclRl55RixGZnY3JUZeeUYyRmZ2NyUkIiM/RktGLEZmdjclRmR5RjJGZnYtRj42JkZARiwkIiorKysrIiEiKUYsRkEtRiQ2JTdLRkhGTUZTRllGaW5GX29GY29GaW9GX3BGZXBGW3FGYXFGZXFGaXFGXXJGY3JGaXJGX3NGZXNGW3RGYXRGZ3RGXXVGY3VGaXVGXXZGYXZGZXZGaXZGXXdGYXdGZXdGaXdGXXhGX3hGY3hGZXhGaXhGXXlGYXlGY3ktRj42JkZARml5RixGLEZBLUYkNiU3S0ZMRlJGWEZobkZeb0Zib0Zob0ZecEZkcEZqcEZgcUZkcUZocUZcckZickZockZec0Zkc0Zqc0ZgdEZmdEZcdUZidUZodUZcdkZgdkZkdkZodkZcd0Zgd0Zkd0Zod0ZceEZeeEZieEZkeEZoeEZceUZgeUZieUZmeS1GPjYmRkBGLEYsRml5RkEtSSpBWEVTU1RZTEVHRiU2I0klTk9ORUdGJS1JKFNDQUxJTkdHRig2I0ksQ09OU1RSQUlORURHRiU=
We use the 4 lists in this example for the remainder of the worksheet.
Visualizing Linear Transformations in R3
In a previous worksheet we looked at 2 by 2 matrices acting on R 2 . We are ready to extend this study to R 3 . We borrow a procedure from that previous worksheet that allows us to multiply a matrix by a list of vectors.
multmatbylist := proc(multmat, listofvecs)
map(x->multmat.x,listofvecs);
end:
We start with a matrix that rotates objects by 90 degrees in the y-z plane (that is, around the x-axis). Such a transformation should send e1 to e1, e2 to e3, and e3 to -e2. We designate the matrix rot1.
rot1:= <<1,0,0> |<0,0,1> | <0,-1,0>>;
testvec := <xcoord, ycoord, zcoord>;
rot1.testvec;
NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USVyb3QxRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHRjsvJSljb21wb3NlZEdGOC8lKmNvbnZlcnRlZEdGOC8lK2ltc2VsZWN0ZWRHRjgvJSxwbGFjZWhvbGRlckdGOC8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEfk91dHB1dEYoLyUqbWF0aGNvbG9yR0ZELyUvbWF0aGJhY2tncm91bmRHRkcvJStmb250ZmFtaWx5R0YyLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGKC8lKW1hdGhzaXplR0Y1LUkjbW9HRiU2M1EjOj1GKC8lJWZvcm1HUSZpbmZpeEYoLyUmZmVuY2VHRjgvJSpzZXBhcmF0b3JHRjgvJSdsc3BhY2VHUS90aGlja21hdGhzcGFjZUYoLyUncnNwYWNlR0ZbcC8lKXN0cmV0Y2h5R0Y4LyUqc3ltbWV0cmljR0Y4LyUobWF4c2l6ZUdRKWluZmluaXR5RigvJShtaW5zaXplR1EiMUYoLyUobGFyZ2VvcEdGOC8lLm1vdmFibGVsaW1pdHNHRjgvJSdhY2NlbnRHRjgvJTBmb250X3N0eWxlX25hbWVHRlgvJSVzaXplR0Y1LyUrZm9yZWdyb3VuZEdGRC8lK2JhY2tncm91bmRHRkctRiQ2JS1GX282M1EiW0YoL0Zjb1EncHJlZml4RigvRmZvRjtGZ28vRmpvUS50aGlubWF0aHNwYWNlRigvRl1wRl9yL0ZfcEY7RmBwRmJwRmVwRmhwRmpwRlxxRl5xRmBxRmJxRmRxLUYkNiMtSSdtdGFibGVHRiU2JS1JJG10ckdGJTYlLUkkbXRkR0YlNiMtSSNtbkdGJTY5RmdwRjBGM0Y2L0Y6RjhGPEY+RkBGQkZFRkhGSkZMRk5GUEZSRlRGVkZZRmVuRmduL0ZqblEnbm9ybWFsRihGXG8tRltzNiMtRl5zNjlRIjBGKEYwRjNGNkZgc0Y8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ25GYXNGXG9GY3MtRmhyNiVGY3NGY3MtRltzNiMtRl5zNjlRKSZtaW51czsxRihGMEYzRjZGYHNGPEY+RkBGQkZFRkhGSkZMRk5GUEZSRlRGVkZZRmVuRmduRmFzRlxvLUZocjYlRmNzRmpyRmNzLUZfbzYzUSJdRigvRmNvUShwb3N0Zml4RihGXXJGZ29GXnIvRl1wUTJ2ZXJ5dGhpbm1hdGhzcGFjZUYoRmFyRmBwRmJwRmVwRmhwRmpwRlxxRl5xRmBxRmJxRmRxNyMtX0YpSSxtcHJpbnRzbGFzaEdGKDYkNyM+SSVyb3QxR0YoLUknUlRBQkxFR0YoNiUiKC8icFwtSSdNQVRSSVhHRig2IzclNyUiIiIiIiFGanU3JUZqdUZqdSEiIjclRmp1Rml1Rmp1SSdNYXRyaXhHNiQlKnByb3RlY3RlZEdGKjcjLUZedjYjL0kkJWlkR0YoRmN1
NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USh0ZXN0dmVjRigvJSdmYW1pbHlHUTBUaW1lc35OZXd+Um9tYW5GKC8lJXNpemVHUSMxMkYoLyUlYm9sZEdRJmZhbHNlRigvJSdpdGFsaWNHUSV0cnVlRigvJSp1bmRlcmxpbmVHRjgvJSpzdWJzY3JpcHRHRjgvJSxzdXBlcnNjcmlwdEdGOC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHRjsvJSljb21wb3NlZEdGOC8lKmNvbnZlcnRlZEdGOC8lK2ltc2VsZWN0ZWRHRjgvJSxwbGFjZWhvbGRlckdGOC8lMGZvbnRfc3R5bGVfbmFtZUdRKjJEfk91dHB1dEYoLyUqbWF0aGNvbG9yR0ZELyUvbWF0aGJhY2tncm91bmRHRkcvJStmb250ZmFtaWx5R0YyLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGKC8lKW1hdGhzaXplR0Y1LUkjbW9HRiU2M1EjOj1GKC8lJWZvcm1HUSZpbmZpeEYoLyUmZmVuY2VHRjgvJSpzZXBhcmF0b3JHRjgvJSdsc3BhY2VHUS90aGlja21hdGhzcGFjZUYoLyUncnNwYWNlR0ZbcC8lKXN0cmV0Y2h5R0Y4LyUqc3ltbWV0cmljR0Y4LyUobWF4c2l6ZUdRKWluZmluaXR5RigvJShtaW5zaXplR1EiMUYoLyUobGFyZ2VvcEdGOC8lLm1vdmFibGVsaW1pdHNHRjgvJSdhY2NlbnRHRjgvJTBmb250X3N0eWxlX25hbWVHRlgvJSVzaXplR0Y1LyUrZm9yZWdyb3VuZEdGRC8lK2JhY2tncm91bmRHRkctRiQ2JS1GX282M1EiW0YoL0Zjb1EncHJlZml4RigvRmZvRjtGZ28vRmpvUS50aGlubWF0aHNwYWNlRigvRl1wRl9yL0ZfcEY7RmBwRmJwRmVwRmhwRmpwRlxxRl5xRmBxRmJxRmRxLUYkNiMtSSdtdGFibGVHRiU2JS1JJG10ckdGJTYjLUkkbXRkR0YlNiMtRi02OVEneGNvb3JkRihGMEYzRjZGOUY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG8tRmhyNiMtRltzNiMtRi02OVEneWNvb3JkRihGMEYzRjZGOUY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG8tRmhyNiMtRltzNiMtRi02OVEnemNvb3JkRihGMEYzRjZGOUY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ25GaW5GXG8tRl9vNjNRIl1GKC9GY29RKHBvc3RmaXhGKEZdckZnb0Zeci9GXXBRMnZlcnl0aGlubWF0aHNwYWNlRihGYXJGYHBGYnBGZXBGaHBGanBGXHFGXnFGYHFGYnFGZHE3Iy1fRilJLG1wcmludHNsYXNoR0YoNiQ3Iz5JKHRlc3R2ZWNHRigtSSdSVEFCTEVHRig2JSIoc1tMJy1JJ01BVFJJWEdGKDYjNyU3I0kneGNvb3JkR0YoNyNJJ3ljb29yZEdGKDcjSSd6Y29vcmRHRigmSSdWZWN0b3JHNiQlKnByb3RlY3RlZEdGKjYjSSdjb2x1bW5HRig3Iy1GW3Y2Iy9JJCVpZEdGKEZgdQ==
NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtb0dGJTYzUSJbRigvJSVmb3JtR1EncHJlZml4RigvJSZmZW5jZUdRJXRydWVGKC8lKnNlcGFyYXRvckdRJmZhbHNlRigvJSdsc3BhY2VHUS50aGlubWF0aHNwYWNlRigvJSdyc3BhY2VHRjsvJSlzdHJldGNoeUdGNS8lKnN5bW1ldHJpY0dGOC8lKG1heHNpemVHUSlpbmZpbml0eUYoLyUobWluc2l6ZUdRIjFGKC8lKGxhcmdlb3BHRjgvJS5tb3ZhYmxlbGltaXRzR0Y4LyUnYWNjZW50R0Y4LyUwZm9udF9zdHlsZV9uYW1lR1EqMkR+T3V0cHV0RigvJSVzaXplR1EjMTJGKC8lK2ZvcmVncm91bmRHUSpbMCwwLDI1NV1GKC8lK2JhY2tncm91bmRHUS5bMjU1LDI1NSwyNTVdRigtRiQ2Iy1JJ210YWJsZUdGJTYlLUkkbXRyR0YlNiMtSSRtdGRHRiU2Iy1JI21pR0YlNjlRJ3hjb29yZEYoLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRigvJSVzaXplR0ZTLyUlYm9sZEdGOC8lJ2l0YWxpY0dGNS8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdGVi8lK2JhY2tncm91bmRHRlkvJSdvcGFxdWVHRjgvJStleGVjdXRhYmxlR0Y4LyUpcmVhZG9ubHlHRjUvJSljb21wb3NlZEdGOC8lKmNvbnZlcnRlZEdGOC8lK2ltc2VsZWN0ZWRHRjgvJSxwbGFjZWhvbGRlckdGOC8lMGZvbnRfc3R5bGVfbmFtZUdGUC8lKm1hdGhjb2xvckdGVi8lL21hdGhiYWNrZ3JvdW5kR0ZZLyUrZm9udGZhbWlseUdGZW8vJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YoLyUpbWF0aHNpemVHRlMtRmpuNiMtRl1vNiMtRiQ2JC1GLTYzUSomdW1pbnVzMDtGKEYwL0Y0RjhGNi9GOlEkMGVtRigvRj1GXHMvRj9GOEZARkJGRUZIRkpGTEZORlFGVEZXLUZgbzY5USd6Y29vcmRGKEZjb0Zmb0Zob0Zqb0ZccEZecEZgcEZicEZkcEZmcEZocEZqcEZccUZecUZgcUZicUZkcUZmcUZocUZqcUZcckZfci1Gam42Iy1GXW82Iy1GYG82OVEneWNvb3JkRihGY29GZm9GaG9Gam9GXHBGXnBGYHBGYnBGZHBGZnBGaHBGanBGXHFGXnFGYHFGYnFGZHFGZnFGaHFGanFGXHJGX3ItRi02M1EiXUYoL0YxUShwb3N0Zml4RihGM0Y2RjkvRj1RMnZlcnl0aGlubWF0aHNwYWNlRihGPkZARkJGRUZIRkpGTEZORlFGVEZXNyMtX0YpSSxtcHJpbnRzbGFzaEdGKDYkNyMtSSdSVEFCTEVHRig2JSIob0VpJy1JJ01BVFJJWEdGKDYjNyU3I0kneGNvb3JkR0YoNyMsJEknemNvb3JkR0YoISIiNyNJJ3ljb29yZEdGKCZJJ1ZlY3Rvckc2JCUqcHJvdGVjdGVkR0YqNiNJJ2NvbHVtbkdGKDcjLUZmdTYjL0kkJWlkR0YoRml0
Now we want to multiply the three carlists by rot1 and graph the result. Note that we leave the garage alone.
rlist:=multmatbylist(rot1,listcarright):
llist:=multmatbylist(rot1,listcarleft):
clist:=multmatbylist(rot1,listcarcross):
display(
{poly3d(rlist,red), poly3d(llist, blue),
poly3d(clist, green), poly3d(garage, black)},
axes=none, scaling=constrained);
NigtJSpBWEVTU1RZTEVHNiMlJ05PUk1BTEctJSdDVVJWRVNHNiU3SzclJCIiIUYtJCErKysrUyYqISM2JCIrKysrK04hIzU3JSQiKysrKz81RjAkISsrKys3O0YzRjE3JSQiKysrK0Q5RjMkISsrKytQQUYzRjE3JSQiKysrK0NARjMkISsrKytPQkYzRjE3JSQiKysrKzhERjMkISsrKyssQ0YzRjE3JSQiKysrKy1IRjNGRkYxNyUkIisrKysoPSRGMyQhKysrK2VKRjNGMTclJCIrKysrc01GMyQhKysrK2BORjNGMTclJCIrKysrN1JGMyQhKysrKyVvJEYzRjE3JSQiKysrKzZZRjMkISsrKytdUEYzRjE3JSQiKysrKy9eRjMkISsrKyskeSRGM0YxNyUkIisrKyt1Y0YzRlxvRjE3JSQiKysrK3RqRjNGXG9GMTclJCIrKysrNW5GM0ZYRjE3JSQiKysrKyIqb0YzJCErKysrP05GM0YxNyUkIisrKytacUYzJCErKysrKVEkRjNGMTclJCIrKysrLXNGMyQhKysrKyI+JEYzRjE3JSQiKysrKzF0RjMkISsrKytoSEYzRjE3JSQiKysrKzR1RjMkISsrKytqRkYzRjE3JSQiKysrK3d5RjMkISsrKytrRUYzRjE3JSQiKysrK04iKUYzJCErKysrKmYjRjNGMTclJCIrKysrayMpRjMkISsrKysrREYzRjE3JSQiKysrKyVSKUYzJCErKysrb0JGM0YxNyUkIisrKytzJSlGMyQhKysrK3M/RjNGMTclJCIrKysrKFwpRjNGN0YxNyVGanIkISsrKys4OkYzRjE3JUZqciQhKysrKyRHIkYzRjE3JUZqciQhKysrKz81RjNGMTclJCIrKysrXXRGM0Zjc0YxNyVGZnMkISsrKysrXkYwRjE3JSQiKysrK1NvRjNGLEYxNyUkIisrKytdaUYzRixGMTclJCIrKysrU2RGM0Zpc0YxNyVGYnRGY3NGMTclJCIrKysrNU1GM0Zjc0YxNyVGZnRGaXNGMTclJCIrKysrK0hGM0YsRjE3JSQiKysrKzVCRjNGLEYxNyUkIisrKysrPUYzRmlzRjE3JUZgdUZjc0YxNyUkIisrKysrPyEjN0Zjc0YxLSUmQ09MT1JHNiYlJFJHQkckRi0hIiJGW3YkIiM1Rlx2LSUmU1RZTEVHNiMlJUxJTkVHLUYoNiU3MjclRixGLEYsNyUkIiIiRi1GLEYsNyVGaHYkIiNOISIjRixGZ3Y3JUZodkYsJCIiJkZcdjclRmh2Rlt3Rl93Rl53NyVGLEYsRl93NyVGLEZbd0Zfd0Zid0ZmdjclRixGW3dGLEZqdkZhd0Zjd0Zkdy1GaHU2JkZqdUZbdkZbdkZbdkZfdi1GKDYlN0s3JUYsRi5GLDclRjVGN0YsNyVGOkY8Riw3JUY/RkFGLDclRkRGRkYsNyVGSUZGRiw3JUZMRk5GLDclRlFGU0YsNyVGVkZYRiw3JUZlbkZnbkYsNyVGam5GXG9GLDclRl9vRlxvRiw3JUZib0Zcb0YsNyVGZW9GWEYsNyVGaG9Gam9GLDclRl1wRl9wRiw3JUZicEZkcEYsNyVGZ3BGaXBGLDclRlxxRl5xRiw3JUZhcUZjcUYsNyVGZnFGaHFGLDclRltyRl1yRiw3JUZgckZickYsNyVGZXJGZ3JGLDclRmpyRjdGLDclRmpyRl1zRiw3JUZqckZgc0YsNyVGanJGY3NGLDclRmZzRmNzRiw3JUZmc0Zpc0YsNyVGXHRGLEYsNyVGX3RGLEYsNyVGYnRGaXNGLDclRmJ0RmNzRiw3JUZmdEZjc0YsNyVGZnRGaXNGLDclRmp0RixGLDclRl11RixGLDclRmB1RmlzRiw3JUZgdUZjc0YsNyVGZHVGY3NGLC1GaHU2JkZqdUZddkZbdkZbdkZfdi1GKDYlN15wRmp3RitGW3hGNEZceEY5Rl14Rj5GXnhGQ0ZfeEZIRmB4RktGYXhGUEZieEZVRmN4RlpGZHhGaW5GZXhGXm9GZnhGYW9GZ3hGZG9GaHhGZ29GaXhGXHBGanhGYXBGW3lGZnBGXHlGW3FGXXlGYHFGXnlGZXFGX3lGanFGYHlGX3JGYXlGZHJGYnlGaXJGY3lGXHNGZHlGX3NGZXlGYnNGZnlGZXNGZ3lGaHNGaHlGW3RGaXlGXnRGanlGYXRGW3pGZHRGXHpGZXRGXXpGaHRGXnpGaXRGX3pGXHVGYHpGX3VGYXpGYnVGYnpGY3UtRmh1NiZGanVGW3ZGXXZGW3ZGX3YtJShTQ0FMSU5HRzYjJSxDT05TVFJBSU5FREc=
We see that the transformation turns the car on its side.
As a second example, shear the car in the z direction by the value of .3*x. (This jacks up the back end of the car.)
shear1:= <<1, 2, 3> | <2, 4, 6> |<3, 6, 9>>;
rlist2:=multmatbylist(shear1,listcarright):
llist2:=multmatbylist(shear1,listcarleft):
clist2:=multmatbylist(shear1,listcarcross):
display(
{poly3d(rlist2,red), poly3d(llist2, blue),
poly3d(clist2, green), poly3d(garage, black)},
axes=none, scaling=constrained);
NiQtSSVtcm93RzYjL0krbW9kdWxlbmFtZUc2IkksVHlwZXNldHRpbmdHSShfc3lzbGliR0YoNiUtSSNtaUdGJTY5USdzaGVhcjFGKC8lJ2ZhbWlseUdRMFRpbWVzfk5ld35Sb21hbkYoLyUlc2l6ZUdRIzEyRigvJSVib2xkR1EmZmFsc2VGKC8lJ2l0YWxpY0dRJXRydWVGKC8lKnVuZGVybGluZUdGOC8lKnN1YnNjcmlwdEdGOC8lLHN1cGVyc2NyaXB0R0Y4LyUrZm9yZWdyb3VuZEdRKlswLDAsMjU1XUYoLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GKC8lJ29wYXF1ZUdGOC8lK2V4ZWN1dGFibGVHRjgvJSlyZWFkb25seUdGOy8lKWNvbXBvc2VkR0Y4LyUqY29udmVydGVkR0Y4LyUraW1zZWxlY3RlZEdGOC8lLHBsYWNlaG9sZGVyR0Y4LyUwZm9udF9zdHlsZV9uYW1lR1EqMkR+T3V0cHV0RigvJSptYXRoY29sb3JHRkQvJS9tYXRoYmFja2dyb3VuZEdGRy8lK2ZvbnRmYW1pbHlHRjIvJSxtYXRodmFyaWFudEdRJ2l0YWxpY0YoLyUpbWF0aHNpemVHRjUtSSNtb0dGJTYzUSM6PUYoLyUlZm9ybUdRJmluZml4RigvJSZmZW5jZUdGOC8lKnNlcGFyYXRvckdGOC8lJ2xzcGFjZUdRL3RoaWNrbWF0aHNwYWNlRigvJSdyc3BhY2VHRltwLyUpc3RyZXRjaHlHRjgvJSpzeW1tZXRyaWNHRjgvJShtYXhzaXplR1EpaW5maW5pdHlGKC8lKG1pbnNpemVHUSIxRigvJShsYXJnZW9wR0Y4LyUubW92YWJsZWxpbWl0c0dGOC8lJ2FjY2VudEdGOC8lMGZvbnRfc3R5bGVfbmFtZUdGWC8lJXNpemVHRjUvJStmb3JlZ3JvdW5kR0ZELyUrYmFja2dyb3VuZEdGRy1GJDYlLUZfbzYzUSJbRigvRmNvUSdwcmVmaXhGKC9GZm9GO0Znby9Gam9RLnRoaW5tYXRoc3BhY2VGKC9GXXBGX3IvRl9wRjtGYHBGYnBGZXBGaHBGanBGXHFGXnFGYHFGYnFGZHEtRiQ2Iy1JJ210YWJsZUdGJTYlLUkkbXRyR0YlNiUtSSRtdGRHRiU2Iy1JI21uR0YlNjlGZ3BGMEYzRjYvRjpGOEY8Rj5GQEZCRkVGSEZKRkxGTkZQRlJGVEZWRllGZW5GZ24vRmpuUSdub3JtYWxGKEZcby1GW3M2Iy1GXnM2OVEiMkYoRjBGM0Y2RmBzRjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZhc0Zcby1GW3M2Iy1GXnM2OVEiM0YoRjBGM0Y2RmBzRjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZhc0Zcby1GaHI2JUZjcy1GW3M2Iy1GXnM2OVEiNEYoRjBGM0Y2RmBzRjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZhc0Zcby1GW3M2Iy1GXnM2OVEiNkYoRjBGM0Y2RmBzRjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZhc0Zcby1GaHI2JUZoc0ZkdC1GW3M2Iy1GXnM2OVEiOUYoRjBGM0Y2RmBzRjxGPkZARkJGRUZIRkpGTEZORlBGUkZURlZGWUZlbkZnbkZhc0Zcby1GX282M1EiXUYoL0Zjb1EocG9zdGZpeEYoRl1yRmdvRl5yL0ZdcFEydmVyeXRoaW5tYXRoc3BhY2VGKEZhckZgcEZicEZlcEZocEZqcEZccUZecUZgcUZicUZkcTcjLV9GKUksbXByaW50c2xhc2hHRig2JDcjPkknc2hlYXIxR0YoLUknUlRBQkxFR0YoNiUiKTMnZnQiLUknTUFUUklYR0YoNiM3JTclIiIiIiIjIiIkNyVGaXYiIiUiIic3JUZqdkZddyIiKkknTWF0cml4RzYkJSpwcm90ZWN0ZWRHRio3Iy1GYHc2Iy9JJCVpZEdGKEZidg==
NigtSSdDVVJWRVNHNiQlKnByb3RlY3RlZEdJKF9zeXNsaWJHNiI2JTdecDclJCIrKysraUchIzUkIisrKytDZEYuJCIrKysrJ2UpRi43JSQiKysrK2kpKkYuJCIrKytTcz4hIiokIisrK2dlSEY4NyUkIisrKytRXEYuJCIrKysrdykqRi4kIisrK1MiWyJGODclJCIrKyshUT4iRjgkIisrK2coUSNGOCQiKysrUyJlJEY4NyUkIisrKytPIilGLiQiKysrP0Y7RjgkIisrKyEzVyNGODclJCIrKytnODpGOCQiKysrP0ZJRjgkIisrKyEzYSVGODclJCIrKysrSyIqRi4kIisrK1NFPUY4JCIrKytnUkZGODclJCIrKys/ODtGOCQiKysrU0VLRjgkIisrK2dSW0Y4NyUkIisrKys7KCpGLiQiKysrP1Y+RjgkIisrKyFbIkhGODclJCIrKytncjtGOCQiKysrP1ZMRjgkIisrKyFbLCZGODclJCIrKytdNTVGOCQiKysrK0A/RjgkIisrK11KSUY4NyUkIisrK101PEY4JCIrKysrQE1GOCQiKysrXUpeRjg3JSQiKysrNW03RjgkIisrKz9LREY4JCIrKytJKXokRjg3JSQiKysrNW0+RjgkIisrKz9LUkY4JCIrKytJKSplRjg3JSQiKysrNTg5RjgkIisrKz9FR0Y4JCIrKytJUlVGODclJCIrKys1OEBGOCQiKysrP0VVRjgkIisrK0lSakY4NyUkIisrK1MnXCJGOCQiKysrIUcqSEY4JCIrKys/KlslRjg3JSQiKysrUyc+I0Y4JCIrKyshR1IlRjgkIisrKz8qZSdGODclJCIrKys1J2UiRjgkIisrKz9zSkY4JCIrKytJZVpGODclJCIrKys1J0cjRjgkIisrKz9zWEY4JCIrKytJZW9GODclJCIrKytJWDtGOCQiKysrZyFIJEY4JCIrKyshZiRcRjg3JSQiKysrSVhCRjgkIisrK2chcCVGOCQiKysrIWYuKEY4NyUkIisrK0ktPEY4JCIrKytnL01GOCQiKysrIXA1JkY4NyUkIisrK0ktQ0Y4JCIrKytnL1tGOCQiKysrIXA/KEY4NyUkIisrKz9zPEY4JCIrKytTV05GOCQiKysrZztgRjg3JSQiKysrP3NDRjgkIisrK1NXXEY4JCIrKytnO3VGODclJCIrKys/dzxGOCQiKysrU19ORjgkIisrK2dHYEY4NyUkIisrKz93Q0Y4JCIrKytTX1xGOCQiKysrZ0d1Rjg3JSQiKysrNVg8RjgkIisrKz8hXCRGOCQiKysrSU5fRjg3JSQiKysrNVhDRjgkIisrKz8hKltGOCQiKysrSU50Rjg3JSQiKysrNUA8RjgkIisrKz9VTUY4JCIrKytJal5GODclJCIrKys1QENGOCQiKysrP1VbRjgkIisrK0lqc0Y4NyUkIisrK114O0Y4JCIrKysrYkxGOCQiKysrXUtdRjg3JSQiKysrXXhCRjgkIisrKytiWkY4JCIrKytdS3JGODclJCIrKyshKj07RjgkIisrKyF5QiRGOCQiKysrcWNbRjg3JSQiKysrISo9QkY4JCIrKysheWolRjgkIisrK3FjcEY4NyUkIisrKyEpcDpGOCQiKysrZ1JKRjgkIisrK1M0WkY4NyUkIisrKyEpcEFGOCQiKysrZ1JYRjgkIisrK1M0b0Y4NyUkIisrKyFvZSJGOCQiKysrZ3RKRjgkIisrK1NnWkY4NyUkIisrKyFvRyNGOCQiKysrZ3RYRjgkIisrK1Nnb0Y4NyUkIisrKz8kZiJGOCQiKysrUyc9JEY4JCIrKytnelpGODclJCIrKys/JEgjRjgkIisrK1MnZSVGOCQiKysrZ3pvRjg3JSQiKysrU3c6RjgkIisrKyFHOiRGOCQiKysrP0haRjg3JSQiKysrU3dBRjgkIisrKyFHYiVGOCQiKysrP0hvRjg3JSQiKysrISlcOkY4JCIrKytnKjQkRjgkIisrK1NcWUY4NyUkIisrKyEpXEFGOCQiKysrZypcJUY4JCIrKytTXG5GODclJCIrKyshKW85RjgkIisrK2dQSEY4JCIrKytTMVdGODclJCIrKyshKW9ARjgkIisrK2dQVkY4JCIrKytTMWxGODclJCIrKytJTDhGOCQiKysrZ21FRjgkIisrKyEqKipSRjg3JSQiKysrSUw/RjgkIisrK2dtU0Y4JCIrKyshKio0J0Y4NyUkIisrK2cuOEY4JCIrKys/MkVGOCQiKysrITMiUkY4NyUkIisrK2cuP0Y4JCIrKys/MlNGOCQiKysrITMsJ0Y4NyUkIisrK2dNN0Y4JCIrKys/cENGOCQiKysrIVFxJEY4NyUkIisrK2dNPkY4JCIrKys/cFFGOCQiKysrIVEhZUY4NyUkIisrK3FiNkY4JCIrKytTNkJGOCQiKysrNW5NRjg3JSQiKysrcWI9RjgkIisrK1M2UEY4JCIrKys1bmJGODclJCIrKysrVDVGOCQiKysrKyMzI0Y4JCIrKysrQkpGODclJCIrKysrVDxGOCQiKysrKyNbJEY4JCIrKysrQl9GODclJCIrKysrISkpKUYuJCIrKysrdzxGOCQiKysrK2tFRjg3JSQiKysrKyllIkY4JCIrKysrd0pGOCQiKysrK2taRjg3JSQiKysrK1NvRi4kIisrKytvOEY4JCIrKysrXz9GODclJCIrKysrJVEiRjgkIisrKytvRkY4JCIrKysrX1RGODclJCIrKysrXWlGLiQiKysrK103RjgkIisrKyt2PUY4NyUkIisrKytEOEY4JCIrKysrXUVGOCQiKysrK3ZSRjg3JSQiKysrK3FzRi4kIisrKythOUY4JCIrKysrIj0jRjg3JSQiKysrK0Y5RjgkIisrKythR0Y4JCIrKysrIkclRjg3JSQiKysrKyspKUYuJCIrKysrZzxGOCQiKysrK1NFRjg3JSQiKysrKyFlIkY4JCIrKysrZ0pGOCQiKysrK1NaRjg3JSQiKysrK3FrRi4kIisrKyslSCJGOCQiKysrK1Q+Rjg3JSQiKysrK1o4RjgkIisrKyslcCNGOCQiKysrK1RTRjg3JSQiKysrK1NcRi4kIisrKyshKSkqRi4kIisrKysjWyJGODclJCIrKysrJT4iRjgkIisrKyspUSNGOCQiKysrKyNlJEY4NyUkIisrKysrSEYuJCIrKysrK2VGLiQiKysrKysoKUYuNyUkIisrKysrKipGLiQiKysrKyEpPkY4JCIrKysrcUhGODclJCIrKysrNUJGLiQiKysrKz9ZRi4kIisrKytJcEYuNyUkIisrKys1JCpGLiQiKysrK2k9RjgkIisrKyskeiNGODclJCIrKysrSUxGLiQiKysrK2dtRi4kIisrKyshKioqRi43JSQiKysrK0w1RjgkIisrKyttP0Y4JCIrKysrKjQkRjg3JSQiKysrK2dbRi4kIisrKys/KCpGLiQiKysrK2U5Rjg3JSQiKysrKyc9IkY4JCIrKysrc0JGOCQiKysrK2VORjg3JSQiKysrKyEzJEYuJCIrKysrZ2hGLiQiKysrK1MjKkYuNyUkIisrKyszNUY4JCIrKysrOz9GOCQiKysrK0NJRjgtSSdDT0xPVVJHRiU2JkkkUkdCR0YlJCIiIUZqX20kIiorKysrIiEiKUZpX20tSSZTVFlMRUdGJTYjSSVMSU5FR0YoLUYkNiU3S0YrRjtGSUZXRl9vRl1wRltxRmlxRmdyRmVzRmN0RmF1Rl92Rl13Rlt4Rml4Rmd5RmV6RmNbbEZhXGxGX11sRl1ebEZbX2xGaV9sRmdgbEZlYWxGY2JsRmFjbEZfZGxGXWVsRltmbEZpZmxGZ2dsRmVobEZjaWxGYWpsRl9bbUZdXG1GW11tRmldbUZnXm0tRmZfbTYmRmhfbUZbYG1GaV9tRmlfbUZeYG0tRiQ2JTdLRjNGQkZQRmhuRmZvRmRwRmJxRmByRl5zRlx0Rmp0Rmh1RmZ2RmR3RmJ4RmB5Rl56RlxbbEZqW2xGaFxsRmZdbEZkXmxGYl9sRmBgbEZeYWxGXGJsRmpibEZoY2xGZmRsRmRlbEZiZmxGYGdsRl5obEZcaWxGamlsRmhqbEZmW21GZFxtRmJdbUZgXm1GXl9tLUZmX202JkZoX21GaV9tRmlfbUZbYG1GXmBtLUYkNiU3MjclRmlfbUZpX21GaV9tNyUkIiIiRmpfbUZpX21GaV9tNyVGYWFtJCIjTiEiI0ZpX21GYGFtNyVGYWFtRmlfbSQiIiYhIiI3JUZhYW1GZGFtRmhhbUZnYW03JUZpX21GaV9tRmhhbTclRmlfbUZkYW1GaGFtRlxibUZfYW03JUZpX21GZGFtRmlfbUZjYW1GW2JtRl1ibUZeYm0tRmZfbTYmRmhfbUZqX21Gal9tRmpfbUZeYG0tSSpBWEVTU1RZTEVHRiU2I0klTk9ORUdGJS1JKFNDQUxJTkdHRig2I0ksQ09OU1RSQUlORURHRiU=