Compare commits

...

3 Commits

Author SHA1 Message Date
251d9bb9e5 TMP 2025-04-22 19:53:48 -07:00
6e3c665e99 First two sections 2025-04-22 19:53:31 -07:00
28aaf98594 Wolfram samples 2025-04-22 18:55:02 -07:00
35 changed files with 150295 additions and 0 deletions

View File

@ -0,0 +1,15 @@
#import "@local/handout:0.1.0": *
#show: handout.with(
title: [Wallpaper Symmetry],
by: "Mark",
)
#include "parts/00 intro.typ"
#pagebreak()
#include "parts/01 reflect.typ"
#pagebreak()
#include "parts/02 rotate.typ"
#pagebreak()

View File

@ -0,0 +1,7 @@
[metadata]
title = "Wallpaper Symmetries"
[publish]
handout = true
solutions = true

View File

@ -0,0 +1,131 @@
#import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1"
= Wallpaper Symmetries
#definition()
A _Euclidean isometry_ is a transformation of the plane that preserves distances. \
Intuituvely, an isometry moves objects on the plane without deforming them.
There are four classes of _Euclidean isometries_:
- Translation
- Reflection
- Rotation
- Glide reflection
#note([We can prove that there are no others, but this is beyond the scope of this handout.]) \
A simple example of each isometry is shown below:
#let demo(c) = {
let s = 0.5
cetz.draw.line(
(0, 0),
(3 * s, 0),
(3 * s, 1 * s),
(1 * s, 1 * s),
(1 * s, 2 * s),
(0, 2 * s),
close: true,
fill: c,
stroke: black + 0mm * s,
)
}
#table(
stroke: none,
align: center,
columns: (1fr, 1fr),
rows: (3.5cm, 3.5cm),
row-gutter: 2mm,
[
#cetz.canvas({
import cetz.draw: *
demo(ored)
translate(x: 0, y: -1.5)
demo(oblue)
})
#v(1fr)
Translation
],
[
#cetz.canvas({
import cetz.draw: *
circle((-2, 0), radius: 0.1, stroke: none, fill: black)
arc(
(-2, 0),
radius: 1,
anchor: "origin",
start: 0deg,
stop: -30deg,
mode: "PIE",
)
demo(ored)
rotate(z: -30deg, origin: (-2, 0))
demo(oblue)
})
#v(1fr)
Rotation
],
[
#cetz.canvas({
import cetz.draw: *
line((-2, 0), (4, 0))
translate(x: 0, y: 0.25)
demo(ored)
set-transform(none)
set-transform((
(1, 0, 0, 0),
(0, 1, 0, 0),
(0, 0, 1, 0),
(0, 0, 0, 1),
))
translate(x: 0, y: 0.25)
demo(oblue)
})
#v(1fr)
Reflection
],
[
#cetz.canvas({
import cetz.draw: *
demo(ored)
set-transform((
(1, 0, 0, 0),
(0, 1, 0, 0),
(0, 0, 0, 0),
(0, 0, 0, 0),
))
translate(x: 1.5, y: 0)
demo(oblue)
set-transform(none)
line((-1, 0), (5, 0))
})
#v(1fr)
Glide reflection
],
)
#definition()
A _wallpaper_ is a two-dimensional pattern that...
- has translational symmetry in at least two directions
#note([(and therefore fills the plane)])
- has a countable number of reflection, rotation, or glide symmetries. \
#problem()
Is the empty plane a valid wallpaper?
#solution([
No, since it has uncountably many symmetries.
])

View File

@ -0,0 +1,99 @@
#import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1"
= Mirror Symmetry
#definition()
A _mirror symmetry_ is a reflection about a line. \
If $n$ mirror symmetries intersect at a point, we say that point is an _$n$-fold mirror node_.
#v(3mm)
Two mirror nodes are identical if we can map one to the other with a translation and a rotation \
while preserving the pattern on the wallpaper.
#problem(label: "pat333")
Find all three three distinct mirror nodes in the following pattern. \
What is the order of each intersection? \
#hint([
You may notice rotational symmetry in this pattern. \
Don't worry about that for now.
])
#table(
stroke: none,
align: center,
columns: 1fr,
rows: 50mm,
image("../res/wolfram/p3m1.svg", height: 100%),
)
#solution([This is `*333`])
#v(1fr)
#definition()
_Orbifold notation_ gives us a way to write down the symmetries of a wallpaper. \
We will introduce orbifold notation one symmetry at a time.
#definition()
In orbifold notation, mirror nodes are denoted by a `*` followed by at least one integer. \
Every integer $n$ following a `*` denotes a mirror node of order $n$.
#v(3mm)
The order of these integers doesn't matter. `*234` and `*423` are the same signature. \
However, we usually denote $n$-fold symmetries in descending order (that is, like `*432`).
#problem()
What is the signature of the wallpaper in @pat333?
#solution([It is `*333`])
// MARK: page
#v(1fr)
#pagebreak()
#problem()
Find the signature of the following pattern.
#table(
stroke: none,
align: center,
columns: 1fr,
rows: 50mm,
image("../res/*632-a.png", height: 100%),
)
#solution([
It is `*632`:
#table(
stroke: none,
align: center,
columns: 1fr,
rows: 40mm,
image("../res/*632-b.png", height: 100%),
)
])
#v(1fr)
#problem()
Draw a wallpaper pattern with signature `*2222`
#solution([
Sample solutions are below.
#table(
stroke: none,
align: center,
columns: (1fr, 1fr),
rows: 50mm,
image("../res/wolfram/pmm.svg", height: 100%),
image("../res/escher/pmm.svg", height: 100%),
)
])
#v(1fr)

View File

@ -0,0 +1,115 @@
#import "@local/handout:0.1.0": *
#import "@preview/cetz:0.3.1"
= Rotational Symmetry
Another symmetry is n-fold rotational symmetry about a point, whose signature is written n. Multiple bold numbers means multiple points of rotational symmetry.
Two points of rotational symmetry are considered the same if we can perform a translation + rotation sending one to the other, while leaving the pattern the same.
There are also patterns with both kinds of symmetries. To classify such patterns, first find all the mirror symmetries, then all the rotational symmetries that are not accounted
for by the mirror symmetries.
By convention we write the rotational symmetries before
the `*`.
#table(
stroke: none,
align: center,
columns: (1fr, 1fr),
rows: 50mm,
image("../res/333.png", height: 100%), image("../res/3*3.png", height: 100%),
)
#problem()
Mark the three rotation points in Figure 1.
#problem()
Find the signature of the pattern in Figure 2.
#solution([`3 *3`])
#pagebreak()
Some exceptional cases: It is possible to have two different parallel mirror lines. In
this situation the signature is
#table(
stroke: none,
align: center,
columns: 1fr,
rows: 60mm,
image("../res/**.png", height: 100%),
)
#problem()
Draw another wallpaper pattern with signature `**`
#pagebreak()
There are two other types of symmetries. The first called a miracle whose signature is
written ×. It is the result of a glide reflection, which is translation along a line followed
by reflection about that line.
This occurs when there is orientation-reversing symmetry not accounted for by a mirror.
For example, if we modify Figure 3 slightly we get a signature of ×
#table(
stroke: none,
align: center,
columns: (1fr, 1fr),
rows: 60mm,
image("../res/*x-b.png", height: 100%),
image("../res/*x-a.png", height: 100%),
)
Signature ×. There is a glide reflection (shown by the by the dotted line)
taking the clockwise spiral to the counter-clockwise spiral, reversing orientation
#pagebreak()
#problem()
Find the signatures of the following patterns:
#table(
stroke: none,
align: center,
columns: (1fr, 1fr),
rows: 60mm,
image("../res/wiki/Wallpaper_group-cm-4.jpg", height: 100%),
image("../res/wiki/Wallpaper_group-p4g-2.jpg", height: 100%),
)
#pagebreak()
There is another exceptional case with two miracles, where there are two glide reflection
symmetries along distinct lines. There are other glide reflections, but they can be obtained
by composing the two marked in the diagram.
#table(
stroke: none,
align: center,
columns: (1fr, 1fr),
rows: 60mm,
image("../res/xx-b.png", height: 100%),
image("../res/xx-a.png", height: 100%),
)
Figure 7: There are two distinct mirrorless crossings, so the signature is `xx`.
Lastly, if none of the above symmetries appear in the pattern, then there is only regular
translational symmetry, which we denote by O.
In summary, to find the signature of a pattern:
- Find the mirror lines () and the distinct intersections
- Find the rotational points of symmetry not account for by reflections.
- Look for any miracles (×) i.e. glide reflections that do not cross a mirror line.
- If you found none of the above, it is just O

