patchExtend
Below is a basic demonstration of the features of the patchExtend function.
Contents
Syntax
[Fn,Vn]=patchExtend(F,V,Eb,optionStruct);
Description
This function extends the input surface geometry allong the edges Eb using the local (or averaged) surface direction at these edges.
The input consists of: the input surface (patch) data, defined by the faces F and vertices V, the boundary edges Eb to extend the surface over, and an optionStruct structure containing all remaining and optional inputs.
The input structure may contain the following fields:
optionStruct.extendDistance -> %The distance to extend the surface by
optionStruct.numSteps -> The number of steps to use in the extension direction, default is the distance divided by the average edge length.
optionStruct.plotOn -> option to turn on/off plotting, default is 0
optionStruct.meshType -> the mesh type ('tri' or 'quad'), default is 'tri'.
optionStruct.globalDirection -> the global (should be seen as mean) direction for extension, default is empty ([]) and is instead based on the input mesh directions
optionStruct.extendMethod=1; %Method to use for extruding (see below), default is 1.
Five extend methods have been implemented (default is 1):
extendMethod=1 -> Equal offset allong local direction extendMethod=2 -> Equal offset wrst mean direction allong local direction extendMethod=3 -> Varying offset allong local ending planar wrt mean direction extendMethod=4 -> Equal offset allong mean direction extendMethod=5 -> Equal offset allong mean direction ending planar wrt mean direction
Examples
clear; close all; clc;
Example 1; Extending a surface
A reasonably complicated example is formed by creating a surface with a non-planar boundary edge. This example serves to highlight the various options and potential issues that might arrize from "convergent" edge vectors.
The example here creates a warped cylindrical surface. The surface is warped by creating a spatialy varying scalling in the X-direction and a distortion in the Z-direction.
% Defining a cylinder inputStruct.cylRadius=1; inputStruct.numRadial=25; inputStruct.cylHeight=4; inputStruct.numHeight=11; inputStruct.meshType='quad'; [F,V]=patchcylinder(inputStruct); % Derive patch data for a cylinder %Adjust shape of the cylinder in X-direction w=V(:,3); w=w-min(w(:)); w=w./max(w(:)); %Weight to use for warping w=(3*w+1); %Linear scale V(:,1)=V(:,1).*w; %Warp in X-direction %Adjust shape in the Z-direction w=V(:,1); w=w-min(w(:)); w=w./max(w(:)); %Weight to use for warping w=w*2*pi; %Metric to use in warping V(:,3)=V(:,3)+0.6*sin(w); %Warp in Z-direction
Getting surface top boundary edges
Eb=patchBoundary(F,V); %All boundary edges (including bottom) VE=patchCentre(Eb,V); %Edge centre coordinates logicTop=VE(:,3)>0; %Logic for top edges (Z-coordinate above 0) Eb=Eb(logicTop,:); %Set of edges at the top
Extending the surface. The
% Defing input parameters optionStruct.numSteps=[]; optionStruct.plotOn=1; optionStruct.meshType=[]; optionStruct.globalDirection=[]; optionStruct.extendDistance=1.5; %Extend distance optionStruct.extendMethod=1; %Method to use for extruding [Fn,Vn]=patchExtend(F,V,Eb,optionStruct);
Using different extend methods
The loop below is for each method available.
optionStruct.numSteps=[]; optionStruct.plotOn=0; optionStruct.meshType=[]; optionStruct.globalDirection=[]; optionStruct.extendDistance=1.5; %Extend distance cFigure; for q=1:1:5 optionStruct.extendMethod=q; %Method to use for extruding [Fn,Vn]=patchExtend(F,V,Eb,optionStruct); subplot(2,3,q); hold on; title(['Extend method ',num2str(q)]); gpatch(F,V,'w','k',1); gpatch(Fn,Vn,'bw','k',1); axisGeom; camlight headlight; end drawnow;
GIBBON www.gibboncode.org
Kevin Mattheus Moerman, [email protected]
GIBBON footer text
License: https://github.com/gibbonCode/GIBBON/blob/master/LICENSE
GIBBON: The Geometry and Image-based Bioengineering add-On. A toolbox for image segmentation, image-based modeling, meshing, and finite element analysis.
Copyright (C) 2019 Kevin Mattheus Moerman
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.