Skip to content
Snippets Groups Projects
Commit 20525c4e authored by Timon Römer's avatar Timon Römer
Browse files

Adds curvature for backwards edges in Tikz

parent 80baff5f
No related branches found
No related tags found
No related merge requests found
...@@ -272,7 +272,7 @@ namespace FlowForge ...@@ -272,7 +272,7 @@ namespace FlowForge
} }
} }
private string GenerateTikzCode() private string GenerateTikzCode_Curved()
{ {
if (_flowGraph == null) if (_flowGraph == null)
throw new InvalidOperationException("Flow graph is not initialized."); throw new InvalidOperationException("Flow graph is not initialized.");
...@@ -305,7 +305,17 @@ namespace FlowForge ...@@ -305,7 +305,17 @@ namespace FlowForge
foreach (var edge in _flowGraph.GetEdges()) foreach (var edge in _flowGraph.GetEdges())
{ {
string label = $"{edge.Residual}/{edge.MaxFlow}"; string label = $"{edge.Residual}/{edge.MaxFlow}";
tikzBuilder.AppendLine($"\\path[every node/.style={{font=\\tiny}}] ({edge.Source.Id}) edge node {{\\texttt{{{label}}}}} ({edge.Target.Id});");
if (edge.IsBackwards)
{
// Reverse edge styling (curved, dashed, different color)
tikzBuilder.AppendLine($"\\path[every node/.style={{font=\\tiny}},bend right,dashed,red] ({edge.Source.Id}) edge [pos=0.5,sloped] node {{\\texttt{{{label}}}}} ({edge.Target.Id});");
}
else
{
// Normal edge styling
tikzBuilder.AppendLine($"\\path[every node/.style={{font=\\tiny}}] ({edge.Source.Id}) edge [pos=0.5,sloped] node {{\\texttt{{{label}}}}} ({edge.Target.Id});");
}
} }
tikzBuilder.AppendLine("\\end{tikzpicture}"); tikzBuilder.AppendLine("\\end{tikzpicture}");
...@@ -314,14 +324,64 @@ namespace FlowForge ...@@ -314,14 +324,64 @@ namespace FlowForge
return tikzBuilder.ToString(); return tikzBuilder.ToString();
} }
private string GenerateTikzCode()
{
if (_flowGraph == null)
throw new InvalidOperationException("Flow graph is not initialized.");
var tikzBuilder = new System.Text.StringBuilder();
tikzBuilder.AppendLine("\\documentclass[tikz,border=3mm]{standalone}");
tikzBuilder.AppendLine("\\usetikzlibrary{arrows.meta,positioning}");
tikzBuilder.AppendLine("\\usepackage{amsmath}");
tikzBuilder.AppendLine("\\begin{document}");
// Global scaling and styles for smaller nodes and text
tikzBuilder.AppendLine("\\begin{tikzpicture}[scale=3,->,>=stealth,shorten >=1pt,auto,node distance=2cm,thick,");
tikzBuilder.AppendLine("main node/.style={circle,draw,minimum size=1mm,inner sep=1pt,font=\\scriptsize}]");
// Nodes
foreach (var vertex in _flowGraph.Graph.Vertices)
{
if (_nodePositions.ContainsKey(vertex.Id))
{
var position = _nodePositions[vertex.Id];
// Format x and y as floating-point values with two decimal places
string formattedX = (position.X / 100.0).ToString("F2", System.Globalization.CultureInfo.InvariantCulture);
string formattedY = (position.Y / 100.0).ToString("F2", System.Globalization.CultureInfo.InvariantCulture);
tikzBuilder.AppendLine($"\\node[main node] ({vertex.Id}) at ({formattedX},{formattedY}) {{{vertex.Id}}};");
}
}
// Edges
foreach (var edge in _flowGraph.GetEdges())
{
string label = $"{edge.Residual}/{edge.MaxFlow}";
if (edge.IsBackwards)
{
// Reverse edge styling: offset slightly above forward edges
tikzBuilder.AppendLine($"\\path[every node/.style={{font=\\tiny}},dashed,red] ({edge.Source.Id}) edge [pos=0.5,above] node {{\\texttt{{{label}}}}} ({edge.Target.Id});");
}
else
{
// Normal edge styling
tikzBuilder.AppendLine($"\\path[every node/.style={{font=\\tiny}}] ({edge.Source.Id}) edge [pos=0.5,below] node {{\\texttt{{{label}}}}} ({edge.Target.Id});");
}
}
tikzBuilder.AppendLine("\\end{tikzpicture}");
tikzBuilder.AppendLine("\\end{document}");
return tikzBuilder.ToString();
}
private void ExportGraphToLatex(string filePath) private void ExportGraphToLatex(string filePath)
{ {
try try
{ {
string tikzCode = GenerateTikzCode(); string tikzCode = GenerateTikzCode_Curved();
System.IO.File.WriteAllText(filePath, tikzCode); System.IO.File.WriteAllText(filePath, tikzCode);
MessageBox.Show($"Graph successfully exported to LaTeX file:\n{filePath}", "Export Successful", MessageBoxButton.OK, MessageBoxImage.Information); MessageBox.Show($"Graph successfully exported to LaTeX file:\n{filePath}", "Export Successful", MessageBoxButton.OK, MessageBoxImage.Information);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment