sweepLoft
Below is a demonstration of the features of the sweepLoft function
Contents
clear; close all; clc;
Syntax
[F,V,C]=sweepLoft(V1,V2,n1,n2,Vg,numSteps,numTwist,plotOn);
Description
The sweepLoft function creates a swept loft (as in CAD terminology for a shape formed by merging a set of sketches towards each other allong a given path or guide curve). The inputs to the function are the start and end sketchs (V1 and V2), the start and end normal directions (n1 and n2), and the guid curve (Vg). Optional additional inputs are: the number of steps for the loft feature (numSteps, same as number of points in guide curve if not provided), the number of twists (numTwists, default is zero) the shape undergoes around the guide curve, and finally plotOn (default is 0, i.e. off) which is a logic to turn on or off plotting within the function. The function outputs are patch data i.e. faces (F), the vertices (V) and face colors (C, denoting step in lofting process).
Examples
Plot settings
lineWidth=3;
A sweep loft allong a guide curve
Creating sketches
ns=50; t=linspace(0,2*pi,ns); t=t(1:end-1); r=3+2.*sin(4*t); [x,y] = pol2cart(t,r); V1=[x(:) y(:) zeros(size(x(:)))]; V1=evenlySampleCurve(V1,size(V1,1),'pchip',1); E=[0.6*pi 0 0]; R1=euler2DCM(E); t=[1 2 -3]; V1=(V1*R1)+t; t=linspace(0,2*pi,ns); t=t(1:end-1); r=4+3.*sin(2*t); [x,y] = pol2cart(t,r); V2=[x(:) y(:) zeros(size(x(:)))]; V2=evenlySampleCurve(V2,size(V2,1),'pchip',1); E=[0 0.3*pi 0]; R2=euler2DCM(E); t=[-16 25 15]; V2=((V2*R2)+t);
Create a guide curve
numStepsCurve=50; %Number of steps for the curve p1=mean(V1,1); %First point n1=R1(3,:); %First direction vector p2=mean(V2,1); %End point n2=R2(3,:); %End direction vector csapsSmoothPar=1; %Cubic smoothening spline smoothening parameter f=0.05; %Extent of tangential nature to boundary curves, surface will remain approximately orthogonal to input curves for f*distance between curves [Vg]=sweepCurveSmooth(p1,p2,n1,n2,numStepsCurve,csapsSmoothPar,f);
Create a basic loft feature using default settings (no twist, same number of steps as number of points as in guide curve, plotting off)
[F,V,C]=sweepLoft(V1,V2,n1,n2,Vg);
Visualize loft feature
cFigure; subplot(1,2,1); hold on; h(1)=plotV(Vg,'k.-','LineWidth',lineWidth); h(2)=plotV(V1,'r.-','LineWidth',lineWidth); h(3)=plotV(V2,'g.-','LineWidth',lineWidth); h(4)=quiverVec(p1,n1,5,'r'); h(5)=quiverVec(p2,n2,5,'g'); legend(h,{'Guide curve','Start section','End section','Start direction vector','End direction vector'}); axisGeom; subplot(1,2,2); hold on; h=gpatch(F,V,C,'k'); axisGeom; legend(h,{'Loften surface'}); colormap(gjet(250)); camlight headlight drawnow;
A sweep loft allong a guide curve with twist
Create loft feature with twist
numTwist=2; %Number of additional twists of loft feature around guide curve numStepsSweep=75; %Number of steps for loft feature from sketch 1 to sketch 2 plotOn=1; %Turn on plotting to view lofting behaviour [F,V,C]=sweepLoft(V1,V2,n1,n2,Vg,numStepsSweep,numTwist,plotOn);
A ring shaped sweep loft
Creating sketches
ns=50; t=linspace(0,2*pi,ns); t=t(1:end-1); r=3+2.5.*sin(4*t); [x,y] = pol2cart(t,r); V1=[x(:) y(:) zeros(size(x(:)))]; E=[0 0.5*pi 0]; R1=euler2DCM(E); V1=(V1*R1); V2=V1;
Creating a ring shaped guide curve
numStepsCurve=100; p1=mean(V1,1); n1=R1(3,:); p2=mean(V2,1); n2=n1; t=linspace(-pi,pi,numStepsCurve); r=30; x=r*sin(t(:)); z=r*cos(t(:))+r; Vg=[x zeros(size(x)) z];
numTwist=2; %Number of additional twists of loft feature around guide curve numStepsSweep=numStepsCurve; %Number of steps for loft feature from sketch 1 to sketch 2 plotOn=1; %Turn on plotting to view lofting behaviour [F,V,C]=sweepLoft(V1,V2,n1,n2,Vg,numStepsSweep,numTwist,plotOn);
A sweep loft to create a coil
numStepsCurve=75; optionStruct.numSteps=numStepsCurve; %Number of points used to define the curve. optionStruct.numTwist=4; %Number of twists (for an unmodulated coil) optionStruct.coilAmplitude=[]; %The coil amplitude (set empty to based on curve or edge length instead) optionStruct.coilAmplitudeFactor=1/5; %The factor used to set local coil amplitude as a function of edge length optionStruct.f=3; % The Gaussian bell curve will be truncated at n*the standard deviation on both sides. optionStruct.funcMethod=2; %For loop based (1) or vectorised (2). plotOn=1; %Turn on plotting to view lofting behaviour % V1=[0 0 0; 1 0 0; 0.5 1 0]; % Creating sketches ns=12; t=linspace(0,2*pi,ns); t=t(1:end-1); r=5*ones(size(t)); [x,y] = pol2cart(t,r); V1=[x(:) y(:) zeros(size(x(:)))]; V2=V1; V2(:,3)=100; V=[mean(V1,1); mean(V2,1)]; Vg=gaborCoil(V,[1 2],optionStruct); [Vg] = evenlySampleCurve(Vg,size(Vg,1),'linear',0); n1=[0 0 1]; n2=[0 0 1]; R=euler2DCM([0.25*pi 0 0]); % R=euler2DCM(2*pi*randn(1,3)); V1=V1*R; V2=V2*R; n1=n1*R; n2=n2*R; Vg=Vg*R; [F,V,C]=sweepLoft(V1,V2,n1,n2,Vg,optionStruct.numSteps,0,1);
Visualize loft feature
cFigure; subplot(1,2,1); hold on; plotV(Vg,'k.-'); plotV(V1,'r.-'); plotV(V2,'g.-'); axisGeom; subplot(1,2,2); hold on; plotV(Vg,'k.-'); plotV(V1,'r.-'); plotV(V2,'g.-'); gpatch(F,V,C,'k'); axisGeom; colormap(gjet(250)); camlight headlight 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/.