67 lines
2.0 KiB
Python
67 lines
2.0 KiB
Python
from sys import argv
|
|
from pathlib import Path
|
|
from math import sin, cos, pi
|
|
|
|
def generateNodeCoords(n):
|
|
vectorLength = n / 2
|
|
degreeToTurn = (2 * pi) / n
|
|
|
|
|
|
nodeCoords = [(0, vectorLength)]
|
|
for node in range(n):
|
|
prev_x = nodeCoords[-1][0]
|
|
prev_y = nodeCoords[-1][1]
|
|
|
|
nodeCoords.append((
|
|
round(cos(degreeToTurn) * prev_x - sin(degreeToTurn) * prev_y, 5),
|
|
round(sin(degreeToTurn) * prev_x + cos(degreeToTurn) * prev_y, 5)
|
|
))
|
|
|
|
return nodeCoords
|
|
|
|
def latexify(graphType, nodes, edges):
|
|
zippedNodes = zip(nodes, generateNodeCoords(len(nodes)))
|
|
|
|
nodeString = '\n'.join(f'\\node ({name}) at ({x},{y}) {{${name}$}};' for name,(x,y) in zippedNodes)
|
|
|
|
if graphType == 'directed':
|
|
edgeString = '\n'.join(f'\\arrow{{{x}}}{{{y}}}' for x,y in edges)
|
|
elif graphType == 'undirected':
|
|
edgeString = '\n'.join(f'\\draw ({x}) -- ({y});' for x,y in edges)
|
|
else:
|
|
print('CAN\'t RECOGNIZE GRAPHTYPE: ' + graphType)
|
|
exit(1)
|
|
|
|
return (nodeString, edgeString)
|
|
|
|
def parseInput(inputData):
|
|
splitData = inputData.split('\n\n')
|
|
if splitData[0] == 'complete':
|
|
data1 = 'undirected'
|
|
nodes = [chr(i + 65) for i in range(int(splitData[1]))]
|
|
data2 = ' '.join(nodes)
|
|
data3 = '\n'.join([a+b for a in nodes for b in nodes if a < b])
|
|
pass
|
|
else:
|
|
data1, data2, data3 = splitData
|
|
|
|
graphType = data1
|
|
nodes = data2.split(' ')
|
|
edges = [(x,y) for x,y in data3.split('\n')]
|
|
|
|
return (graphType, nodes, edges)
|
|
|
|
def processFileContent(raw, template):
|
|
content = latexify(*parseInput(raw))
|
|
return template.replace('%NODES', content[0]).replace('%EDGES', content[1])
|
|
|
|
|
|
if __name__ == '__main__':
|
|
filename = argv[1]
|
|
|
|
with open(filename) as file:
|
|
content = latexify(*parseInput(file.read()))
|
|
|
|
with open(str(Path(__file__).parent.absolute()) + '/tex_templates/Graph.tex') as template:
|
|
with open(argv[2], 'w') as destination_file:
|
|
destination_file.write(template.read().replace('%NODES', content[0]).replace('%EDGES', content[1])) |