# 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*, gibbon.toolbox@gmail.com

**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/.