Drawing De Boor's algorithm
Assume we have 4 control points $[c_0, c_1, c_2, c_3]$ and uniform knot sequence $[0,1,2,3]$
If we were to draw an quadratic bezier we would be forced to use only 3 of the control points and then we would execute De Castlejeau's algorithm which can be sumarized as:
- Take $0 leq t leq 1$ now find the point on the line $[c_0, c_1]$ that is $t$ precent in between that segment and mark it $c'_0$.
- Do the same for the segment $[c_1, c_2]$ and mark the new point $c'_1$
- Find the point that is $t$ percent along the segment $[c'_0, c'_1]$ and mark it $c''_0$
And we are done.
For de boor's algorithm the percent changes, since on the first level we look at consecutive knots in the interval, then at knots separated by one value, then knots separated by 2 values...
I am not sure why, but I am having a really hard time walking myself through the algorithm.
So assuming infinitely many control points and infinitely many uniform knots (separated by a distance of 1) (to avoid boundary conditions).
Can someone please do a step by step explanation of drawing De Boors algorithm for a quadratic B-spline and an arbitrary parameter t assumed to be in the interval $[i, i+1]$?
geometry polynomials curves spline bezier-curve
add a comment |
Assume we have 4 control points $[c_0, c_1, c_2, c_3]$ and uniform knot sequence $[0,1,2,3]$
If we were to draw an quadratic bezier we would be forced to use only 3 of the control points and then we would execute De Castlejeau's algorithm which can be sumarized as:
- Take $0 leq t leq 1$ now find the point on the line $[c_0, c_1]$ that is $t$ precent in between that segment and mark it $c'_0$.
- Do the same for the segment $[c_1, c_2]$ and mark the new point $c'_1$
- Find the point that is $t$ percent along the segment $[c'_0, c'_1]$ and mark it $c''_0$
And we are done.
For de boor's algorithm the percent changes, since on the first level we look at consecutive knots in the interval, then at knots separated by one value, then knots separated by 2 values...
I am not sure why, but I am having a really hard time walking myself through the algorithm.
So assuming infinitely many control points and infinitely many uniform knots (separated by a distance of 1) (to avoid boundary conditions).
Can someone please do a step by step explanation of drawing De Boors algorithm for a quadratic B-spline and an arbitrary parameter t assumed to be in the interval $[i, i+1]$?
geometry polynomials curves spline bezier-curve
add a comment |
Assume we have 4 control points $[c_0, c_1, c_2, c_3]$ and uniform knot sequence $[0,1,2,3]$
If we were to draw an quadratic bezier we would be forced to use only 3 of the control points and then we would execute De Castlejeau's algorithm which can be sumarized as:
- Take $0 leq t leq 1$ now find the point on the line $[c_0, c_1]$ that is $t$ precent in between that segment and mark it $c'_0$.
- Do the same for the segment $[c_1, c_2]$ and mark the new point $c'_1$
- Find the point that is $t$ percent along the segment $[c'_0, c'_1]$ and mark it $c''_0$
And we are done.
For de boor's algorithm the percent changes, since on the first level we look at consecutive knots in the interval, then at knots separated by one value, then knots separated by 2 values...
I am not sure why, but I am having a really hard time walking myself through the algorithm.
So assuming infinitely many control points and infinitely many uniform knots (separated by a distance of 1) (to avoid boundary conditions).
Can someone please do a step by step explanation of drawing De Boors algorithm for a quadratic B-spline and an arbitrary parameter t assumed to be in the interval $[i, i+1]$?
geometry polynomials curves spline bezier-curve
Assume we have 4 control points $[c_0, c_1, c_2, c_3]$ and uniform knot sequence $[0,1,2,3]$
If we were to draw an quadratic bezier we would be forced to use only 3 of the control points and then we would execute De Castlejeau's algorithm which can be sumarized as:
- Take $0 leq t leq 1$ now find the point on the line $[c_0, c_1]$ that is $t$ precent in between that segment and mark it $c'_0$.
- Do the same for the segment $[c_1, c_2]$ and mark the new point $c'_1$
- Find the point that is $t$ percent along the segment $[c'_0, c'_1]$ and mark it $c''_0$
And we are done.
For de boor's algorithm the percent changes, since on the first level we look at consecutive knots in the interval, then at knots separated by one value, then knots separated by 2 values...
I am not sure why, but I am having a really hard time walking myself through the algorithm.
So assuming infinitely many control points and infinitely many uniform knots (separated by a distance of 1) (to avoid boundary conditions).
Can someone please do a step by step explanation of drawing De Boors algorithm for a quadratic B-spline and an arbitrary parameter t assumed to be in the interval $[i, i+1]$?
geometry polynomials curves spline bezier-curve
geometry polynomials curves spline bezier-curve
asked Dec 9 at 0:18
Makogan
751217
751217
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
First of all, any quadratic B-spline basis function is determined by 4 knots. Hence to have 4 control points you need 7 knots. Say they are $(1,2,3,4,5,6,7)$. Each basis function can be represented by the subsequence of knots which are used for computing it. They are $(1,2,3,4)$, $(2,3,4,5)$, $(3,4,5,6)$, $(4,5,6,7)$ and correspond to the control points $c_1$, $c_2$, $c_3$, $c_4$.
The range of the independent variable is only $xin[3,5]$, because only within this interval do the basis functions sum to $1$. E.g. at $x=2.9$ the sum is less than $1$, because if the knot vector is extended by one more knot at the beginning, then a new basis function arises (represented by $(k_{new},1,2,3)$) for which $x=2.9$ is interior (implying that the basis function is nonzero at $x=2.9$).
Say you want to evaluate the curve at $x=3.2$. To find $c_0'$, $c_1'$, and $c_2'$ do the following:
For all but the first basis function subtract $x$ from the 2nd last knot of its representation.
The result is $w_1=(0.8,1.8,2.8)$For all but the last basis function subtract the 2nd knot of its representation from $x$.
The result is $w_2=(1.2,0.2,-0.8)$
$c_0'$ is the weighted average of $c_0$ and $c_1$ with weights $0.8$ and $1.2$
$c_1'$ is the weighted average of $c_1$ and $c_2$ with weights $1.8$ and $0.2$
$c_2'$ is is irrelevant because a negative weight appears.- Consider the representations $(1,2,3,4)$, $(2,3,4,5)$, $(3,4,5,6)$, $(4,5,6,7)$.
Remove the first one and the last knot of each (or the other way around).
The result is $(2,3,4)$, $(3,4,5)$, $(4,5,6)$ which correspond to $c_0'$, $c_1'$, $c_2'$.
Repeat the steps to obtain $c_0''$, $c_1''$. After "degree" repetitions all but one control point will have been ruled out. The remaining ($c_0''$ or $c_1''$ in the quadratic case) is the point on the curve.
In step 3, if you get a pair of weights equal to $(0,0)$, then the curve is discontinuous. I suggest taking the arithmetic mean of the control points in that instance.
Note that the first and the last knot are never used. They only affect those basis functions outside the range of $x$ (where the basis isn't a partition of unity).
I found this image on google which I think explains the algorithm very clearly:
Which software did you use to make the diagram?
– Makogan
Dec 11 at 21:46
@Makogan It's from fussy.web.fc2.com/algo/curve3_b-spline.htm
– MeMyselfI
Dec 12 at 9:13
oh man, time to learn if my japanese courses payed off.
– Makogan
Dec 12 at 14:55
add a comment |
Look up "blossoming" or "polar forms". Blossoming provides (among other things) a good way to label points. The labeling properly reflects the fact that new points are linear (affine) combinations of old ones, and the geometry of the de Casteljau and deBoor algorithms becomes very clear. One of the first descriptions of this technique was Lyle Ramshaw's report entitled "Blossoming: A Connect-the-Dots Approach to Splines", written in 1987. It contains many pictures that will probably help you.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
});
});
}, "mathjax-editing");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "69"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
noCode: true, onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f3031846%2fdrawing-de-boors-algorithm%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
First of all, any quadratic B-spline basis function is determined by 4 knots. Hence to have 4 control points you need 7 knots. Say they are $(1,2,3,4,5,6,7)$. Each basis function can be represented by the subsequence of knots which are used for computing it. They are $(1,2,3,4)$, $(2,3,4,5)$, $(3,4,5,6)$, $(4,5,6,7)$ and correspond to the control points $c_1$, $c_2$, $c_3$, $c_4$.
The range of the independent variable is only $xin[3,5]$, because only within this interval do the basis functions sum to $1$. E.g. at $x=2.9$ the sum is less than $1$, because if the knot vector is extended by one more knot at the beginning, then a new basis function arises (represented by $(k_{new},1,2,3)$) for which $x=2.9$ is interior (implying that the basis function is nonzero at $x=2.9$).
Say you want to evaluate the curve at $x=3.2$. To find $c_0'$, $c_1'$, and $c_2'$ do the following:
For all but the first basis function subtract $x$ from the 2nd last knot of its representation.
The result is $w_1=(0.8,1.8,2.8)$For all but the last basis function subtract the 2nd knot of its representation from $x$.
The result is $w_2=(1.2,0.2,-0.8)$
$c_0'$ is the weighted average of $c_0$ and $c_1$ with weights $0.8$ and $1.2$
$c_1'$ is the weighted average of $c_1$ and $c_2$ with weights $1.8$ and $0.2$
$c_2'$ is is irrelevant because a negative weight appears.- Consider the representations $(1,2,3,4)$, $(2,3,4,5)$, $(3,4,5,6)$, $(4,5,6,7)$.
Remove the first one and the last knot of each (or the other way around).
The result is $(2,3,4)$, $(3,4,5)$, $(4,5,6)$ which correspond to $c_0'$, $c_1'$, $c_2'$.
Repeat the steps to obtain $c_0''$, $c_1''$. After "degree" repetitions all but one control point will have been ruled out. The remaining ($c_0''$ or $c_1''$ in the quadratic case) is the point on the curve.
In step 3, if you get a pair of weights equal to $(0,0)$, then the curve is discontinuous. I suggest taking the arithmetic mean of the control points in that instance.
Note that the first and the last knot are never used. They only affect those basis functions outside the range of $x$ (where the basis isn't a partition of unity).
I found this image on google which I think explains the algorithm very clearly:
Which software did you use to make the diagram?
– Makogan
Dec 11 at 21:46
@Makogan It's from fussy.web.fc2.com/algo/curve3_b-spline.htm
– MeMyselfI
Dec 12 at 9:13
oh man, time to learn if my japanese courses payed off.
– Makogan
Dec 12 at 14:55
add a comment |
First of all, any quadratic B-spline basis function is determined by 4 knots. Hence to have 4 control points you need 7 knots. Say they are $(1,2,3,4,5,6,7)$. Each basis function can be represented by the subsequence of knots which are used for computing it. They are $(1,2,3,4)$, $(2,3,4,5)$, $(3,4,5,6)$, $(4,5,6,7)$ and correspond to the control points $c_1$, $c_2$, $c_3$, $c_4$.
The range of the independent variable is only $xin[3,5]$, because only within this interval do the basis functions sum to $1$. E.g. at $x=2.9$ the sum is less than $1$, because if the knot vector is extended by one more knot at the beginning, then a new basis function arises (represented by $(k_{new},1,2,3)$) for which $x=2.9$ is interior (implying that the basis function is nonzero at $x=2.9$).
Say you want to evaluate the curve at $x=3.2$. To find $c_0'$, $c_1'$, and $c_2'$ do the following:
For all but the first basis function subtract $x$ from the 2nd last knot of its representation.
The result is $w_1=(0.8,1.8,2.8)$For all but the last basis function subtract the 2nd knot of its representation from $x$.
The result is $w_2=(1.2,0.2,-0.8)$
$c_0'$ is the weighted average of $c_0$ and $c_1$ with weights $0.8$ and $1.2$
$c_1'$ is the weighted average of $c_1$ and $c_2$ with weights $1.8$ and $0.2$
$c_2'$ is is irrelevant because a negative weight appears.- Consider the representations $(1,2,3,4)$, $(2,3,4,5)$, $(3,4,5,6)$, $(4,5,6,7)$.
Remove the first one and the last knot of each (or the other way around).
The result is $(2,3,4)$, $(3,4,5)$, $(4,5,6)$ which correspond to $c_0'$, $c_1'$, $c_2'$.
Repeat the steps to obtain $c_0''$, $c_1''$. After "degree" repetitions all but one control point will have been ruled out. The remaining ($c_0''$ or $c_1''$ in the quadratic case) is the point on the curve.
In step 3, if you get a pair of weights equal to $(0,0)$, then the curve is discontinuous. I suggest taking the arithmetic mean of the control points in that instance.
Note that the first and the last knot are never used. They only affect those basis functions outside the range of $x$ (where the basis isn't a partition of unity).
I found this image on google which I think explains the algorithm very clearly:
Which software did you use to make the diagram?
– Makogan
Dec 11 at 21:46
@Makogan It's from fussy.web.fc2.com/algo/curve3_b-spline.htm
– MeMyselfI
Dec 12 at 9:13
oh man, time to learn if my japanese courses payed off.
– Makogan
Dec 12 at 14:55
add a comment |
First of all, any quadratic B-spline basis function is determined by 4 knots. Hence to have 4 control points you need 7 knots. Say they are $(1,2,3,4,5,6,7)$. Each basis function can be represented by the subsequence of knots which are used for computing it. They are $(1,2,3,4)$, $(2,3,4,5)$, $(3,4,5,6)$, $(4,5,6,7)$ and correspond to the control points $c_1$, $c_2$, $c_3$, $c_4$.
The range of the independent variable is only $xin[3,5]$, because only within this interval do the basis functions sum to $1$. E.g. at $x=2.9$ the sum is less than $1$, because if the knot vector is extended by one more knot at the beginning, then a new basis function arises (represented by $(k_{new},1,2,3)$) for which $x=2.9$ is interior (implying that the basis function is nonzero at $x=2.9$).
Say you want to evaluate the curve at $x=3.2$. To find $c_0'$, $c_1'$, and $c_2'$ do the following:
For all but the first basis function subtract $x$ from the 2nd last knot of its representation.
The result is $w_1=(0.8,1.8,2.8)$For all but the last basis function subtract the 2nd knot of its representation from $x$.
The result is $w_2=(1.2,0.2,-0.8)$
$c_0'$ is the weighted average of $c_0$ and $c_1$ with weights $0.8$ and $1.2$
$c_1'$ is the weighted average of $c_1$ and $c_2$ with weights $1.8$ and $0.2$
$c_2'$ is is irrelevant because a negative weight appears.- Consider the representations $(1,2,3,4)$, $(2,3,4,5)$, $(3,4,5,6)$, $(4,5,6,7)$.
Remove the first one and the last knot of each (or the other way around).
The result is $(2,3,4)$, $(3,4,5)$, $(4,5,6)$ which correspond to $c_0'$, $c_1'$, $c_2'$.
Repeat the steps to obtain $c_0''$, $c_1''$. After "degree" repetitions all but one control point will have been ruled out. The remaining ($c_0''$ or $c_1''$ in the quadratic case) is the point on the curve.
In step 3, if you get a pair of weights equal to $(0,0)$, then the curve is discontinuous. I suggest taking the arithmetic mean of the control points in that instance.
Note that the first and the last knot are never used. They only affect those basis functions outside the range of $x$ (where the basis isn't a partition of unity).
I found this image on google which I think explains the algorithm very clearly:
First of all, any quadratic B-spline basis function is determined by 4 knots. Hence to have 4 control points you need 7 knots. Say they are $(1,2,3,4,5,6,7)$. Each basis function can be represented by the subsequence of knots which are used for computing it. They are $(1,2,3,4)$, $(2,3,4,5)$, $(3,4,5,6)$, $(4,5,6,7)$ and correspond to the control points $c_1$, $c_2$, $c_3$, $c_4$.
The range of the independent variable is only $xin[3,5]$, because only within this interval do the basis functions sum to $1$. E.g. at $x=2.9$ the sum is less than $1$, because if the knot vector is extended by one more knot at the beginning, then a new basis function arises (represented by $(k_{new},1,2,3)$) for which $x=2.9$ is interior (implying that the basis function is nonzero at $x=2.9$).
Say you want to evaluate the curve at $x=3.2$. To find $c_0'$, $c_1'$, and $c_2'$ do the following:
For all but the first basis function subtract $x$ from the 2nd last knot of its representation.
The result is $w_1=(0.8,1.8,2.8)$For all but the last basis function subtract the 2nd knot of its representation from $x$.
The result is $w_2=(1.2,0.2,-0.8)$
$c_0'$ is the weighted average of $c_0$ and $c_1$ with weights $0.8$ and $1.2$
$c_1'$ is the weighted average of $c_1$ and $c_2$ with weights $1.8$ and $0.2$
$c_2'$ is is irrelevant because a negative weight appears.- Consider the representations $(1,2,3,4)$, $(2,3,4,5)$, $(3,4,5,6)$, $(4,5,6,7)$.
Remove the first one and the last knot of each (or the other way around).
The result is $(2,3,4)$, $(3,4,5)$, $(4,5,6)$ which correspond to $c_0'$, $c_1'$, $c_2'$.
Repeat the steps to obtain $c_0''$, $c_1''$. After "degree" repetitions all but one control point will have been ruled out. The remaining ($c_0''$ or $c_1''$ in the quadratic case) is the point on the curve.
In step 3, if you get a pair of weights equal to $(0,0)$, then the curve is discontinuous. I suggest taking the arithmetic mean of the control points in that instance.
Note that the first and the last knot are never used. They only affect those basis functions outside the range of $x$ (where the basis isn't a partition of unity).
I found this image on google which I think explains the algorithm very clearly:
answered Dec 11 at 17:53
MeMyselfI
567219
567219
Which software did you use to make the diagram?
– Makogan
Dec 11 at 21:46
@Makogan It's from fussy.web.fc2.com/algo/curve3_b-spline.htm
– MeMyselfI
Dec 12 at 9:13
oh man, time to learn if my japanese courses payed off.
– Makogan
Dec 12 at 14:55
add a comment |
Which software did you use to make the diagram?
– Makogan
Dec 11 at 21:46
@Makogan It's from fussy.web.fc2.com/algo/curve3_b-spline.htm
– MeMyselfI
Dec 12 at 9:13
oh man, time to learn if my japanese courses payed off.
– Makogan
Dec 12 at 14:55
Which software did you use to make the diagram?
– Makogan
Dec 11 at 21:46
Which software did you use to make the diagram?
– Makogan
Dec 11 at 21:46
@Makogan It's from fussy.web.fc2.com/algo/curve3_b-spline.htm
– MeMyselfI
Dec 12 at 9:13
@Makogan It's from fussy.web.fc2.com/algo/curve3_b-spline.htm
– MeMyselfI
Dec 12 at 9:13
oh man, time to learn if my japanese courses payed off.
– Makogan
Dec 12 at 14:55
oh man, time to learn if my japanese courses payed off.
– Makogan
Dec 12 at 14:55
add a comment |
Look up "blossoming" or "polar forms". Blossoming provides (among other things) a good way to label points. The labeling properly reflects the fact that new points are linear (affine) combinations of old ones, and the geometry of the de Casteljau and deBoor algorithms becomes very clear. One of the first descriptions of this technique was Lyle Ramshaw's report entitled "Blossoming: A Connect-the-Dots Approach to Splines", written in 1987. It contains many pictures that will probably help you.
add a comment |
Look up "blossoming" or "polar forms". Blossoming provides (among other things) a good way to label points. The labeling properly reflects the fact that new points are linear (affine) combinations of old ones, and the geometry of the de Casteljau and deBoor algorithms becomes very clear. One of the first descriptions of this technique was Lyle Ramshaw's report entitled "Blossoming: A Connect-the-Dots Approach to Splines", written in 1987. It contains many pictures that will probably help you.
add a comment |
Look up "blossoming" or "polar forms". Blossoming provides (among other things) a good way to label points. The labeling properly reflects the fact that new points are linear (affine) combinations of old ones, and the geometry of the de Casteljau and deBoor algorithms becomes very clear. One of the first descriptions of this technique was Lyle Ramshaw's report entitled "Blossoming: A Connect-the-Dots Approach to Splines", written in 1987. It contains many pictures that will probably help you.
Look up "blossoming" or "polar forms". Blossoming provides (among other things) a good way to label points. The labeling properly reflects the fact that new points are linear (affine) combinations of old ones, and the geometry of the de Casteljau and deBoor algorithms becomes very clear. One of the first descriptions of this technique was Lyle Ramshaw's report entitled "Blossoming: A Connect-the-Dots Approach to Splines", written in 1987. It contains many pictures that will probably help you.
edited Dec 17 at 10:32
answered Dec 17 at 10:22
bubba
30k32986
30k32986
add a comment |
add a comment |
Thanks for contributing an answer to Mathematics Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f3031846%2fdrawing-de-boors-algorithm%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown