Create BE surface mesh of a guitar body

This demo explains how to create a BE surface mesh of a guitar. The guitar shape is described by cubic Bezier curves, and is saved in an eps file.

Contents

Geometrical parameters

Ly = 0.65;  % guitar body length [m]
Lz = 0.1;   % guitar body depth [m]
Le = 0.02;  % length of a boundary element [m]

Load and mesh guitar body boundary curve

We first load the boundary curve path of the half guitar body from the postscript file halfguitar.eps using the toolbox function read_epspath. The eps curve needs to be scaled in order to obtain the desired guitar body length. Instead, we first mesh the eps curve with a modified element length (using the toolbox function mesh_path), and the resulting NiHu line mesh is scaled down using function scale_mesh.

epsfile = 'data/halfguitar.eps';
epsfile = fullfile(fileparts(mfilename('fullpath')), epsfile);
[bb, path] = read_epspath(epsfile);
scale_factor = Ly/max(diff(bb, 1));
bou = meshpath(path, Le/scale_factor);
bou = scale_mesh(bou, scale_factor);

figure;
plot_mesh(bou);

We translate the mesh to the origin and reflect it in order to obtain a full symmetric guitar boundary.

bou = translate_mesh(bou, [-max(bou.Nodes(:,2)) 0 0]);
bou = join_meshes(bou, reflect_mesh(bou, [1 0 0]));

figure;
plot_mesh(bou);

Meshing the body surface and the side plates

The surface of the guitar body is meshed using the toolbox interface function fill_polygon. This function is an interface to the Matlab toolbox mesh2D by Darren Engwirda.

plate = fill_polygon(bou, Le);

figure;
plot_mesh(plate);
WARNING: 8 duplicate node(s) removed

Mesh2D may refine the boundary of the guitar body surface. Therefore, we redefine the boudary mesh using the toolbox function get_boundary, and extrude it with extrude_mesh in order to obtain the guitar side plate.

bou = get_boundary(plate);
nz = ceil(Lz/Le);
side = extrude_mesh(bou, [0 0 Lz/nz], nz);

figure;
plot_mesh(side);

Assembling the guitar mesh

We finally create the guitar back plate by flipping the elements of the front plate, and assemble the guitar mesh from the three parts.

back = flip_elements(plate);
top = translate_mesh(plate, [0 0 Lz]);
guitar = join_meshes(top, back, side);

After merging coincident nodes and dropping unused nodes, we plot the guitar mesh and outward surface normals

guitar = merge_coincident_nodes(guitar);
guitar = drop_unused_nodes(guitar);

figure;
plot_mesh(guitar);
plot_elem_normals(guitar);