Application Center - Maplesoft

App Preview:

A Note On Subdivision Curves

You can switch back to the summary page by clicking here.

Learn about Maple
Download Application


 

Image 

 

A Note On Subdivision Curves
Wieslaw Kotarski (kotarski@math.us.edu.pl) & Agnieszka Lisowska (alisow@ux2.math.us.edu.pl)
Institute of Computer Science
Silesian University
Bedzinska 3941-200 Sosnowiec, Poland

(Abstract)
In this worksheet we present subdivision method applied to three non-collinear control points. It will be demonstrated that depending on the form of subdivision matrices quadratic B-spline, quadratic B?zier and fractal- like curves or other fractal objects can be generated.
 

1.Introduction 

 

De Rham in 1947 [2] investigated the corner cutting  algorithm presented in Fig.1. Assume, that three non-collinear points P[0], P[1],P[2]  and two parameters u, v, such that 0 < u, v < 1, are given . Two segments [P[0], P[1]] and  [P[1], P[2]] are divided into three parts in the ratios u:1-(u+v):v creating new points (diff(P(x), x))[0], (diff(P(x), x))[1], (diff(P(x), x))[2]  and  `P , respectively. 

 

 

Image 

Fig. 1. Cutting corner algorithm. 

 

 

Dependency between points P[0], P[1], P[2]  and  (diff(P(x), x))[0], (diff(P(x), x))[1], (diff(P(x), x))[2]  and `P  can be represented, using subdivision matrices L and R, in the following form: 

 

 

 

After several iterations of corner cutting algorithm with suitable choice of parameters u and v one obtains a good approximation of a smooth curve. It is known from [2] that for u = v =`/`(1, 3) one  gets `^`(C, 0)curve. Later, de Rham in 1956 discoverd that by taking u = v = `/`(1, 4) one  gets C curve. That fact was reinvented by Chaikin [1] in 1974. Chaikin additionally proved that the obtained curve is a quadratic B-spline and he was the first who introduced geometric methods to Computer Aided Design.  

 

In early 1960s de Casteljau and B?zier [11] suggested another  corner cutting algorithm presented in Fig. 2. Now, we apply midpoint strategy. It means that on every segment we put a new point in its middle. 

 

Image 

Fig. 2. De Casteljau algorithm. 

 

 

