184 lines
4.8 KiB
Markdown
184 lines
4.8 KiB
Markdown
## To build:
|
|
|
|
``` <!---sh-->
|
|
make
|
|
```
|
|
|
|
There is an alternate version of this entry which should work for Windows by
|
|
setting binary mode on `stdout`. See [Alternate code](#alternate-code) below.
|
|
|
|
|
|
## To use:
|
|
|
|
``` <!---sh-->
|
|
./persano p q [num frames]
|
|
```
|
|
|
|
|
|
## Try:
|
|
|
|
``` <!---sh-->
|
|
./try.sh
|
|
```
|
|
|
|
Open the [GIF](https://en.wikipedia.org/wiki/GIF) files with a viewer capable of
|
|
displaying animated GIFs and watch closely at the bottom of the picture (you may
|
|
need to use [gifsicle](https://www.lcdf.org/gifsicle/) - a great tool to
|
|
manipulate animated GIFs - to slow down the animation and to compress the GIFs
|
|
generated by the entry).
|
|
|
|
|
|
## Alternate code:
|
|
|
|
This (untested as we have no Windows system) version uses the Windows API
|
|
functions `_setmode()` and `_fileno(3)` to set binary mode on `stdout` which should
|
|
let it work with Windows.
|
|
|
|
|
|
### Alternate build:
|
|
|
|
```
|
|
make alt
|
|
```
|
|
|
|
|
|
### Alternate use:
|
|
|
|
Use `persano.alt` as you would `persano` above.
|
|
|
|
|
|
### Alternate try:
|
|
|
|
``` <!---sh-->
|
|
./persano.alt 3 16 > knot3-16.gif
|
|
```
|
|
|
|
Follow the same instructions, using different tools if necessary, as the above
|
|
try section.
|
|
|
|
|
|
## Judges' remarks:
|
|
|
|
If your system is one of those that distinguish between text and binary
|
|
streams, you must know what to do to switch the standard output into
|
|
binary mode (e.g., adding a line to the source code or specifying a
|
|
linker option).
|
|
|
|
What needs to be done to fix the problem?
|
|
|
|
Solving the author's exercises below may or may not help.
|
|
|
|
At the time of judging, the approximation of
|
|
[π](https://en.wikipedia.org/wiki/Pi) used in the program could not be found on
|
|
<https://mathworld.wolfram.com>.
|
|
|
|
|
|
## Author's remarks:
|
|
|
|
**knot** writes animated GIF images of rendered [torus
|
|
knots](https://en.wikipedia.org/wiki/Torus_knot) to standard output.
|
|
|
|
### SYNOPSIS
|
|
|
|
``` <!---sh-->
|
|
./persano p q [num frames]
|
|
```
|
|
|
|
|
|
### DESCRIPTION
|
|
|
|
A `(p,q)`-[torus knot](https://en.wikipedia.org/wiki/Torus_knot) is a closed,
|
|
non-intersecting curve on the surface of a
|
|
[torus](https://en.wikipedia.org/wiki/Torus) in R3 that winds `p` times around
|
|
one cycle of the torus and `q` times around the other. `p` and `q` should be
|
|
[coprime](https://en.wikipedia.org/wiki/Coprime_integers); otherwise, the
|
|
resulting curve will _not_ be a knot (that is, imagining the resulting curve as
|
|
a loop of rubber, there will be a way to bend, twist and stretch it, without
|
|
cutting it [^1], until it ends up looking just like a circle embedded in R3 [^2]).
|
|
|
|
Sample usage:
|
|
|
|
``` <!---sh-->
|
|
./persano 3 2 1 > foo.gif
|
|
```
|
|
|
|
writes a non-animated GIF (a single frame) stream of a rendered trefoil
|
|
knot to the file `foo.gif`.
|
|
|
|
``` <!---sh-->
|
|
./persano 5 2
|
|
```
|
|
|
|
writes a GIF stream with a rendering of [Solomon's Seal
|
|
knot](https://en.wikipedia.org/wiki/Solomon%27s_knot) to standard
|
|
output; since the number of frames is not specified, an animation with
|
|
40 frames will be written.
|
|
|
|
Please view the code with 8-character tabs!
|
|
|
|
|
|
### OUTPUT FORMAT
|
|
|
|
The program writes fully valid GIF 89 streams.
|
|
|
|
It is suggested that the output be viewed with a program capable of
|
|
displaying animated GIFs, such as almost any graphical HTTP browser.
|
|
|
|
Due to code size constraints, full [LZW
|
|
compression](https://en.wikipedia.org/wiki/LZ77_and_LZ78#LZW) was not
|
|
implemented [^3]. In fact, the output images are even somewhat expanded, thanks
|
|
to GIF overhead.
|
|
|
|
The GIF format supports only a limited number of bits per pixel, so the
|
|
program uses ordered dithering to emulate full RGB output.
|
|
|
|
|
|
### PORTABILITY
|
|
|
|
The program was tested on Linux, with gcc 3.1; Cygwin, with gcc 3.3; and
|
|
Solaris/SPARC, with Sun's C compiler.
|
|
|
|
The only major portability issue should be reliance on ASCII.
|
|
|
|
It should also be mentioned that the program won't work on systems that
|
|
distinguish between text and binary streams; however, since hardly
|
|
anyone uses such systems in this day and age, this is a minor issue. [^4]
|
|
|
|
|
|
### EXERCISES FOR THE READER
|
|
|
|
1. (1 point) The surface is composed of many small polygons. Try to make it
|
|
smoother by increasing the number of polygons.
|
|
|
|
2. (2 points) Figure out how to change the radius of the tube cross section.
|
|
|
|
3. (5 points) Locate the famous transcendental constant
|
|
[π](https://en.wikipedia.org/wiki/Pi) in the code.
|
|
|
|
|
|
[^1]: You can call such a transformation an "ambient isotopy" if you want to
|
|
impress people at parties.
|
|
|
|
[^2]: Also known as the "unknot", which sounds slightly less impressive than
|
|
"ambient isotopy".
|
|
|
|
[^3]: Unfortunately (for the author), the convenient excuse that LZW compression
|
|
was not implemented in order to avoid the Unisys patent can no longer be used.
|
|
|
|
[^4]: ;)
|
|
|
|
|
|
<!--
|
|
|
|
Copyright © 1984-2024 by Landon Curt Noll. All Rights Reserved.
|
|
|
|
You are free to share and adapt this file under the terms of this license:
|
|
|
|
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
|
|
|
|
For more information, see:
|
|
|
|
https://creativecommons.org/licenses/by-sa/4.0/
|
|
|
|
-->
|