## 19087 Reputation

14 years, 282 days

## Season's Greetings (2015)...

Maple

A modified version of John May's modification of Bruce Char's animated Christmas tree, using some Maple 2015 features to automatically scale the 3D plot and automatically play the animation.

I went with the viewpoint option, and removed the blinking lights. In the worksheet the tree shows as scaled larger. Perhaps it could be a submission to walkingrandomly.

bchartree1.mw  Maple 2015

It looks like the Online Help has now been updated for Maple 2015.

Here's the What's New in Maple 2015 Overview, which is similar to the product pages currently available here.

But we can now also link to and view the online versions of full help pages of new or enhanced commands or example worksheets. For example, dataplot.

acer

## hypotrochoids and symmetric things...

A small piece of code for fun before the weekend, inspired by some recent posts:

http://www.johndcook.com/blog/2015/06/03/mystery-curve/

http://mathlesstraveled.com/2015/06/04/random-cyclic-curves-5/

http://www.walkingrandomly.com/?p=5677

```cycler := proc(t, k, p, m, n, T) local expr, u, v;
u := exp(k*I*t);
expr := exp(I*t) * (1 - u/m + I*(u^(-p))/n);
v := 1 + abs(1/n) + abs(1/m);
plots:-complexplot( expr, t = 0 .. T, axes = none,
view = [-v .. v, -v .. v] );
end proc:

cycler(t, 5, 3, 2, 3, 2*Pi);
``` And that can be made into a small application (needs Maple 18 or 2015),

```Explore( cycler(t, k, p, m, n, T),
parameters = [ k = -10 .. 10, p = -10 .. 10,
m = -10.0 .. 10.0, n = -10.0 .. 10.0,
[ T = 0 .. 2*Pi, animate ] ],
initialvalues = [ k = 5, p = 3, m = 2, n = 3, T = 2*Pi ],
placement = left, animate = false, numframes = 100 );
```

cyclerapp.mw

The animation of parameter T from 0 to 2*Pi can also be fun if the view option is removed/disabled in the call to complexplot. (That could even be made a choice, by adding an additional argument for calling procedure cycler and an accompanying checkbox parameter on the exploration.)

acer

## colorbar for a 3D plot in Maple 2015.1...

Maple 2015

The question of colorbars for plots comes up now and then.

One particular theme involves creating an associated 2D plot as the colorbar, using the data within the given 3D plot. But the issue arises of how to easily display the pair together. I'll mention that Maple 2015.1 (the point-release update) provides quite a simple way to accomplish the display of a 3D plot and an associated 2D colorbar side-by-side.

I'm just going to use the example of the latest Question on this topic. There are two parts to here. The first part involves creating a suitable colorbar as a 2D plot, based on the data in the given 3D plot. The second part involves displaying both together.

Here's the 3D plot used for motivating example, for which in this initial experiment I'll apply shading by using the z-value for hue shading. There are a few ways to do that, and a more complete treatment of the first part below would be to detect the shading scheme and compute the colorbar appropriately.

Some of the code below requires update release Maple 2015.1 in order to work. The colors look much better in the actual Maple Standard GUI than they do in this mapleprimes post (rendered by MapleNet).

```f := 1.7+1.3*r^2-7.9*r^4+16*r^6:

P := plot3d([r, theta, f],
r=0..1, theta=0..2*Pi, coords=cylindrical,
color=[f,1,1,colortype=HSV]):

P;``` Now for the first part. I'll construct two variants, one for a vertical colorbar and one for a horizontal colorbar.

I'll use the minimal and maximal z-values in the data of 3D plot P. This is one of several aspects that needs to be handled according to what's actually inside the 3D plot's data structure.

```zmin,zmax := [min,max](op([1,1],P)[..,..,3])[]:

verthuebar := plots:-densityplot(z, dummy=0..1, z=zmin..zmax, grid=[2,49],
size=[90,260], colorstyle=HUE,
style=surface, axes=frame, labels=[``,``],
axis=[tickmarks=[]]):

horizhuebar := plots:-densityplot(z, z=zmin..zmax, dummy=0..1, grid=[49,2],
size=[300,90], colorstyle=HUE,
style=surface, axes=frame, labels=[``,``],
axis=[tickmarks=[]]):
```

Now we can approach the second part, to display the 3D plot and its colorbar together.

An idea which is quite old is to use a GUI Table for this. Before Maple 2015 that could be done by calling plots:-display on an Array containing the plots. But that involves manual interation to fix it up to look nice: the Table occupies the full width of the worksheet's window and must be resized with the mouse cursor, the relative widths of the columns are not right and must be manually adjusted, the Table borders are all visible and (if unwanted) must be hidden using context-menu changes on the Table, etc. And also the rendering of 2D plots in the display of the generated _PLOTARRAY doesn't respect the size option if applied when creating 2D plots.

I initially thought that I'd have to use several of the commands for programmatic content generation (new in Maple 2015) to build the GUI Table. But in the point-release Maple 2015.1 the size option on 2D plots is respected when using the DocumentTools:-Tabulate command (also new to Maple 2015). So the insertion and display is now possible with that single command.

```DocumentTools:-Tabulate([P,verthuebar],
exterior=none, interior=none,
weights=[100,25], widthmode=pixels, width=420);```  ```DocumentTools:-Tabulate([[P],[horizhuebar]],
exterior=none, interior=none);
```  We may also with to restrict the view, vertically, and have the colorbar match the shades that are displayed.

```DocumentTools:-Tabulate([plots:-display(P,view=2..5),
plots:-display(verthuebar,view=2..5)],
exterior=none, interior=none,
weights=[100,25], widthmode=pixels, width=420);
```  ```DocumentTools:-Tabulate([[plots:-display(P,view=2..5)],
[plots:-display(horizhuebar,view=[2..5,default])]],
exterior=none, interior=none);
```  I'd like to wrap both parts into either one or two procedures, and hopefully I'd find time to do that and post here as a followup comment.

Apart from considerations such as handling various kinds of 3D plot data (GRID vs MESH, etc, in the data structure) there are also the matters of detecting a view (VIEW) if specified when creating the 3D plot, handling custom shading schemes, and so on. And then there's the matter of what to do when multiple 3D surfaces (plots) have been merged together.

It's also possible that the construction of the 2D plot colorbar is the only part which requires decent programming as a procedure with special options. The Tabulate command already offers options to specify the placement, column weighting, Table borders, etc. Perhaps it's not necessary to roll both parts into a single command.

3dhuecolorbarA.mw

acer

## 3D implicit plot with scaled axes...

Maple

Someone asked on math.stackexchange.com about plotting x*y*z=1 and, while it's easy enough to handle it with implicitplot3d it raised the question of how to get nice constained axes in the case that the x- or y-range is much less than the z-range.

Here's what WolframAlpha gives. (Mathematica handles it straight an an plot of the explict z=1/(x*y), which is interesting although I'm more interested here in axes scaling than in discontinuous 3D plots)

Here is the result of a call to implicitplot3d with default scaling=unconstrained. The axes appear like in a cube, each of equal "length". Here is the same plot, with scaling=constrained. This is not pretty, because the x- and y-range are much smalled than the z-range. How can we control the axes scaling? Resizing the inlined plot window with the mouse just affects the window. The plot itself remains  rendered in a cube. Using right-click menus to rescale just makes all axes grow or shrink together.

One unattractive approach it to force a small z-view on a plot of a much larger z-range, for a piecewise or procedure that is undefined outisde a specific range.

```plots:-implicitplot3d(proc(x,y,z)
if abs(z)>200 then undefined;
else x*y*z-1; end if;
end proc,
-1..1, -1..1, -200..200, view=[-1..1,-1..1,-400..400],
style=surfacecontour, grid=[30,30,30]);
``` Another approach is to scale the x and y variables, scale their ranges, and then force scaled tickmark values. Here is a rough procedure to automate such a thing. The basic idea is for it to accept the same kinds of arguments are implicitplot3d does, with two extra options for scaling the axis x-relative-to-z, and axis y-relative-to-z.

```implplot3d:=proc( expr,
rng1::name=range(numeric),
rng2::name=range(numeric),
rng3::name=range(numeric),
{scalex::numeric:=1, scaley::numeric:=1} )
local d1, d2, dz, n1, n2, r1, r2, rngs, scx, scy;
uses plotfn=plots:-implicitplot3d;
(n1,n2) := lhs(rng1), lhs(rng2);
dz := rhs(rhs(rng3))-lhs(rhs(rng3));
(scx,scy) := scalex*dz/(rhs(rhs(rng1))-lhs(rhs(rng1))),
scaley*dz/(rhs(rhs(rng2))-lhs(rhs(rng2)));
(r1,r2) := map(`*`,rhs(rng1),scx), map(`*`,rhs(rng2),scy);
(d1,d2) := rhs(r1)-lhs(r1), rhs(r1)-lhs(r1);
plotfn( subs([n1=n1/scx, n2=n2/scy], expr),
n1=r1, n2=r2, rng3, _rest[],
':-axis'=[':-tickmarks'=[seq(i=evalf(i/scx),i=r1,d1/4)]],
':-axis'=[':-tickmarks'=[seq(i=evalf(i/scy),i=r2,d2/4)]],
':-scaling'=':-constrained');
end proc:
```

The above could be better. It could also detect user-supplied custom x- or y-tickmarks and then scale those instead of forming new ones.

Here is an example of using it,

```implplot3d( x*y*z=1, x=-1..1, y=-1..1, z=-200..200, grid=[30,30,30],
scalex=1.618, scaley=1.618 );
``` Here is another example

```implplot3d( x*y*z=1, x=-5..13, y=-11..5, z=-200..200, grid=[30,30,30],
style=surfacecontour, orientation=[-50,55,0],
scaley=0.5 );
``` Ideally I would like to see the GUI handle all this, with say (two or three) additional (scalar) axis scaling properties in a PLOT3D structure. Barring that, one might ask whether a post-processing routine could use plots:-transform (or friend) and also force the tickmarks. For that I believe that picking off the effective x-, y-, and z-ranges is needed. That's not too hard for the result of a single call to the plot3d command. Where it could get difficult is in handling the result of plots:-display when fed a mix of several spacecurves, 3D implicit plots, and surfaces.

Have I overlooked something much easier?

acer

﻿