From 5b331dbbeea2357b787e7877828b318f55e59ad8 Mon Sep 17 00:00:00 2001 From: Aaron Fenyes Date: Mon, 29 Sep 2025 16:31:36 -0700 Subject: [PATCH] Calculate angle distortions --- impossolid/angle-distortion.py | 59 ++++ impossolid/twice-augmented_angle-distortions | 295 +++++++++++++++++++ 2 files changed, 354 insertions(+) create mode 100644 impossolid/angle-distortion.py create mode 100644 impossolid/twice-augmented_angle-distortions diff --git a/impossolid/angle-distortion.py b/impossolid/angle-distortion.py new file mode 100644 index 0000000..6a19cfc --- /dev/null +++ b/impossolid/angle-distortion.py @@ -0,0 +1,59 @@ +import collections +import math +import sys + +def read_edge_distortions(filename): + vertices = set() + distortions = {} + with open(filename, 'r') as edge_file: + while edge_line := edge_file.readline(): + line_parts = edge_line.rstrip().split(': ') + endpoints = tuple(sorted(line_parts[0].split(', '))) + vertices.update(endpoints) + if len(line_parts) > 1: + distortions[endpoints] = float(line_parts[1]) + else: + distortions[endpoints] = 0 + return (vertices, distortions) + +def find_triangles(vertices, edges): + triangles = [] + for e in edges: + for v in vertices: + if e[1] < v: + if (e[0], v) in edges and (e[1], v) in edges: + triangles.append((e[0], e[1], v)) + return triangles + +# use the law of cosines to get the angle distortion +def angle_distortion(edge_distortions): + a, b, c = list(edge_distortions) + cos_angle_a = (1 + 2*(b + c - a) + b*b + c*c - a*a) / (2*(1 + b)*(1 + c)) + return math.degrees(math.acos(cos_angle_a)) - 60 + +if __name__ == '__main__': + if len(sys.argv) <= 1: + print('Pass the path to the file that lists the edge distortions') + else: + vertices, distortions = read_edge_distortions(sys.argv[1]) + triangles = find_triangles(vertices, distortions.keys()) + total_angle_distortion = 0 + highest_angle_distortion = -math.inf + lowest_angle_distortion = math.inf + print('{} triangles\n'.format(len(triangles))) + for t in triangles: + print('Triangle {0}, {1}, {2}'.format(t[0], t[1], t[2])) + edge_distortions = collections.deque( + [distortions[(t[j], t[k])] for (j, k) in [(1, 2), (0, 2), (0, 1)]] + ) + for k in range(3): + ang_distort = angle_distortion(edge_distortions) + total_angle_distortion += abs(ang_distort) + highest_angle_distortion = max(highest_angle_distortion, ang_distort) + lowest_angle_distortion = min(lowest_angle_distortion, ang_distort) + print(' {0}: {1}°'.format(t[k], ang_distort)) + edge_distortions.rotate() + print() + print('Total angle distortion: {}°'.format(total_angle_distortion)) + print('Highest angle distortion: {}°'.format(highest_angle_distortion)) + print('Lowest angle distortion: {}°'.format(lowest_angle_distortion)) diff --git a/impossolid/twice-augmented_angle-distortions b/impossolid/twice-augmented_angle-distortions new file mode 100644 index 0000000..cf03128 --- /dev/null +++ b/impossolid/twice-augmented_angle-distortions @@ -0,0 +1,295 @@ +58 triangles + +Triangle a_SE, b_SE, z_S + a_SE: -0.0018856502946889009° + b_SE: 0.0006966207168233041° + z_S: 0.0011890295778727022° + +Triangle a_SE, b_SE, z_E + a_SE: -0.0018856584331388149° + b_SE: 0.0006966226686131449° + z_E: 0.0011890357645540917° + +Triangle b_SW, c_S, y_SW + b_SW: -5.415090214455631e-05° + c_S: 0.00045772681384903535° + y_SW: -0.00040357591168316276° + +Triangle b_SW, c_S, z_S + b_SW: -0.0009184701495854597° + c_S: 4.448743641916053e-05° + z_S: 0.00087398271318051° + +Triangle b_SE, c_S, z_S + b_SE: -0.00016620401637368332° + c_S: 0.0011249765751415453° + z_S: -0.0009587725587678619° + +Triangle b_SE, c_S, y_SE + b_SE: -0.0008975178741081891° + c_S: 0.0006764281771083347° + y_SE: 0.00022108969701406522° + +Triangle b_SE, c_E, y_SE + b_SE: -0.000897519700536975° + c_E: 0.0006764305357691569° + y_SE: 0.0002210891647536073° + +Triangle b_SE, c_E, z_E + b_SE: -0.0001661945662831954° + c_E: 0.0011249783407549785° + z_E: -0.0009587837744717831° + +Triangle b_NE, c_E, y_NE + b_NE: -5.4156720231901545e-05° + c_E: 0.00045774058987291255° + y_NE: -0.00040358386964811643° + +Triangle b_NE, c_E, z_E + b_NE: -0.0009184660407299816° + c_E: 4.450032897551637e-05° + z_E: 0.0008739657117544652° + +Triangle c_N, d_NE, y_NE + c_N: 7.77608707309696e-05° + d_NE: -0.0005049622408037635° + y_NE: 0.0004272013700656885° + +Triangle c_N, d_NE, e_N + c_N: 0.00043802608161769285° + d_NE: -0.0010442017109895119° + e_N: 0.0006061756293931353° + +Triangle c_N, d_NW, y_NW + c_N: -0.004392411525167006° + d_NW: 0.0009281613228964147° + y_NW: 0.0034642502022776966° + +Triangle c_N, d_NW, e_N + c_N: -0.0018371050143599632° + d_NW: 0.0011681390506907974° + e_N: 0.0006689659636691658° + +Triangle c_W, d_NW, e_W + c_W: -0.0018371356879498535° + d_NW: 0.0011681941726706668° + e_W: 0.0006689415152791867° + +Triangle c_W, d_NW, y_NW + c_W: -0.00439242709246912° + d_NW: 0.000928190557552° + y_NW: 0.00346423653491712° + +Triangle c_W, d_SW, e_W + c_W: 0.0004380758375859273° + d_SW: -0.0010442287499685676° + e_W: 0.0006061529123826404° + +Triangle c_W, d_SW, y_SW + c_W: 7.777468017877709e-05° + d_SW: -0.0005049885038488355° + y_SW: 0.00042721382367005845° + +Triangle c_S, d_SW, y_SW + c_S: -0.0003919572288921813° + d_SW: 0.00043448701768511455° + y_SW: -4.252978876451152e-05° + +Triangle c_S, d_SW, e_S + c_S: -0.0007556856092989506° + d_SW: 0.0004915334549480121° + e_S: 0.0002641521543509384° + +Triangle c_S, d_SE, y_SE + c_S: 0.0006690562241331577° + d_SE: -0.00021946896695368423° + y_SE: -0.000449587257172368° + +Triangle c_S, d_SE, e_S + c_S: 0.00022490750998827025° + d_SE: -0.0004891581593469141° + e_S: 0.00026425064935864384° + +Triangle c_E, d_SE, y_SE + c_E: 0.0006690477311224186° + d_SE: -0.000219450687097833° + y_SE: -0.0004495970440387964° + +Triangle c_E, d_SE, e_E + c_E: 0.00022487539229842923° + d_SE: -0.0004891383069605126° + e_E: 0.000264262914654978° + +Triangle c_E, d_NE, y_NE + c_E: -0.0003919462083246117° + d_NE: 0.00043446422546367103° + y_NE: -4.2518017124848484e-05° + +Triangle c_E, d_NE, e_E + c_E: -0.0007556600615572506° + d_NE: 0.0004914936888269494° + e_E: 0.0002641663727089849° + +Triangle d_NE, e_N, f_NE + d_NE: 3.4118590889420375e-05° + e_N: 0.0004912376328576329° + f_NE: -0.0005253562237612641° + +Triangle d_NW, e_N, f_NW + d_NW: 0.0012793501149417352° + e_N: -0.0009787611630969195° + f_NW: -0.0003005889518448157° + +Triangle d_NW, e_W, f_NW + d_NW: 0.0012793645837376744° + e_W: -0.0009787888926879873° + f_NW: -0.00030057569104258164° + +Triangle d_SW, e_W, f_SW + d_SW: 3.4104280807412124e-05° + e_W: 0.0004912649981676509° + f_SW: -0.0005253692789679576° + +Triangle d_SW, e_S, f_SW + d_SW: 0.0003857085871175059° + e_S: -0.00034470395510055596° + f_SW: -4.10046320098445e-05° + +Triangle d_SE, e_S, f_SE + d_SE: -7.92374907376825e-06° + e_S: 0.0002723546649647801° + f_SE: -0.00026443091589101186° + +Triangle d_SE, e_E, f_SE + d_SE: -7.914704212907964e-06° + e_E: 0.0002723375437980735° + f_SE: -0.00026442283958516555° + +Triangle d_NE, e_E, f_NE + d_NE: 0.00038569630375207° + e_E: -0.0003446839119192191° + f_NE: -4.1012391825745453e-05° + +Triangle e_N, f_NE, g_NNE + e_N: -0.00011644664380128233° + f_NE: 0.000363157568820327° + g_NNE: -0.0002467109250190447° + +Triangle e_N, f_NW, g_NNW + e_N: -0.0005663172445693476° + f_NW: 0.000436599482547706° + g_NNW: 0.00012971776202874707° + +Triangle e_W, f_NW, g_WNW + e_W: -0.0005663163395084325° + f_NW: 0.00043660275473200727° + g_WNW: 0.00012971358477642525° + +Triangle e_W, f_SW, g_WSW + e_W: -0.00011643403040295652° + f_SW: 0.0003631626645272945° + g_WSW: -0.000246728634124338° + +Triangle e_S, f_SW, g_SSW + e_S: -0.00015088330234647174° + f_SW: -4.434221558824447e-06° + g_SSW: 0.00015531752390529618° + +Triangle e_S, f_SE, g_SSE + e_S: -5.28844724030364e-05° + f_SE: 0.00010995296653959485° + g_SSE: -5.706849415076931e-05° + +Triangle e_E, f_SE, g_ESE + e_E: -5.289010589137888e-05° + f_SE: 0.00010994821870013993° + g_ESE: -5.705811280876105e-05° + +Triangle e_E, f_NE, g_ENE + e_E: -0.00015088143299379908° + f_NE: -4.437100798782012e-06° + g_ENE: 0.0001553185337925811° + +Triangle f_NE, g_ENE, g_NNE + f_NE: 7.450149718835064e-05° + g_ENE: 6.294030865205968e-05° + g_NNE: -0.00013744180584041032° + +Triangle f_NW, g_NNW, g_WNW + f_NW: 0.00023868980004237983° + g_NNW: -0.00011934432004778728° + g_WNW: -0.00011934547999459255° + +Triangle f_SW, g_SSW, g_WSW + f_SW: 7.450129267994043e-05° + g_SSW: 6.293716665339844e-05° + g_WSW: -0.00013743845931912801° + +Triangle f_SE, g_ESE, g_SSE + f_SE: 3.87570213717936e-05° + g_ESE: -1.937846930388787e-05° + g_SSE: -1.9378552060800303e-05° + +Triangle e_N, g_NNE, g_NNW + e_N: 1.3987573481699656e-06° + g_NNE: -0.00034080770834776786° + g_NNW: 0.0003394089509995979° + +Triangle e_W, g_WNW, g_WSW + e_W: 1.4097619143171869e-06° + g_WNW: 0.0003394137133483355° + g_WSW: -0.00034082347526265266° + +Triangle e_S, g_SSE, g_SSW + e_S: -7.743940860649445e-05° + g_SSE: -0.00013975871755889102° + g_SSW: 0.00021719812617959633° + +Triangle e_E, g_ENE, g_ESE + e_E: -7.744546709176348e-05° + g_ENE: 0.0002171941456126092° + g_ESE: -0.000139748678492424° + +Triangle a_SE, a_SW, z_S + a_SE: -0.0021197448587955137° + a_SW: 5.696873318328244e-05° + z_S: 0.0020627761256122312° + +Triangle a_NE, a_SE, z_E + a_NE: 0.0020627780860564826° + a_SE: 5.696645881414497e-05° + z_E: -0.0021197445448706276° + +Triangle a_NE, b_NE, z_E + a_NE: 0.0017363010366011622° + b_NE: 0.00022021214437017989° + z_E: -0.001956513180971342° + +Triangle a_SW, b_SW, z_S + a_SW: 0.0017363089225312933° + b_SW: 0.00022020949535317413° + z_S: -0.001956518417863151° + +Triangle b_NE, c_N, y_NE + b_NE: 0.00017470943667774463° + c_N: 1.7191837287100498e-08° + y_NE: -0.0001747266285079263° + +Triangle b_NW, c_N, y_NW + b_NW: 0.003928388803437599° + c_N: 1.4034125683792809e-07° + y_NW: -0.0039285291447015425° + +Triangle b_NW, c_W, y_NW + b_NW: 0.0039283900732698385° + c_W: 1.3970630163839814e-07° + y_NW: -0.0039285297795643714° + +Triangle b_SW, c_W, y_SW + b_SW: 0.00017470839824795803° + c_W: 1.6523628687536984e-08° + y_SW: -0.0001747249218624347° + +Total angle distortion: 0.11233054610809035° +Highest angle distortion: 0.0039283900732698385° +Lowest angle distortion: -0.00439242709246912°