NAME
math-image -- display some mathematical images
SYNOPSIS
math-image [--options]
DESCRIPTION
math-image
displays some mathematical images, either
in a Gtk2 or Wx GUI,
as an image file output,
or setting the root window.
There's many options for what to display, in particular the display includes Ulam's spiral of prime numbers and several variations on the numbers in a path such as Sacks spiral and Vogel floret. Try --random
or the Randomize button for interesting combinations.
Most of the code is plain Perl, so it's not blindingly fast, but the GUI or root window is drawn progressively so you can see what's happening. In the GUI you can change the controls while drawing to start again on something else.
Mouse button 1 in the GUI drags the image to see parts away from the origin and which otherwise wouldn't fit on screen. This can become slow when displaying things like prime numbers which must be calculated all the way up to the desired part.
The number sequences displayed are from Math::NumSeq, and the paths they're plotted on are from Math::PlanePath.
OPTIONS
Values Options
The following options control what set of values to display. The --values
option described last is the most general.
- --primes
-
The prime numbers.
- --twin
- --twin1
- --twin2
-
The twin primes.
--twin
is both twins like 11,13.--twin1
is just the first of each like 11, or--twin2
is just the second like 13. - --semi-primes
- --semi-primes-odd
-
The semi-prime or bi-prime numbers, meaning integers which have two prime factors p*q. This includes p==q squares of primes.
--semi-primes-odd
is just the odd semiprimes, so 2 excluded from p and q. - --squares
-
The perfect squares 1, 4, 9, 16, 25, 36, etc.
- --pronic
-
The pronic numbers 2, 6, 12, 20, 30, 42, etc, k*(k+1). These are half way between successive perfect squares, and twice the triangular numbers.
- --triangular
-
The triangular numbers 1, 3, 6, 10, 15, 21, etc, k*(k+1)/2.
- --polygonal=K
-
The K-sided polygon numbers. For example
--polygonal=3
is the triangular numbers,--polygonal=4
is the squares. - --cubes
- --tetrahedral
-
The cubes 1, 8, 27, 64, 125, etc or tetrahedral numbers 1, 4, 10, 20, 35, 56, etc. These tend to grow too quickly to display much of a pattern, though the Vogel floret is close,
math-image --cubes --vogel
- --fibonacci
-
The Fibonacci numbers 1,1,2,3,5,8,13,21, etc. On the Vogel floret these fall on an axis going to the right. For other spirals and paths they tend to grow too quickly to show much.
- --perrin
-
The Perrin numbers 3, 0, 2, 3, 2, 5, 5, 7, 10, etc. These are a cubic recurrence and tend to grow too quickly to display much of a pattern.
- --fraction=5/29
- --fraction=1.234
-
The digits in the decimal expansion of a fraction. For example the default in the GUI is 5/29. A decimal like 1.234 means 1234/1000.
A fraction is always a repeating pattern, with length no longer than the denominator, but it can give interesting patterns for various paths. For example
math-image --corner \ --values=FractionDigits,radix=2,fraction=1/137
gives the fine structure constant 1/137 in binary on the Corner path. It's a repeating pattern of an angry man with a beard and a skull wearing a hat. No doubt this has deep cosmic significance.
- --all
- --odd
- --even
-
All integers, or just odd or even integers. For the paths which fill the plane
--all
will just fill the screen (slowly!), but for things like--sacks
and--vogel
it shows where all the points lie. - --aronson
-
Aronson's sequence 1,4,9,... of "T is the first, fourth, ninth, ...". This requires the Math::NumSeq::Aronson module.
- --expression='i**2 + 2*i + 1'
-
Draw values following a formula. It should have a single variable which will be evaluated at 0,1,2, etc. The default is Perl syntax on an "i". See Math::NumSeq::Expression for more information.
- --oeis=A000217
-
Values selected by their A-number per Sloane's Online Encyclopedia of Integer Sequences. Some A-numbers are implemented by code modules, others are read from files in a ~/OEIS/ directory. See Math::NumSeq::OEIS for details. For example, the triangular numbers are A000217,
math-image --oeis=A000217
- --lines
-
Draw lines along the path instead of a set of selected points. This shows where a path travels though you may have to increase the
--scale
to see it properly.When the scale is big enough the usual figure is drawn at each point (default a square or circle). Use
--figure=point
for just the lines. - --values=MODULE
- --values=MODULE,NAME=VALUE,NAME=VALUE,...
-
Draw values from the given
Math::NumSeq
module (including experimentalMathImageWhatever
ones). For examplemath-image --values=Emirps
Parameters can be passed as comma separated NAME=VALUE, for example
math-image --values=TwinPrimes,pairs=both
The
File
module can read values from a text file (see Math::NumSeq::File)math-image --values=File,filename=/my/dir/data.txt
Path Options
The following control the path in the plane where on which the values will be displayed. The --path
option described last is the most general.
- --ulam
-
Ulam's primes in a square spiral (currently the default).
- --vogel
-
Vogel's floret design for the positions of seeds in a sunflower (see Math::PlanePath::VogelFloret). Try the following to see all the points in the pattern before applying various special sets of values.
math-image --vogel --all --scale=10
Scaling up helps the circles draw properly. When the values displayed are less than all the integers a lower scale can be used.
- --sacks
-
An Archimedian spiral with the square root as angle of rotation, by Robert Sacks (see Math::PlanePath::SacksSpiral).
- --theodorus
-
The spiral of Theodorus or square-root spiral (see Math::PlanePath::TheodorusSpiral).
- --diamond
-
A diamond shaped spiral (see Math::PlanePath::DiamondSpiral).
- --pyramid
-
The sides of a pyramid shape (see Math::PlanePath::PyramidSides).
- --pyramid-rows
-
A pyramid made from horizontal rows (see Math::PlanePath::PyramidRows).
- --corner
- --diagonals
-
Corners or diagonals between the X and Y axes, per Math::PlanePath::Corner and Math::PlanePath::Diagonals.
- --rows
- --columns
-
Points drawn in successive rows or columns.
- --path=MODULE
- --path=MODULE,NAME=VALUE,NAME=VALUE,...
-
Draw with the given
Math::PlanePath
module. For examplemath-image --path=HeptSpiralSkewed
Parameters to the path can be supplied as comma separated
NAME=VALUE
. For example,math-image --path=SquareSpiral,wider=3
Other Options
- --random
-
Choose a path and values at random. For example in your ~/.xsession
math-image --root --random
- --foreground=COLOUR
- --background=COLOUR
-
Set the foreground and background colours. The colours can be either names or hex style #RRGGBB or #RRRRGGGGBBBB. For example white on a shade of red,
math-image --foreground=white --background=#A01010
The default is white foreground on black background. For a
--root
background a bright white can be a bit hard on the eye when there's a lot of points shown. Try a shade of grey insteadmath-image --root --foreground=lightgrey
Available names depend on the output module.
X11::Protocol
--root
uses the X server's database, usually /etc/X11/rgb.txt. Gtk2 uses its own hard-coded copy of that /etc/X11/rgb.txt.--png
with GD has theGD::Simple
names.--xpm
withImage::Xpm
passes anything at all through to the file. For--text
, currently the colours can be single characters to show, though perhaps that will change. - --size=PIXELS
- --size=WIDTHxHEIGHT
-
Set the size of the image in pixels. A single value means a square of that size, otherwise say 400x300. For
--root
this size is currently ignored and the full screen used.For the GUI, this is an initial drawing size, though the menu bar width might force it wider than requested. Under
--fullscreen
, the size is the unfullscreened window if you switch back to that (menu entry Tools/Fullscreen).The default for the GUI is about 4/5 of the screen. The default for PNG etc image file output is an arbitrary 200x200, or for
--text
output the size of the terminal fromTerm::Size
. - --scale=PIXELS
-
How many pixels for each value shown. The current default is 3 to show 3x3 pixel squares, or for
--text
output just 1 for a single character per point. - --figure=F
-
Draw a given shape figure at each point. The default is either a square or circle depending on the path. The choices are
point single pixel square solid box unfilled square circle solid ring unfilled circle diamond solid diamunf unfilled diamond plus "+" shape X "X" shape L "L" shape N "N" shape V "V" shape Z "Z" shape arrow arrow in direction of path
- --help, -?
-
Print a summary of the options.
- --version
-
Print the program version number.
GUI Options
The default is to run the Gtk GUI.
- --display=DPY
-
Select the X server for X11 or Gtk output. The default is from the
DISPLAY
environment variable (normally set at X startup).math-image --display=:3
- --fullscreen
-
Start the GUI in full screen mode. The Tools/Fullscreen menu entry can toggle between full screen and a normal window. In full screen mode the menus still work, just press Alt-F, Alt-T, etc as normal to pop up.
- --wx
-
Run the wxWidgets GUI. This requires wxPerl (see Wx), probably for wxWidgets 2.8 or higher.
- --prima
-
Run the Prima GUI. This requires the Prima module (see Prima) and the separate
Image::Base::Prima::Drawable
module. It doesn't yet have the full set of options the Gtk2 GUI does, but should work as far as it goes. - --tk
-
Run the Tk GUI. This requires Perl-Tk (see Tk). It doesn't yet have the full set of options the Gtk GUI does, but works as far as it goes.
- --<gtk-options>
-
Standard Gtk options. See gtk-options(7) for the full list. The only one which does much for
math-image
is--display
to set the X display (default from theDISPLAY
environment variable).
The Gtk and Prima GUIs have printer output through their usual printing mechanisms. In the current code, the Gtk one is a screen dump but the Prima one is a PostScript re-run of the image drawing which might be a bit slow, but might be higher resolution for circle figures.
There's some very rudimentary support for --module=Curses
for Curses::UI
. It runs but is only experimental yet.
Output Types
- --root
-
Set the root window background to the requested image and exit. For example to draw a random image from your ~/.xsession startup,
math-image --root --random &
Add
--verbose
to print what was chosen (output from ~/.xsession normally goes to the ~/.xsession-errors file). Sometimes--random
may use a lot of memory, so considerlimit
ortimeout
or both, and perhaps low priority (see sh(1), timeout(1) and nice(1)).The root window is set with
Gtk2
, or under X withX11::Protocol::XSetRoot
if available. TheXSetRoot
method usesEsetroot
style and so supports pseudo-transparency such asEterm --trans
.XSetRoot
also preserves colormap entries on aPseudoColor
visual and can act on an__SWM_VROOT
style window manager virtual root. - --flash
-
Flash the requested image on the screen instead of starting the GUI. A combination
--root --flash
means draw to the root and then flash. This is good if updating the background randomly every so often, since it shows the completed image briefly where it might be hidden underneath windows.math-image --root --random --flash
The flash is done with a temporary full-screen window, either some X11 native or a Gtk2 (see Gtk2::Ex::Splash). In both cases the keyboard focus is unchanged so you don't lose any typing, but the flash does eat mouse clicks.
- --png
- --xpm
-
Write a PNG or XPM image file to standard output and exit. PNG is always possible with
Gtk2::Gdk::Pixbuf
but it can also use GD, PNGwriter, Imager, ImageMagick, Prima, Tk or Wx with the right libraries andImage::Base
supporting module.math-image --png >/tmp/my-file.png
XPM output requires either
Image::Xpm
, ImageMagick, Prima, Tk or Wx.Combinations
--prima --png
, or--tk --xpm
, etc, force the respective output module rather than an automatic choice among available possibilities. Prima, Tk and Wx under X require the X server even when writing to a file and may give obscure error messages if no X display available. - --text
-
Write a text-only image to standard output and exit. The default size follows the terminal with
Term::Size
or can be set with--size=WIDTH,HEIGHT
, A typical tty size like 80x25 is usually too small to see much, but a bigger image might be cute to send to a line printer or similar.math-image --text --size=130x49 | lpr
For images which would be colours in the GUI, the text output is a digit which is the value at that point. This is slightly experimental, especially for big sequence values, but currently for example
math-image --values=PrimeFactorCount --text --size=5x5 14221 31213 12011 31322 22142
- --xscreensaver
-
Run under the xscreensaver(1) program. This requires the
X11::Protocol::XSetRoot
module. This option is slightly experimental but works as far as it goes.To make
math-image
available inxscreensaver
, add to the "programs:" section of your ~/.xscreensaver file,math-image --xscreensaver \n\
File xscreensaver/math-image.xml in the Math-Image sources can be used give a description in the
xscreensaver-demo
program. Currently "make install" doesn't try to install this so it must be copied manually to the /usr/share/xscreensaver/config/ directory.There's no options for the screensaver yet. The intention would be a control for the redraw rate (unless there's a global xscreensaver option for that), and to limit each image drawing to the redraw time so slow or very slow things aren't continued indefinitely.
For reference, under
xscreensaver
a saver program draws to a target window given either by__SWM_VROOT
root window property from thexscreensaver
daemon, or by a-window-id
command line option underxscreensaver-demo
.__SWM_VROOT
is recognised byX11::Protocol::XSetRoot
version 18 and up.
MODULES
In addition to the various modules noted above, the following are used in the Gtk2 GUI if available,
Gtk2::Ex::PodViewer
Tk::Pod
Wx::Perl::PodBrowser
-
The "Help/POD Documentation" menu items to display this documentation and the various path and values classes, under Gtk, Tk or Wx respectively.
Gtk2::Ex::CrossHair
-
Lines following the cursor, enabled from the Tools/Cross menu item.
Gtk2::Ex::ErrorTextDialog
-
Error messages in a dialog instead of to
STDERR
. Of course there shouldn't be any errors! Gtk2::Ex::QuadButton
-
Scroll arrows in the bottom right corner.
ENVIRONMENT VARIABLES
DISPLAY
-
The X display to use.
TMPDIR
-
Temporary directory to use, as per File::Temp and File::Spec (and on MS-DOS
File::Spec
may look atTEMP
orTMP
too, per File::Spec::Win32).
BUGS
Some of the values or coordinates can be a slow to generate, or use a lot of memory, or both. When the path goes out to large positions, or when scrolled out away from the origin, the display might hang a little or a lot while generating values. In a few cases, producing the mouse X,Y location for the status bar may even be slow too, and might make it look like drawing has hung.
The paths which have big N values near the origin, such as RationalsTree
or PythagoreanTree
, are calculated with Math::BigInt
for accuracy. This becomes very slow. In some cases the values and/or path calculations might end up rounding off anyway.
When plotting colours on paths which duplicate points (eg. the DragonCurve
), the colour shown is sometimes the smallest N or sometimes the biggest N due to overwriting. Not sure whether to try some colour mixing, or force the smallest among overlaps.
Colours for counts etc have some hard-coded scaling to show a range of colours for the typical range of values. There ought to be a user control for this. Perhaps relevant NumSeq
modules should indicate their approximate growth rate to make a sensible initial scale.
For --wx
, recent Wx uses Gtk-3 which has badly downgraded its default appearance. The Raleigh Reloaded theme and Sans-Serif 10 font is recommended to restore reasonable desktop appearance (including removing wasteful and irritating animations).
SEE ALSO
Gtk2, X11::Protocol, X11::Protocol::XSetRoot, Gtk2::Ex::PodViewer, Gtk2::Ex::CrossHair, Gtk2::Ex::ErrorTextDialog
xscreensaver(1), and in particular its ccurve(6x) which is a saver displaying various C curve, dragon curve and Koch curves.
HOME PAGE
http://user42.tuxfamily.org/math-image/index.html
LICENSE
Math-Image is Copyright 2010, 2011, 2012, 2013, 2014, 2019 Kevin Ryde
Math-Image 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; either version 3, or (at your option) any later version.
Math-Image is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 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 Math-Image. If not, see <http://www.gnu.org/licenses/>.