Binary file not shown.

After

Width:  |  Height:  |  Size: 535 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 533 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 KiB

View File

@ -0,0 +1,86 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN" "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd">
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="10.16cm" height="5.08cm" viewBox="0 0 384 192">
<title>pmm</title>
<desc>Exported by Tess 1.70.</desc>
<clipPath id="mainclip"><rect x="0" y="0" width="384" height="192"/></clipPath>
<g style="fill-rule:evenodd; stroke-linejoin:round; stroke-linecap:round; clip-path:url(#mainclip)">
<defs>
<g id="Tess0p">
<path d="
M7.1306642022,-41.0013191628
L7.1306642022,-7.1306642022
L89.1333025278,-7.1306642022
L7.1306642022,-42.7839852134
"/></g>
<g id="Tess0" style="fill:none; stroke:none"><use xlink:href="#Tess0p"/></g>
<g id="Tess1" style="fill:none; stroke:rgb(0,0,0); stroke-width:1.7826660506"><use xlink:href="#Tess0p"/></g>
</defs>
<g transform="translate(192,96) rotate(0) scale(0.5609575611,0.5609575611)">
<g transform="translate(-405.2631578947,-100)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-405.2631578947,0)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-405.2631578947,100)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-405.2631578947,200)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,-100)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,0)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,100)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,200)"><use xlink:href="#Tess1"/></g>
<g transform="translate(0,-100)"><use xlink:href="#Tess1"/></g>
<g><use xlink:href="#Tess1"/></g>
<g transform="translate(0,100)"><use xlink:href="#Tess1"/></g>
<g transform="translate(0,200)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,-100)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,0)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,100)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,200)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,-200) rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,-100) rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,0) rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,100) rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="translate(0,-200) rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="translate(0,-100) rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="translate(0,100) rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,-200) rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,-100) rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,0) rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,100) rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="translate(405.2631578947,-200) rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="translate(405.2631578947,-100) rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="translate(405.2631578947,0) rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="translate(405.2631578947,100) rotate(180)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,-100) rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,0) rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,100) rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,200) rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(0,-100) rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(0,100) rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(0,200) rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,-100) rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,0) rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,100) rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,200) rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(405.2631578947,-100) rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(405.2631578947,0) rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(405.2631578947,100) rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(405.2631578947,200) rotate(180) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-405.2631578947,-200) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-405.2631578947,-100) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-405.2631578947,0) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-405.2631578947,100) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,-200) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,-100) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,0) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(-202.6315789474,100) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(0,-200) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(0,-100) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(0,100) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,-200) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,-100) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,0) scale(1,-1)"><use xlink:href="#Tess1"/></g>
<g transform="translate(202.6315789474,100) scale(1,-1)"><use xlink:href="#Tess1"/></g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 800 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 991 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 233 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 236 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 196 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 178 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 205 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 299 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 264 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 268 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 204 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 229 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 273 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 379 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 176 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 147 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 163 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 178 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 KiB