Created
November 2, 2022 01:58
-
-
Save vhxs/1e59dc2220d71c6a064eb856afab15ad to your computer and use it in GitHub Desktop.
The standard chromatic subdivision visualized
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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() |
Author
vhxs
commented
Nov 2, 2022
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment