The purpose of this assignment is to gain some experience with Bezier patches and to understand surface curvature as a classifier of shape. In this nb, you will work with Gaussian and m
The purpose of this assignment is to gain some experience with Bezier patches
and to understand surface curvature as a classifier of shape. In this nb, you will
work with Gaussian and mean curvature.Some code is provided. You must write
code where you see “TO DO”.
Instructor : Dianne Hansford, PhDHomework 3 : Bezier
Patches and Surface Curvatures
The purpose of this assignment is to gain some experience with Bezier patches
and to understand surface curvature as a classifier of shape. In this nb, you will
work with Gaussian and mean curvature.Some code is provided. You must write
code where you see “TO DO”.
Build patches:
TO DO: Create four bicubic Bezier patch control net.
The first three patches, called elliptic, hyperbolic, parabolic, should define
patches that demonstrate these classifications of Gaussian curvature.
You can keep this process simple and define the x- and y-coordinates over a grid
in the xy-plane and then define the z-coordinates as a function of x and y to
achieve a desired shape.
The fourth patch should be a freeform design and called freeform. It must be
significantly different than the other surfaces and it should not be symmetric.
elliptic = {
};
hyperbolic = {
};
parabolic = {
};
freeform = {
};
The code in the following section loads the patches you defined into a Bezier
surface evaluator.We will study B-splines later, and you will learn that Bezier
methods are a special case of them.(Do not change this code.)In the code in the
rest of the nb, each of these will be referred to as the “surface evaluator”.
In[601]:=
surfelliptic = BSplineFunction[elliptic];
surfhyperbolic = BSplineFunction[hyperbolic];
surfparabolic = BSplineFunction[parabolic];
surffreeform = BSplineFunction[freeform];
Gaussian Curvature
Functions for computing Gaussian curvature.
To Do: Implement Gaussian curvature in this section. See “gaussK” below.
(* This global variable turns
on print statements when set to 1 *)
printflag = 0;
(* zero tolerance to avoid dividing by zero *)
zeroTol = 0.000000005;
(*
Compute the first partials du, dv, second partials duu, dvv, mixed partial (duv),
and the normal (nor) at a (u,v) position on the surface
*)
(* NO CHANGE TO THIS FUNCTION *)
partialsf_, u_, v_ := du = Derivative[1, 0][f][u, v];
dv = Derivative[0, 1][f][u, v];
2
duv = Derivative[1, 1][f][u, v];
duu = Derivative[2, 0][f][u, v];
dvv = Derivative[0, 2][f][u, v];
cp = Cross[du, dv];
ncp = Norm[cp];
Ifncp < zeroTol, ncp = zeroTol; nor = cp /ncp;
Ifprintflag ⩵ 1, Print"Partial at u=", u, " v=", v; Print"du =", du, " du.du = ", du.du; Print"dv =", dv, " dv.dv = ", dv.dv; Print"duv =", duv, " du.dv = ", du.dv; Print"duu =", duu; Print"dvv =", dvv; Print"nor =", nor
; Returndu, dv, duu, dvv, duv, nor
;
(*
Compute the first and second fundamental forms at a point
on the surface correspoinding to (u,v) in the domain.
Input the derivative information in this order: du,
dv, duu, dvv, duv, nor
where du is the first partial in the u-direction and
duu is the second partial in the v-direction.
3
nor is the normal vector at the point on the surface.
*)
(* NO CHANGE TO THIS FUNCTION *)
fundamentalForms[derivatives_] :=
(* assign the input to easier to use variables *)
du = derivatives〚1〛; dv = derivatives〚2〛; duu = derivatives〚3〛; dvv = derivatives〚4〛; duv = derivatives〚5〛; nor = derivatives〚6〛;
firstFundForm = Detdu.du, du.dv, du.dv, dv.dv; secondFundForm =
Detnor.duu, nor.duv, nor.duv, nor.dvv;
Ifprintflag ⩵ 1, Print"First fundamental form =", firstFundForm; Print"Second fundamental form =", secondFundForm
; ReturnfirstFundForm, secondFundForm
;
(*
Compute the Gaussian curvature at a point on the surface.
Input the surface evaluator and the (u,v) pair
*)
(* TO DO: WRITE THIS FUNCTION *)
4
gaussK[f_, u_, v_] :=
(* Check for division by zero. If divisor is small,
set it to the zero tolerance.
Exchange "xxx" for the divisor *)
(*
IfAbs[xxx]< zeroTol,
Print"Warning! divisor is small"; xxx = zeroTol;
*)
Return(* gaussian curvature *) ;
(*
Calculate minimum and maximum computed Gaussian
curvatures over the surface for use in the color map.
Input the surface evaluator.
*)
(* NO CHANGE TO THIS FUNCTION *)
setminmax[f_] :=
(* Extract minimum and maximum computed Gaussian
curvatures over the surface for domain [0,1] x [0,1]
*) mingc = NMinValue
gaussK[f, uu, vv], 0 ≤ uu ≤ 1, 0 ≤ vv ≤ 1, {uu, vv}; maxgc = NMaxValue
5
gaussK[f, uu, vv], 0 ≤ uu ≤ 1, 0 ≤ vv ≤ 1, {uu, vv};
(* Print"min and max Gaussian curvature: n mingc = ",
mingc," maxgc = ",maxgc; *)
(*
Using a zero-tolerance,
check if mingc equals maxgc. If so,
modify the maxgc by the tolerance.
This will allow the color
map definition to work in all cases.
*)
zeroTol = 0.000005;
Ifmaxgc – mingc < zeroTol,
Print"Setting maxgc to +zeroTol"; maxgc = mingc + zeroTol;
Returnmingc, maxgc ;
Plot the surfaces with Gaussian curvature as a texture map.
To Do: Choose a different color scheme, and use it for each of the four plots.
It must be a diverging color scheme (like TemperatureMap)
To Do: Under each plot, create a formatted text cell and in this cell, describe the
patch (shape and control points) and the Gaussian curvature, making an
argument as to why this plot is correct. Consider commenting on the color map.
Plot the elliptic surface and its Gaussian curvature
6
In[611]:=
(* Calculate the min and max Gaussian curvature *)
{mingc, maxgc} = setminmax[surfelliptic];
(* Plot the surface with Gaussian curvature texture map *)
(* Rescale is used to map the Gaussian
curvature into the color ramp in [0,1] *)
plotelliptic = ParametricPlot3Dsurfelliptic[u, v], {u, 0, 1},
{v, 0, 1}, Mesh → False, PlotRange → All, ColorFunction → Function[{x, y, z, u, v}, ColorData["TemperatureMap"][
Rescale[gaussK[surfelliptic, u, v], {mingc, maxgc}]]],
PlotLegends → BarLegend[{"TemperatureMap", {mingc, maxgc}},
LegendLabel → "K"];
(* Show the surface with Gaussian curvature
and the control net with control points *)
gaussEllipticPlot = Show[plotelliptic,
Graphics3D[{PointSize[Large], Black, Map[Point, elliptic]}],
Graphics3D[{Thick, Gray, Line[elliptic],
Gray, Line[Transpose[elliptic]]}]]
Print Style"Color map of Gaussian curvature K", Large, Bold;
PrintStyle"min K = ", Large, Bold, Style[NumberForm[mingc, 2], Large];
PrintStyle"max K = ", Large, Bold, Style[NumberForm[maxgc, 2], Large];
7
Your comments here
Plot the hyperbolic surface and its Gaussian curvature In[617]:=
{mingc, maxgc} = setminmax[surfhyperbolic];
plothyperbolic =
ParametricPlot3Dsurfhyperbolic[u, v], {u, 0, 1},
{v, 0, 1}, Mesh → False, PlotRange → All, ColorFunction → Function{x, y, z, u, v}, ColorData["TemperatureMap"]
RescalegaussK[surfhyperbolic, u, v], mingc, maxgc, PlotLegends → BarLegend[{"TemperatureMap", {mingc, maxgc}},
LegendLabel → "K"];
gaussHyperbolicPlot = Show[plothyperbolic,
Graphics3D[{PointSize[Large], Black, Map[Point, hyperbolic]}],
Graphics3D[{Thick, Gray, Line[hyperbolic],
Gray, Line[Transpose[hyperbolic]]}]]
Print Style"Color map of Gaussian curvature K", Large, Bold;
PrintStyle"min K= ", Large, Bold, Style[NumberForm[mingc, 2], Large, Bold];
PrintStyle"max K= ", Large, Bold, Style[NumberForm[maxgc, 2], Large, Bold];
Your comments here
8
Plot the parabolic surface and its Gaussian curvature In[623]:=
{mingc, maxgc} = setminmax[surfparabolic];
plotparabolic =
ParametricPlot3Dsurfparabolic[u, v], {u, 0, 1}, {v, 0, 1},
Mesh → False, PlotRange → All, ColorFunction → Function{x, y, z, u, v}, ColorData["TemperatureMap"]
RescalegaussK[surfparabolic, u, v], mingc, maxgc, PlotLegends → BarLegend[{"TemperatureMap", {mingc, maxgc}},
LegendLabel → "K"];
gaussParabolicPlot = Show[plotparabolic,
Graphics3D[{PointSize[Large], Black, Map[Point, parabolic]}],
Graphics3D[{Thick, Gray, Line[parabolic],
Gray, Line[Transpose[parabolic]]}]]
Print Style"Color map of Gaussian curvature K", Large, Bold;
PrintStyle"min K = ", Large, Bold, Style[NumberForm[mingc, 2], Large, Bold];
PrintStyle"max K = ", Large, Bold, Style[NumberForm[maxgc, 2], Large, Bold];
Your comments here
Plot the freeform surface and its Gaussian curvature
9
In[629]:=
{mingc, maxgc} = setminmax[surffreeform];
plotfreeform =
ParametricPlot3Dsurffreeform[u, v], {u, 0, 1}, {v, 0, 1},
Mesh → False, PlotRange → All, ColorFunction → Function{x, y, z, u, v}, ColorData["TemperatureMap"]
RescalegaussK[surffreeform, u, v], mingc, maxgc, PlotLegends → BarLegend[{"TemperatureMap", {mingc, maxgc}},
LegendLabel → "K"];
gaussFreeFormPlot = Show[plotfreeform,
Graphics3D[{PointSize[Large], Black, Map[Point, freeform]}],
Graphics3D[{Thick, Gray, Line[freeform],
Gray, Line[Transpose[freeform]]}]]
Print Style"Color map of Gaussian curvature K", Large, Bold;
PrintStyle"min K = ", Large, Bold, Style[NumberForm[mingc, 2], Large, Bold];
PrintStyle"max K = ", Large, Bold, Style[NumberForm[maxgc, 2], Large, Bold];
Your comments here
Mean Curvature
To Do: Implement mean curvature
(*
Compute the mean curvature at a point on the surface.
Input the surface evaluator and the (u,v) pair
10
*)
(* WRITE THIS FUNCTION *)
meanCurvature[f_, u_, v_] :=
Return(* mean curvature *) ;
(*
Calculate minimum and maximum computed mean
curvatures over the surface for use in the color map.
Input the surface evaluator.
*)
(* NO CHANGE TO THIS FUNCTION *)
setminmaxMean[f_] :=
(* Extract minimum and maximum computed Gaussian
curvatures over the surface for domain [0,1] x [0,1]
*) minmc = NMinValuemeanCurvature[f, uu, vv],
0 ≤ uu ≤ 1, 0 ≤ vv ≤ 1, {uu, vv}; maxmc = NMaxValuemeanCurvature[f, uu, vv],
0 ≤ uu ≤ 1, 0 ≤ vv ≤ 1, {uu, vv};
(*Print"min and max mean curvature: n minmc = ",
minmc," maxmc = ",maxmc; *)
(*
11
Using a zero-tolerance,
check if minmc equals maxmc. If so,
modify the maxmc by the tolerance.
This will allow the color
map definition to work in all cases.
*)
eps = 0.000005;
Ifmaxmc – minmc < eps,
Print"Setting maxmc to +eps"; maxmc = minmc + eps;
Returnminmc, maxmc ;
To Do: Repeat the visualizations of the four surface with mean curvature as the
texture map.
Use the same color scheme that you chose above.
To Do: Under each plot, create a formatted text cell and in this cell, describe the
patch and the mean curvature, making an argument as to why this plot is correct.
Plot the elliptic surface and its mean curvature
Plot the hyperbolic surface and its mean curvature
Plot the parabolic surface and its mean curvature
Plot the freeform surface and its mean curvature
12
Use GraphicsRow to examine Gaussian and mean curvature plots side-by-
side.To Do: Below each plot in a formatted cell, briefly compare the plots
.Does one curvature measure reveal more about the shape than the other?
In[661]:=
GraphicsRowgaussEllipticPlot, meanEllipticPlot In[662]:=
GraphicsRowgaussHyperbolicPlot, meanHyperbolicPlot In[663]:=
GraphicsRowgaussParabolicPlot, meanParabolicPlot In[664]:=
GraphicsRowgaussFreeFormPlot, meanFreeFormPlot
13
,
In[632]:=
ClearAllEvaluate$Context <> "*"
Basic Definition In[633]:=
colorInterpolation[startColor_, endColor_, numCurves_, currentIndex_] :=
Moduler1, g1, b1, r2, g2, b2, fraction, {r1, g1, b1} = startColor;
{r2, g2, b2} = endColor;
(*Calculate the fraction representing the current position between the curves*)
fraction = (currentIndex – 1) (numCurves – 1);
(*Interpolate the color components separately*)
RGBColorr1 + fraction (r2 – r1), g1 + fraction (g2 – g1), b1 + fraction (b2 – b1)
(*Example usage*)
startColor = {1, 0, 0}; (*Red*)
endColor = {0, 1, 0}; (*Blue*)
numCurves = 9; (*Number of curves in the design*)
(*Calculate colors for three curve pieces*)
curveColors = TablecolorInterpolation[startColor, endColor, numCurves, i], i, numCurves Out[637]=
{ , , , , , , , , }
In[638]:=
globalToLocal[a_, b_, u_] := (u – a) (b – a)
In[639]:=
bezierPoints =
{0, 0}, {1, 0} , {2, 0}, {3, 0},
{3, 0}, 4, -5, 5, 5, 6, 0,
{6, 0}, {7, -5}, {8, -3}, 9, 0,
{9, 0}, 10, 3, {11, 0}, 12, 0,
{12, 0}, {14, 0}, {11, 3}, {13, 2},
{{13, 2}, {12, 1}, {15, 1}, {13, 2}},
{14, 3}, 15, 4, 16, 4, 17, 0,
{17, 0}, 18, – 10, -5, 0, {0, 0}
;
Below is very important. It’s the core part: a function that can generate the bezire
curve.
In[640]:=
f[u_] := ModuleindexInbezierPoints = Floor[u] + 1, localVar = u – Floor[u], pts,
pts = bezierPointsindexInbezierPoints; Sumptsi + 1 × BernsteinBasis[3, i, localVar], i, 0, 3
In[641]:=
g1 = ParametricPlotf[t], t, 0, Length@bezierPoints
Out[641]=
5 10 15
-4
-2
2
In[642]:=
bezierLinesGraph =
TableGraphicscurveColorsi, LinebezierPointsi, i, Length[bezierPoints];
In[643]:=
controlPoints = TableGraphicsPointSize[0.02], curveColorsi, PointbezierPointsi,
i, Length@bezierPoints;
In[644]:=
g2 = ParametricPlotf[t], t, 0, Length@bezierPoints, ColorFunction → Function[{x, y, u}, curveColors〚Floor[u] + 1〛], ColorFunctionScaling → False;
2
Plot1
In[645]:=
Show[bezierLinesGraph, g2, controlPoints]
Out[645]=
Plot2
In[646]:=
g1
Out[646]=
5 10 15
-4
-2
2
Plot3 (wait)
In[647]:=
initRec = {-1, 1}, {1, -1};
3
In[648]:=
GraphicsBlue, Disk [{0, 0}, 1.5](*添加蓝⾊填充的Disk*),
Red, Rectangle@@ initRec, Black, Arrow[{{0, 0}, {1, 0}}], Green,
Arrow{0, 0}, {0, 1}, (*添加垂直箭头*)PointSize[0.02], Point[{0, 0}]
Out[648]=
This is very important: The derivative of bazier curve. Ref:
In[649]:=
"https://computergraphics.stackexchange.com/questions/10551/how-to-take-the-derivative-of-
a-b%C3%A9zier-curve#:~:text=We%20obtain%20a%20quadratic%20B,control%20points%20
scaled%20by%20n.";
In[650]:=
firstD[u_] :=
ModuleindexInbezierPoints = Floor[u] + 1, localVar = u – Floor[u], diffs, two,
diffs = Differences /@ bezierPointsindexInbezierPoints; two = 3 Sumdiffsi + 1 × BernsteinBasis2, i, localVar, i, 0, 2;
(*Don't need to convert to a number*)
two〚1〛, two〚2〛
In[651]:=
firstD[0.5]
Out[651]=
{3., 0.}
4
In[652]:=
SecondD[u_] :=
ModuleindexInbezierPoints = Floor[u] + 1, localVar = u – Floor[u], diffs, diffs2, two,
diffs = Differences /@ bezierPointsindexInbezierPoints; diffs2 = Differences /@ diffsindexInbezierPoints; two = 6 Sumdiffsi + 1 × BernsteinBasis1, i, localVar, i, 0, 1;
(*Don't need to convert to a number*)
two〚1〛, two〚2〛
Plot4
In[653]:=
ManipulateModulecurve, tangent, tangentVector, u, perpendicularVector,
translationMatrix, rotationMatrix, movingRectangle, u = uValue;
curve = f[u];
tangent = firstD[u];
tangentVector = tangent;
perpendicularVector = {-tangentVector〚2〛, tangentVector〚1〛}; translationMatrix = TranslationTransform[curve];
rotationMatrix = RotationTransform[{{1, 0}, tangentVector}];
movingRectangle =
GeometricTransformation[Rectangle@@ initRec, translationMatrix.rotationMatrix];
blueDisk = Disk[curve, 1.5];
ShowGraphicsBlue, blueDisk (*添加蓝⾊填充的Disk*), Red,
movingRectangle, Black, Arrowcurve, curve + Normalize[tangentVector], Green, Arrowcurve, curve + Normalize[perpendicularVector], (*添加垂直箭头*)PointSize[0.02], Point[curve], g1,
uValue, 0, "Parameter u", 0, Length@bezierPoints – 0.02,
0.001, Appearance → "Labeled"
Out[653]=
Parameter u 0
Show , g1
5
,
In[1116]:=
Clear["Global`*"]
CSE 477
Instructor: Dianne Hansford
Homework 2:
Exploring Least Squares Approximation with Bezier Curves
The purpose of this homework is to explore least squares approximation with Bezier curves. The
program flow is as follows.1) Input data points to be approximated 2) Uniform or chord length
parameters are created for the data.3) Input the degree n of the approximation4) Approximate the
data with a degree n Bezier curve
This program finds the approximation with both sets of parameter values so they may be
displayed together.5) Measure error between the Bezier curve and the input data.6) Display the
input, approximation, errors7) Document your observations. Details for each of these steps are
given below in the blue sections. You must complete the code when instructed to do so. I have
supplied some code and graphics for you.See the Observations section for instructions for the final
report: running the data sets and reporting.Instructions on how to get started will be given in class.
Guidelines:
Turn in via Canvas
Name your file lastname_HW2.nb
Below each problem description, add your MM code
Comment your notebook
Work independently
Bezier Curve Evaluator
(You do not need to change this routine.)
In[1117]:=
curve[bpts_, deg_, t_] := SumBernsteinBasis[deg, i, t] * bptsi + 1, i, 0, deg;
Data Sets
Below are some sample data sets
Create numdata = number of data to be approximated
Create data (x,y) or (x,y,z) points to be approximated
Load one data set into “data”
In[1118]:=
(* uniformly sampled line *)
bpts = {0, 0}, {1, 1}, {2, 2}, {3, 3};
dataUniformline = Tablecurvebpts, Length[bpts] – 1, t, t, 0, 1, 1.0 / 10.0;
(* Noisy line *)
dataNoisyLine = Tablet, t + 0.2 * RandomReal[], t, 0, 1, 1.0 / 30.0;
(* nice curve: classic car fender sillouette *)
bpts = {0, 0}, {0, 1}, {0, 2}, {20, 3};
dataGF = Tablecurvebpts, Length[bpts] – 1, t, t, 0, 1, 1.0 / 20.0;
(* This data set has a gap in the data —
suppose some part was occluded or data lost *)
dataGFgap = {0, 0}, 0.0025000000000000005`, 0.15000000000000002`, 0.020000000000000004`, 0.30000000000000004`, 0.06750000000000003`, 0.45000000000000007`, 0.16000000000000003`, 0.6000000000000002`,
0.3125`, 0.75`, 0.5400000000000003`, 0.9000000000000001`, 0.8575000000000002`, 1.05`, 1.2800000000000002`, 1.2000000000000002`, 1.8225000000000002`, 1.3500000000000003`, 5.4925000000000015`, 1.95`, 6.860000000000001`, 2.1`, 8.4375`, 2.25`, 10.240000000000002`, 2.4000000000000004`, 12.282500000000002`, 2.5500000000000003`,
14.580000000000002`, 2.7`, 17.1475`, 2.8499999999999996`, {20, 3};
(* four points *)
bpts = {0, 0}, 0.0, 1.0, 2.0, 1.0, 2.0, 0.0;
dataFour = Tablecurvebpts, Length[bpts] – 1, t, t, 0, 1, 1.0 / 3.0;
(* This is a data set to simulate an outlier *)
dataOutlier = Tablet, Sin[t], t, 0, Pi, 1.0 / 10.0;
dataOutlier〚17, 2〛 = dataOutlier〚17, 2〛 – 0.5;
(* semici
Collepals.com Plagiarism Free Papers
Are you looking for custom essay writing service or even dissertation writing services? Just request for our write my paper service, and we'll match you with the best essay writer in your subject! With an exceptional team of professional academic experts in a wide range of subjects, we can guarantee you an unrivaled quality of custom-written papers.
Get ZERO PLAGIARISM, HUMAN WRITTEN ESSAYS
Why Hire Collepals.com writers to do your paper?
Quality- We are experienced and have access to ample research materials.
We write plagiarism Free Content
Confidential- We never share or sell your personal information to third parties.
Support-Chat with us today! We are always waiting to answer all your questions.