28 std::ofstream outfile(filename);
35 const bool EdgeNumOn =
37 const bool NodeNumOn =
39 const bool CellNumOn =
41 const bool VerticeNumOn =
43 const bool RenderCellsOn =
51 using size_type = std::size_t;
53 const Eigen::MatrixXd zero(Eigen::MatrixXd::Zero(0, 1));
56 const dim_t dim_mesh =
mesh.DimMesh();
57 LF_VERIFY_MSG(dim_mesh == 2,
"writeTikZ() only available for 2D meshes");
60 const dim_t node_codim(dim_mesh);
61 const size_type no_of_nodes =
62 mesh.NumEntities(node_codim);
63 size_type node_count = 0;
67 outfile <<
"\\documentclass[12pt,a4paper]{article}\n\\usepackage{tikz}"
68 "\n\\begin{document}\n"
71 outfile <<
"% TikZ document graphics \n";
74 if (no_of_nodes > 50) {
75 outfile <<
"\\begin{tikzpicture}[scale=6, >= stealth, inner sep=0pt, "
76 "minimum size=0.2cm]\n";
77 outfile <<
"\\tikzstyle{every node}=[font=\\tiny]\n";
79 outfile <<
"\\begin{tikzpicture}[scale=4, >= stealth, inner sep=0pt, "
80 "minimum size=0.35cm]\n";
86 for (
int co_dim = 0; co_dim <= dim_mesh; co_dim++) {
90 const size_type obj_idx =
mesh.Index(*obj);
94 const Eigen::MatrixXd &obj_corners(obj_refel.
NodeCoords());
95 const Eigen::MatrixXd vertices = obj_geo_ptr->
Global(obj_corners);
96 const Eigen::MatrixXd center =
97 vertices.rowwise().sum() / vertices.cols();
98 Eigen::MatrixXd center_mat(center.rows(), num_nodes_obj);
103 outfile <<
"\\draw[red, fill = white] (" << vertices(0, 0) <<
","
104 << vertices(1, 0) <<
") "
105 <<
"node[draw, circle, fill = white] {" << obj_idx
108 outfile <<
"\\draw[red] (" << vertices(0, 0) <<
","
109 << vertices(1, 0) <<
") " <<
"node[] {*};\n";
116 center_mat << center, center;
117 const Eigen::MatrixXd scaled_vertices =
118 vertices * 0.80 + center_mat * 0.2;
119 const Eigen::MatrixXd semi_scaled_vertices =
120 vertices * 0.95 + center_mat * 0.05;
123 if (EdgeNumOn && NodeNumOn) {
124 outfile <<
"\\draw[->] (" << scaled_vertices(0, 0) <<
","
125 << scaled_vertices(1, 0) <<
") -- node[black] {"
126 << obj_idx <<
"} " <<
"(" << scaled_vertices(0, 1)
127 <<
"," << scaled_vertices(1, 1) <<
");\n";
128 }
else if (NodeNumOn && !EdgeNumOn) {
129 outfile <<
"\\draw[->] (" << scaled_vertices(0, 0) <<
","
130 << scaled_vertices(1, 0) <<
") -- " <<
"("
131 << scaled_vertices(0, 1) <<
"," << scaled_vertices(1, 1)
133 }
else if (!NodeNumOn && EdgeNumOn) {
134 outfile <<
"\\draw[->] (" << semi_scaled_vertices(0, 0) <<
","
135 << semi_scaled_vertices(1, 0) <<
") -- node[black] {"
136 << obj_idx <<
"} " <<
"(" << semi_scaled_vertices(0, 1)
137 <<
"," << semi_scaled_vertices(1, 1) <<
");\n";
138 }
else if (!NodeNumOn && !EdgeNumOn) {
139 outfile <<
"\\draw[->] (" << semi_scaled_vertices(0, 0) <<
","
140 << semi_scaled_vertices(1, 0) <<
") -- " <<
"("
141 << semi_scaled_vertices(0, 1) <<
","
142 << semi_scaled_vertices(1, 1) <<
");\n";
144 std::cout <<
"Check EdgeNumOn and NodeNumOn for kSegment "
150 outfile <<
"\\draw[] (" << vertices(0, 0) <<
","
151 << vertices(1, 0) <<
") -- node[black] {" << obj_idx
152 <<
"} " <<
"(" << vertices(0, 1) <<
","
153 << vertices(1, 1) <<
");\n";
154 }
else if (!EdgeNumOn) {
155 outfile <<
"\\draw[] (" << vertices(0, 0) <<
","
156 << vertices(1, 0) <<
") -- " <<
"(" << vertices(0, 1)
157 <<
"," << vertices(1, 1) <<
");\n";
159 std::cout <<
"Check EdgeNumOn and NodeNumOn for kSegment "
168 center_mat << center, center, center;
169 const Eigen::MatrixXd scaled_vertices =
170 vertices * 0.70 + center_mat * 0.30;
174 outfile <<
"\\draw[green] (" << scaled_vertices(0, 0) <<
","
175 << scaled_vertices(1, 0) <<
") node[] {0} -- ("
176 << scaled_vertices(0, 1) <<
"," << scaled_vertices(1, 1)
177 <<
") node[] {1} -- (" << scaled_vertices(0, 2) <<
","
178 << scaled_vertices(1, 2) <<
") node[] {2} -- cycle;\n";
180 outfile <<
"\\draw[green] (" << scaled_vertices(0, 0) <<
","
181 << scaled_vertices(1, 0) <<
") -- ("
182 << scaled_vertices(0, 1) <<
"," << scaled_vertices(1, 1)
183 <<
") -- (" << scaled_vertices(0, 2) <<
","
184 << scaled_vertices(1, 2) <<
") -- cycle;\n";
188 outfile <<
"\\draw[green] (" << center(0, 0) <<
","
189 << center(1, 0) <<
") node[] {" << obj_idx <<
"};\n";
197 center_mat << center, center, center, center;
198 const Eigen::MatrixXd scaled_vertices =
199 vertices * 0.70 + center_mat * 0.3;
203 outfile <<
"\\draw[magenta] (" << scaled_vertices(0, 0) <<
","
204 << scaled_vertices(1, 0) <<
") node[] {0} -- ("
205 << scaled_vertices(0, 1) <<
"," << scaled_vertices(1, 1)
206 <<
") node[] {1} -- (" << scaled_vertices(0, 2) <<
","
207 << scaled_vertices(1, 2) <<
") node[] {2} -- ("
208 << scaled_vertices(0, 3) <<
"," << scaled_vertices(1, 3)
209 <<
") node[] {3} -- cycle;\n";
211 outfile <<
"\\draw[magenta] (" << scaled_vertices(0, 0) <<
","
212 << scaled_vertices(1, 0) <<
") -- ("
213 << scaled_vertices(0, 1) <<
"," << scaled_vertices(1, 1)
214 <<
") -- (" << scaled_vertices(0, 2) <<
","
215 << scaled_vertices(1, 2) <<
") -- ("
216 << scaled_vertices(0, 3) <<
"," << scaled_vertices(1, 3)
221 outfile <<
"\\draw[magenta] (" << center(0, 0) <<
","
222 << center(1, 0) <<
") node[] {" << obj_idx <<
"};\n";
231 std::cout <<
"Error for object " << obj_idx <<
" in co-dim "
233 std::cout <<
"Object type: " << obj_refel <<
'\n';
244 outfile <<
"\\end{tikzpicture}\n";
246 outfile <<
"\n\\end{document}" <<
'\n';