# Transform Plots Package Version 1.0 with(plots): # This is the format of a function to be entered # as an argument for ttransform_plot_fcn. # g := (x,y) -> [exp(x)*cos(y),exp(x)*sin(y)]; # Transform a 2D plot structure P by a function f. # P is expected to be created by a plot call # producing a PLOT(CURVES(...),...) structure # The function f should be defined in the form # (x,y) -> [exprn1_in_x_y,exprn2_in_x_y]. # The procedure works by applying f to each of the # points in the CURVES part of the plot structure. transform_plot_fcn := proc(P,f1) local pts,new_pts,u,v,w,new_color; u:= f1 @ op; pts := op(1,op(1,P)); new_pts := map(u,pts); new_color := subsop(2=1,op(2,op(1,P))); subsop(1=subsop(1=new_pts,2=new_color, op(1,P)), P); end: # A simple example: # P1 := plot(x^2,x=-1..1); # Image of the parabola under the complex exponential map: # P3 := transform_plot_fcn(P1,g): # display(P3); # Plot a rectangle with corners at [left,top] and [right,lower]. rect_plot0 := proc(left,top,right,lower) local rect1,rect2,rect3,rect4; rect1 := plot([t,top,t=left .. right]); rect2 := plot([t,lower,t=left .. right]); rect3 := plot([left,t,t=lower .. top]); rect4 := plot([right,t,t=lower .. top]); {rect1,rect2,rect3,rect4}; end: # Plot a rectangle with corners at corner1 and corner2. # Both corner1 and corner2 are assumed to be lists of # two elements. rect_plot := proc(corner1,corner2) local top,left,lower,right,rect1,rect2,rect3,rect4; left := corner1[1]; top := corner1[2]; right := corner2[1]; lower := corner2[2]; rect1 := plot([t,top,t=left .. right]); rect2 := plot([t,lower,t=left .. right]); rect3 := plot([left,t,t=lower .. top]); rect4 := plot([right,t,t=lower .. top]); {rect1,rect2,rect3,rect4}; end: # orig_rect := rect_plot([2,4],[3,1]): # display(orig_rect); # Transform a 2D plot structure P by a function f, or # by an expression in a list of variables. Thus acceptable # calls are # transform_plot(P,f) # or # transform_plot(P,[exprn1_in_vars,exprn2_in_vars], # list_of_vars]). transform_plot := proc(P) local fcn,expn,vars; if (nargs = 3) then expn := args[2]; vars := args[3]; fcn := unapply(expn,convert(vars[1],list),convert(vars[2],list)); transform_plot_fcn(P,fcn); elif (nargs = 2) and (type(eval(args[2]),procedure))then transform_plot_fcn(P,args[2]); fi; end: #transform_plot(P1,g); #transform_plot(P1,[exp(x)*cos(y),exp(x)*sin(y)],[x,y]); # A way of combining an original rectangle together with the # image of its boundary: # image_rect := orig_rect union map(u->transform_plot(u,g),orig_rect): # display(image_rect); # Transform the boundary of a rectangle with corners corner1 # and corner2 by fcn. The original rectangle and its image are both # displayed. # The format for corner1 and corner2 is a list of two real numbers. # The function f should be defined in the form # (x,y) -> [exprn1_in_x_y,exprn2_in_x_y]. transform_rect_fcn := proc(corner1,corner2,fcn) local top,left,lower,right,rect1,rect2,rect3,rect4,w, orig_rect; left := corner1[1]; top := corner1[2]; right := corner2[1]; lower := corner2[2]; rect1 := plot([t,top,t=left .. right]); rect2 := plot([t,lower,t=left .. right]); rect3 := plot([left,t,t=lower .. top]); rect4 := plot([right,t,t=lower .. top]); display({rect1,rect2,rect3,rect4,transform_plot(rect1,fcn),transform_plot(rect2,fcn),transform_plot(rect3,fcn),transform_plot(rect4,fcn)}); end: # Transform the boundary of a rectangle with corners corner1 # and corner2 by either a function or by an expression # in a list of variables. # The original rectangle and its image are both displayed. # Transform a 2D plot structure P by a function f, or # by an expression in a list of variables. Thus acceptable # calls are # transform_rect(corner1,corner2,f) # or # transform_plot(corner1,corner2, # [exprn1_in_vars,exprn2_in_vars], # list_of_vars]). transform_rect := proc(corner1,corner2) local fcn,expn,vars; if (nargs = 4) then expn := convert(args[3],list); vars := convert(args[4],list); fcn := unapply(expn,vars[1],vars[2]); transform_rect_fcn(corner1,corner2,fcn); elif (nargs = 3) and (type(eval(args[3]),procedure)) then transform_rect_fcn(corner1,corner2,args[3]); fi; end: # transform_rect([1.,.1],[.1,1.],(x,y) ->[x^2-y^2,2*x*y]); # transform_rect([1.,.1],[.1,1.],[x^2-y^2,2*x*y],[x,y]); help_transform_plots := proc(); printf(`\n\t\t\t\tPlot Transformation Package Version 1.0\n`); printf(`\nThis set of functions aids in transforming two dimensional\n`); printf(`plots by functions from R^2 to R^2.\n`); printf(`\n`); printf(`Basic examples include:\n`); printf(`\n`); printf(`\t\tP1 := plot(x^2,x=-1..1);\n`); printf(`\t\ttransform_plot(P1,[exp(x)*cos(y),exp(x)*sin(y)],[x,y]);\n`); printf(`\n`); printf(`to transform the graph of the parabola y = x^2 by the map\n`); printf(`(x,y) -> [exp(x)*cos(y),exp(x)*sin(y)].\n`); printf(`\n`); printf(`and\n`); printf(`\n`); printf(`\t\ttransform_rect([2.,2.],[1.,1.],[x^2-y^2,2*x*y],[x,y]);\n`); printf(`\n`); printf(`to display the rectangle with corners [1,1] and [2,2]\n`); printf(`together with the image of its boundary under the map\n`); printf(`(x,y) -> [x^2-y^2,2*x*y].\n`); printf(`\n`); printf(`Other routines are:\n`); printf(`\t\trect_plot([2,4],[3,1]);\n`); printf(`to display the rectangle with corners [2,4] and [3,1] and\n`); printf(`\t\thelp_transform_plots();\n`); printf(`to display this message.\n`); printf(`\n`); end: help_transform_plots();