Dependency between points P[0], P[1], P[2] and (diff(P(x), x))[0], (diff(P(x), x))[1], (diff(P(x), x))[2]and `P  can be given in the form: 

 

 

 

 

 

That scheme produces a quadratic B?zier curve. 

 

In 1990 van Overveld [10] showed that subdivision matrices can be perturbated and using them it is possible to get  fractal- like cuves that are perturbated cubic ones. Subdivision matrices are perturbated in such a way that it is possible to preserve curve continuity and tangency at first and last points. We demonstrate that the same effect can be get for quadratic curves. 

 

Consider general form of subdivision matrices: 

 

 

 

We postulate the following conditions  to be satisfied: 

 

A) the curve has to go through points P[0] and P[2], so then  

 

 

 

B) tangency to the curve at points P[0] and  P[2] requires 

 

 

 

where parameters 0 ≤ a, b ≤ 1. 

 

C) continuity of the curve needs 

 

 

 

where parameters 0 ≤ c, d ≤ 1.  

 

D) Matrices L and R are assumed to be Markovian ones. That means that their coefficients in rows sum up to 1. It assures affine invariance of the generated curves by such subdivision matrices. 

 

Summing up, subdivision matrices L and R with four parameters a, b, c, d generate affine invariant continuous curve that passes through points P[0] ,P[2]and is tangent at those points. Those subdivision matrices have the following form:   

 

 

 

 

 

At the end of this section  we recall the result by Goldman [3], [9] that states that every subdivision implies the following form of IFS: 

 

IFS ={ 

 

where 

 

 

`and`(P = Vector[column](%id = 51322844), Vector[column](%id = 51322844) = Matrix(%id = 51322724)) 

 

 

 

is the matrix of control points , `/`(1, `*`(P)) is the inverse matrix to P. So then, points  P[0], P[1], P[2]should not be collinear.  

 

In this worksheet we generate curves or other fractal shapes using deterministic algorithm used to IFS  defined by subdivision matrices with different parameters. The given below Maple programs are similar to those presented in earlier authors' worksheet  [4] - [7].  

   

 

2. Maple Program 

 

restart; -1 

with(plots); -1 

with(LinearAlgebra); -1 

Definition of homegeneous point in `*`(`^`(R, 2)) 

 

`:=`(P, proc (x, y) options operator, arrow; [x, y, 1] end proc); -1 

 

Point Transformation 

 

`:=`(TransPoint, proc (t, p) [`+`(`*`(t[1], `*`(p[1])), `*`(t[2], `*`(p[2])), t[5]), `+`(`*`(t[3], `*`(p[1])), `*`(t[4], `*`(p[2])), t[6])] end proc); -1 

 

Polygon Transformation 

 

`:=`(TransPolygon, proc (t, polygon) local i; [seq(TransPoint(t, polygon[i]), i = 1 .. nops(polygon))] end proc); -1
`:=`(TransPolygon, proc (t, polygon) local i; [seq(TransPoint(t, polygon[i]), i = 1 .. nops(polygon))] end proc); -1
`:=`(TransPolygon, proc (t, polygon) local i; [seq(TransPoint(t, polygon[i]), i = 1 .. nops(polygon))] end proc); -1
`:=`(TransPolygon, proc (t, polygon) local i; [seq(TransPoint(t, polygon[i]), i = 1 .. nops(polygon))] end proc); -1
 

 

Iterated function system (the number of iterations, list of transformations and initial polygon should be given)
 

`:=`(IFS, proc (n, ListTrans, polygon) local i, j, k, s, seqpoly; `:=`(seqpoly, polygon); for j to n do `:=`(s, NULL); for i to nops(ListTrans) do `:=`(s, s, seq(TransPolygon(ListTrans[i], op(k, [seqp...
`:=`(IFS, proc (n, ListTrans, polygon) local i, j, k, s, seqpoly; `:=`(seqpoly, polygon); for j to n do `:=`(s, NULL); for i to nops(ListTrans) do `:=`(s, s, seq(TransPolygon(ListTrans[i], op(k, [seqp...
`:=`(IFS, proc (n, ListTrans, polygon) local i, j, k, s, seqpoly; `:=`(seqpoly, polygon); for j to n do `:=`(s, NULL); for i to nops(ListTrans) do `:=`(s, s, seq(TransPolygon(ListTrans[i], op(k, [seqp...
`:=`(IFS, proc (n, ListTrans, polygon) local i, j, k, s, seqpoly; `:=`(seqpoly, polygon); for j to n do `:=`(s, NULL); for i to nops(ListTrans) do `:=`(s, s, seq(TransPolygon(ListTrans[i], op(k, [seqp...
`:=`(IFS, proc (n, ListTrans, polygon) local i, j, k, s, seqpoly; `:=`(seqpoly, polygon); for j to n do `:=`(s, NULL); for i to nops(ListTrans) do `:=`(s, s, seq(TransPolygon(ListTrans[i], op(k, [seqp...
`:=`(IFS, proc (n, ListTrans, polygon) local i, j, k, s, seqpoly; `:=`(seqpoly, polygon); for j to n do `:=`(s, NULL); for i to nops(ListTrans) do `:=`(s, s, seq(TransPolygon(ListTrans[i], op(k, [seqp...
`:=`(IFS, proc (n, ListTrans, polygon) local i, j, k, s, seqpoly; `:=`(seqpoly, polygon); for j to n do `:=`(s, NULL); for i to nops(ListTrans) do `:=`(s, s, seq(TransPolygon(ListTrans[i], op(k, [seqp...
`:=`(IFS, proc (n, ListTrans, polygon) local i, j, k, s, seqpoly; `:=`(seqpoly, polygon); for j to n do `:=`(s, NULL); for i to nops(ListTrans) do `:=`(s, s, seq(TransPolygon(ListTrans[i], op(k, [seqp...
`:=`(IFS, proc (n, ListTrans, polygon) local i, j, k, s, seqpoly; `:=`(seqpoly, polygon); for j to n do `:=`(s, NULL); for i to nops(ListTrans) do `:=`(s, s, seq(TransPolygon(ListTrans[i], op(k, [seqp...
`:=`(IFS, proc (n, ListTrans, polygon) local i, j, k, s, seqpoly; `:=`(seqpoly, polygon); for j to n do `:=`(s, NULL); for i to nops(ListTrans) do `:=`(s, s, seq(TransPolygon(ListTrans[i], op(k, [seqp...
`:=`(IFS, proc (n, ListTrans, polygon) local i, j, k, s, seqpoly; `:=`(seqpoly, polygon); for j to n do `:=`(s, NULL); for i to nops(ListTrans) do `:=`(s, s, seq(TransPolygon(ListTrans[i], op(k, [seqp...
`:=`(IFS, proc (n, ListTrans, polygon) local i, j, k, s, seqpoly; `:=`(seqpoly, polygon); for j to n do `:=`(s, NULL); for i to nops(ListTrans) do `:=`(s, s, seq(TransPolygon(ListTrans[i], op(k, [seqp...
`:=`(IFS, proc (n, ListTrans, polygon) local i, j, k, s, seqpoly; `:=`(seqpoly, polygon); for j to n do `:=`(s, NULL); for i to nops(ListTrans) do `:=`(s, s, seq(TransPolygon(ListTrans[i], op(k, [seqp...
`:=`(IFS, proc (n, ListTrans, polygon) local i, j, k, s, seqpoly; `:=`(seqpoly, polygon); for j to n do `:=`(s, NULL); for i to nops(ListTrans) do `:=`(s, s, seq(TransPolygon(ListTrans[i], op(k, [seqp...
 

 

Procedure 1 

(u, v are parameters of subdivision matrices, n- number of iterations, initial polygon is a triangle with vertices P[0], P[1], P[2]) 

 

 

`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
`:=`(Subdiv_1, proc (u, v, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4; `:=`(B1, Matrix([[`+`(1, `-`(u)), u, 0], [v, `+`(1, `-`(v)), 0], [0, `+`(1, `-`(u)), u]])); `:=`(B2, Matrix([[v, `+`(1...
 

 

Procedure 2 

(a,b,c,d are parameters of subdivision matrices, n - number of iterations, initial polygon is a triangle with vertices P[2]) 

`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
`:=`(Subdiv_2, proc (a, b, c, d, n) local B1, B2, P, F1, F2, f1, f2, f, p1, p2, p3, p4, p5; `:=`(B1, Matrix([[1, 0, 0], [a, `+`(1, `-`(a)), 0], [c, d, `+`(1, `-`(c), `-`(d))]])); `:=`(B2, Matrix([[c, ...
 

 

3. Examples 

Examples 3.1 

Below we obtain several curves using different parameters u and v  

 

 

Subdiv_1(`/`(1, 3), `/`(1, 3), 8) 

Plot_2d
 

 

 

Subdiv_1(`/`(1, 4), `/`(1, 4), 8) 

Plot_2d
 

 

 

Subdiv_1(`/`(1, 7), `/`(6, 7), 8) 

Plot_2d
 

 

 

Subdiv_1(`/`(4, 5), `/`(2, 3), 8) 

Plot_2d
 

 

Animations 

 

display(seq(Subdiv_1(`+`(`*`(`/`(1, 20), `*`(i))), `+`(`*`(`/`(1, 20), `*`(i))), 8), i = 0 .. 20), insequence = true) 

Plot_2d
 

 

 

display(seq(Subdiv_1(`+`(`*`(`/`(1, 20), `*`(i))), `+`(1, `-`(`*`(`/`(1, 20), `*`(i)))), 8), i = 0 .. 20), insequence = true) 

Plot_2d
 

 

Examples 3.2 

Below we obtain several curves using different parameters a,b,c,d  

 

 

Subdiv_2(`/`(1, 2), `/`(1, 2), `/`(1, 4), `/`(1, 2), 10) 

Plot_2d
 

 

 

Subdiv_2(`/`(2, 7), `/`(4, 5), `/`(1, 4), `/`(3, 5), 9) 

Plot_2d
 

 

Subdiv_2(`/`(2, 7), `/`(4, 7), `/`(2, 7), `/`(2, 7), 10) 

Plot_2d
 

 

Subdiv_2(`/`(1, 5), `/`(2, 3), `/`(2, 3), `/`(1, 7), 10) 

Plot_2d
 

 

Animations 

 

display(seq(Subdiv_2(`/`(1, 5), `/`(2, 5), `/`(2, 5), `+`(`*`(`/`(1, 20), `*`(i))), 10), i = 1 .. 10), insequence = true) 

Plot_2d
 

 

display(seq(Subdiv_2(`/`(1, 5), `/`(2, 5), `/`(2, 5), `/`(1, 5), i), i = 0 .. 10), insequence = true) 

Plot_2d
 

 

 

4. Final Remarks 

 

Analysing presented above examples one can observe that a great variety of curves it is possibly to generate basing on three control points using subdivision matrices. All obtained curves and fractal shapes are contained in the convex hull of three control points i.e.they lie  inside the triangle with vertices  

From Computer Aided Design point of view only smooth curves e.g. B-splines and B?zier curves are interesting in practical applications. They are obtained using subdivision matrices for special choice of parameters. It should be pointed out that subdivision is a powerful approach because it offers very easy to implement algorithms that efficiently produce smooth curves or patches used in geometrical modeling of shapes.Considerations presented in this worksheet can be easily generalized to tensor patches generated with the help of the obtained curves. We would like to suggest those who are interested in subdivision and fractal generation of shapes to consult our earlier worksheets [4] - [7] or the monograph [8].   

5. References 

 

[1] Chaikin G., An algorithm for high-speed curve generation, Computer Graphics and Image Processing, Vol. 3, 346-349, 1974. 

[2] de Rham, G., Un peu de math?matiques `a propos d?une courbe plane. Elemente der Math. 2, 73?76, 89?97, 1947. 

[3] Goldman R., The Fractal Nature of B?zier Curves, Proceedings of the Geometric Modeling and Processing, April 13-15, 2004, Beijing, China, 3-11.
[4] Kotarski W., Lisowska A., On Fractal Modeling of Contours, Maplesoft, 2005,
http://www.maplesoft.com/applications/app_center_view.aspx?AID=1651. 

[5] Kotarski W.,  Lisowska A., Probabilistic Approach to Fractal Modeling of Shapes, Maplesoft, 2005, http://www.maplesoft.com/applications/app_center_view.aspx?AID=1657 .    .
[6] Kotarski W., Lisowska A., Fractal Teapot from Utah, Maplesoft, 2006,
http://www.maplesoft.com/applications/app_center_view.aspx?AID=1956.
[7]  Kotarski W., Lisowska A., Fractal Rendering of 3D Patches, Maplesoft, 2006,
http://www.maplesoft.com/applications/app_center_view.aspx?AID=1955.  

[8]  Kotarski W., Fractal modeling of Shapes, EXIT, Warsaw 2008, (in Polish). 

[9] Schaefer S., Levin D., Goldman R., Subdivision Schemes and Attractors, Eurographics Symposium on Geometry Processing, 171-180, 2005. 

[10]  van Overveld CWAM, Family of recursively defined curves related to the cubic Bezier curve, Computer Aided Design, Vol. 22, No. 9, 591-597, 1990. 

[11] Warren J., Weimer H., Subdivision Methods for Geometric Design: A Constructive Approach, Morgan Kaufmann, San Francisco, 2001.
 

 

 

Legal Notice: The copyright for this application is owned by the author(s). Neither Maplesoft nor the author are responsible for any errors contained within and are not liable for any damages resulting from the use of this material. This application is intended for non-commercial, non-profit use only. Contact the author for permission if you wish to use this application in for-profit activities.