Skip to content

Instantly share code, notes, and snippets.

@vhxs
Created November 2, 2022 01:58
Show Gist options
  • Save vhxs/1e59dc2220d71c6a064eb856afab15ad to your computer and use it in GitHub Desktop.
Save vhxs/1e59dc2220d71c6a064eb856afab15ad to your computer and use it in GitHub Desktop.
The standard chromatic subdivision visualized
# The standard chromatic subdivision is a mathematical operator in combinatorial topology that takes a chromatic
# simplicial complex and subdivides in a fractal-like manner. It represents all states of a distributed system after
# processes participate in an immediate snapshot.
# Immediate snapshots are a theoretical synchronization primitive, equivalent to atomic registers up to computational
# equivalence. They are used extensivelty in computability proofs within the context of distributed computing.
# This code draws the third standard chromatic subdivision of the 2-simplex (vertices are not colored).
from tkinter import *
from operator import add
from math import sqrt
root = Tk()
frameWidth = 1200
frameHeight = 575
eps = 1./3
canvas = Canvas(root, width = frameWidth, height = frameHeight)
canvas.pack()
def plus(point1, point2):
return list(map(add, point1, point2))
def mult(scalar, point):
return list(map(lambda x: scalar * x, point))
def standardChromaticSubdivide(canvas, point1, point2, point3, level, lwidth):
scs = lambda x, y, z: standardChromaticSubdivide(canvas, x, y, z, level - 1, lwidth/2.)
# Generate points
# Edges
point12a = plus(mult((1 - eps)/2, point1), mult((1 + eps)/2, point2))
point12b = plus(mult((1 + eps)/2, point1), mult((1 - eps)/2, point2))
point23a = plus(mult((1 - eps)/2, point2), mult((1 + eps)/2, point3))
point23b = plus(mult((1 + eps)/2, point2), mult((1 - eps)/2, point3))
point31a = plus(mult((1 - eps)/2, point3), mult((1 + eps)/2, point1))
point31b = plus(mult((1 + eps)/2, point3), mult((1 - eps)/2, point1))
# Face
point123a = plus(mult((1 - eps)/3, point1), plus(mult((1 + eps/2)/3, point2), mult((1 + eps/2)/3, point3)))
point123b = plus(mult((1 - eps)/3, point2), plus(mult((1 + eps/2)/3, point3), mult((1 + eps/2)/3, point1)))
point123c = plus(mult((1 - eps)/3, point3), plus(mult((1 + eps/2)/3, point1), mult((1 + eps/2)/3, point2)))
# Draw edges
canvas.create_line(point31a[0], point31a[1], point123b[0], point123b[1], width=lwidth)
canvas.create_line(point31b[0], point31b[1], point123b[0], point123b[1], width=lwidth)
canvas.create_line(point1[0], point1[1], point123b[0], point123b[1], width=lwidth)
canvas.create_line(point1[0], point1[1], point123c[0], point123c[1], width=lwidth)
canvas.create_line(point123b[0], point123b[1], point123c[0], point123c[1], width=lwidth)
canvas.create_line(point12a[0], point12a[1], point123c[0], point123c[1], width=lwidth)
canvas.create_line(point12b[0], point12b[1], point123c[0], point123c[1], width=lwidth)
canvas.create_line(point2[0], point2[1], point123c[0], point123c[1], width=lwidth)
canvas.create_line(point2[0], point2[1], point123a[0], point123a[1], width=lwidth)
canvas.create_line(point123c[0], point123c[1], point123a[0], point123a[1], width=lwidth)
canvas.create_line(point23a[0], point23a[1], point123a[0], point123a[1], width=lwidth)
canvas.create_line(point23b[0], point23b[1], point123a[0], point123a[1], width=lwidth)
canvas.create_line(point3[0], point3[1], point123a[0], point123a[1], width=lwidth)
canvas.create_line(point3[0], point3[1], point123b[0], point123b[1], width=lwidth)
canvas.create_line(point123a[0], point123a[1], point123b[0], point123b[1], width=lwidth)
if level <= 1:
canvas.update()
canvas.postscript(file="scs0.ps", colormode="color")
return
scs(point31a, point123b, point31b)
scs(point12a, point123c, point12b)
scs(point23a, point123a, point23b)
scs(point1, point123b, point123c)
scs(point2, point123c, point123a)
scs(point3, point123a, point123b)
scs(point123b, point1, point31a)
scs(point123c, point2, point12a)
scs(point123a, point3, point23a)
scs(point123b, point3, point31b)
scs(point123c, point1, point12b)
scs(point123a, point2, point23b)
scs(point123a, point123b, point123c)
scale = 450 # altitude
shift = [350, 10]
topwidth = 4
point1 = plus(shift, mult(scale, [1/sqrt(3), 0]))
point2 = plus(shift, mult(scale, [0, 1]))
point3 = plus(shift, mult(scale, [2/sqrt(3), 1]))
canvas.create_line(point1[0], point1[1], point2[0], point2[1], width=topwidth)
canvas.create_line(point2[0], point2[1], point3[0], point3[1], width=topwidth)
canvas.create_line(point3[0], point3[1], point1[0], point1[1], width=topwidth)
#canvas.update()
#canvas.postscript(file="scs0.ps", colormode="color")
input()
standardChromaticSubdivide(canvas, point1, point2, point3, 3, topwidth)
root.mainloop()
@vhxs
Copy link
Author

vhxs commented Nov 2, 2022

scs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment