17 #include <GL/freeglut.h>
19 #include "../function/exact_solution.h"
20 #include "mesh_view.h"
28 MeshView::MeshView(
const char* title, WinGeom* wg)
29 : View(title, wg), lin(nullptr)
31 nodes = elems =
nullptr;
38 MeshView::MeshView(
char* title, WinGeom* wg)
39 : View(title, wg), lin(nullptr)
41 nodes = elems =
nullptr;
50 if (nodes !=
nullptr) free_with_check(nodes);
51 if (elems !=
nullptr) free_with_check(elems);
56 void MeshView::show(MeshSharedPtr mesh)
58 MeshFunctionSharedPtr<double> sln(
new ZeroSolution<double>(mesh));
59 if (mesh ==
nullptr)
throw Hermes::Exceptions::Exception(
"mesh == nullptr in MeshView::show().");
60 if (mesh->get_max_element_id() == 0)
throw Hermes::Exceptions::Exception(
"Attempt to visualize empty mesh in MeshView::show().");
67 lin->process_solution(sln);
69 lin->calc_vertices_aabb(&vertices_min_x, &vertices_max_x, &vertices_min_y, &vertices_max_y);
74 if (elems !=
nullptr) free_with_check(elems);
75 ne = mesh->get_max_element_id() + 1;
76 elems = malloc_with_check<ObjInfo>(ne);
77 for (i = 0; i < ne; i++)
80 int active_element_cnt = 0;
81 float min_error = -1, max_error = -1;
83 for_all_active_elements(e, mesh)
85 ObjInfo* oi = elems + e->id;
89 for (
unsigned char i = 0; i < e->get_nvert(); i++)
94 oi->x /= e->get_nvert();
95 oi->y /= e->get_nvert();
105 void MeshView::set_b_elem_mrk(
bool set)
109 b_elem_mrk = !b_elem_mrk;
113 void MeshView::on_display()
115 set_ortho_projection();
116 glDisable(GL_TEXTURE_1D);
117 glDisable(GL_LIGHTING);
118 glDisable(GL_DEPTH_TEST);
125 glColor3f(0.9f, 0.9f, 0.9f);
126 glBegin(GL_TRIANGLES);
130 glVertex2d(transform_x(triangle[0][0]), transform_y(triangle[0][1]));
131 glVertex2d(transform_x(triangle[1][0]), transform_y(triangle[1][1]));
132 glVertex2d(transform_x(triangle[2][0]), transform_y(triangle[2][1]));
137 glLineStipple(5, 0x5555);
138 for (Linearizer::Iterator<ScalarLinearizerDataDimensions<LINEARIZER_DATA_TYPE>::edge_t> it = this->lin->edges_begin(); !it.end; ++it)
140 ScalarLinearizerDataDimensions<LINEARIZER_DATA_TYPE>::edge_t& edge = it.get();
142 int mrk = b_markers ? it.get_marker() : 0;
144 float* color = get_marker_color(mrk);
145 glColor3f(color[0], color[1], color[2]);
146 glLineWidth(mrk ? 3.0f : 1.0f);
148 glVertex2d(transform_x(edge[0][0]), transform_y(edge[0][1]));
149 glVertex2d(transform_x(edge[1][0]), transform_y(edge[1][1]));
154 glEnable(GL_LINE_STIPPLE);
155 glColor3f(0.4f, 0.4f, 0.4f);
157 glVertex2d(transform_x(edge[0][0]), transform_y(edge[0][1]));
158 glVertex2d(transform_x(edge[1][0]), transform_y(edge[1][1]));
160 glDisable(GL_LINE_STIPPLE);
168 for (i = 0; i < ne; i++)
170 if (elems[i].
id < 0)
continue;
172 sprintf(text,
"#%d", elems[i].
id);
173 draw_text(transform_x(elems[i].x), transform_y(elems[i].y), text, 0);
179 for (i = 0; i < ne; i++)
181 if (elems[i].
id < 0)
continue;
183 sprintf(text,
"%s", mesh->get_element_markers_conversion().get_user_marker(elems[i].
type).marker.c_str());
184 draw_text(transform_x(elems[i].x), transform_y(elems[i].y), text, 0);
191 void MeshView::on_key_down(
unsigned char key,
int x,
int y)
201 b_markers = !b_markers;
206 if (b_elem_mrk) b_elem_mrk =
false;
212 if (b_ids) b_ids =
false;
213 b_elem_mrk = !b_elem_mrk;
218 View::on_key_down(key, x, y);
223 float* MeshView::get_marker_color(
int marker)
225 static float edgecol[3] = { 0.3f, 0.3f, 0.3f };
226 static float randcol[3];
227 static float mc[8][3] =
229 { 1.0f, 0.3f, 0.3f },
230 { 0.0f, 0.9f, 0.0f },
231 { 0.0f, 0.0f, 0.7f },
232 { 1.0f, 1.0f, 0.2f },
233 { 0.7f, 0.0f, 0.0f },
234 { 0.0f, 0.5f, 0.0f },
235 { 0.3f, 0.5f, 1.0f },
236 { 0.8f, 0.8f, 0.0f },
241 else if (marker > 0 && marker < 8)
246 randcol[0] = (float)rand() / RAND_MAX;
247 randcol[1] = (float)rand() / RAND_MAX;
248 randcol[2] = (float)rand() / RAND_MAX;
253 const char* MeshView::get_help_text()
const
258 " Left mouse - pan\n"
259 " Right mouse - zoom\n"
260 " C - center image\n"
261 " H - render high-quality frame\n"
262 " B - toggle boundary markers\n"
263 " I - toggle element IDs\n"
264 " M - toggle element markers\n"
265 " S - save screenshot\n"
273 #include "mesh_view.h"
Common definitions for Hermes2D.
::xsd::cxx::tree::type type
C++ type corresponding to the anyType XML Schema built-in type.
LinearizerMultidimensional< ScalarLinearizerDataDimensions< LINEARIZER_DATA_TYPE > > Linearizer
Linearizer for scalar cases - historically called Linearizer.
Typedefs used throughout the Linearizer functionality.