POV-Ray : Newsgroups : povray.advanced-users : bicubic bezier and hermite patches Server Time
29 Jul 2024 00:35:59 EDT (-0400)
  bicubic bezier and hermite patches (Message 11 to 13 of 13)  
<<< Previous 10 Messages Goto Initial 10 Messages
From: Sascha Ledinsky
Subject: Re: bicubic bezier and hermite patches
Date: 17 Mar 2004 14:18:37
Message: <4058a48d$1@news.povray.org>
I asked because I'm interested in generating (at least G1 continuous) patches 
over a mesh of splines (cubic bezier curves). It should allow for 3-, 4- and 
5-sided patches and different "levels of detail", i.e. two small patches, 
connecting seamlessly to one side of a larger patch.

If case of 4-sided patches the spline-mesh specifies 12 of the 16 
control-points, so I'm looking for a method to compute the missing 4 
control-points. Setting the twist vectors to 0 is fine if the mesh has only 
rectangular patches, but it leads to cracks when joining non-4-sided patches.

I thought that twist vectors might be easier to handle than bezier controlpoints.

Another thing related is splitting non-4-sided patches into 4-sided ones.

-sascha


andrel wrote:
> Ok, I wil put the generation of the four 16 by 16 matrices
> on my todo list. It may be a few days before I have some time
> to do it. If you have access to Matlab it will be even easier,
> then I could send you some of my scripts.
> 
> Further down on my list will be to create some macros for
> the conversion and even further down to create some
> tutorial pages on bicubic patches in POV and how to convert
> from one representation to the other (unless someone already
> did that of course).
> 
>     Andrel
> 
> Sascha Ledinsky wrote:
> 
>> As I was able to compute all but the four inner bezier controlpoints 
>> (or the hermite twist vectors) I searched the internet again and found 
>> the following equation to convert from bezier to hermite (or vice versa):
>>
>> d^2P/dudv(0,0) = 9(P00-P011+P10-P11)
>>
>> I'll have to try it, but it looks promising.
>>
>> Anyway, thanks a lot for your help!
>> -Sascha
>>
>>
>> andrel wrote:
>>
>>> Have you solved your ploblem yet.
>>>
>>> Today in the train I realized that my suggestion
>>> is correct, but that it is too much influenced by
>>> the fact that I do have a program to solve the inverse
>>> of a 16 by 16.
>>>
>>> Rethinking it from the perspective of: 'how would
>>> I solve this by hand?' often gives better results.
>>> - there are only three types of points in the (realized)
>>>  patch: corner points (4), side points (8) and center
>>>  poinys (4)
>>> - cornerpoints are in all representations the same, so
>>>  we do not have to apply any interpolation.
>>> - sidepoints are only influenced by the two cornerpoints
>>>  on that side and in case ot the bezier patch the control
>>>  points on that side, and in the hermite case by the
>>>  2 derivatives along the side. All in all we need 4
>>>  numbers only to do the conversion from one representation
>>>  to the other. We use symmetry to apply the same 4 to
>>>  every sidepoint of course.
>>> - For the center points we need only 16 numbers to
>>>  describe the conversions.
>>> All in al we need compute only 4+16 numbers to do
>>> all conversions. so the 16 by 16 matrix is a bit overkill
>>> (I will keep using it because it greatly somplifies
>>>  my code but that is another issue).
>>>
>>>   Andrel
>>> Sascha Ledinsky wrote:
>>>
>>>> I've got to delve into that.
>>>> Thanks a lot for your help!
>>>> -Sascha
>>>
>>>
>>>
>>>
>


Post a reply to this message

From: andrel
Subject: Re: bicubic bezier and hermite patches
Date: 17 Mar 2004 17:14:23
Message: <4058CD96.7040803@hotmail.com>
Sascha Ledinsky wrote:

> I asked because I'm interested in generating (at least G1 continuous) 
> patches over a mesh of splines (cubic bezier curves). It should allow 
> for 3-, 4- and 5-sided patches and different "levels of detail", i.e. 
> two small patches, connecting seamlessly to one side of a larger patch.
We have had a discussion about 3 and 5 sided polygons a couple
of weeks ago in a p-b-i tread called: Patches for arbitrary topology
shapes. As outlined there, there are some ways of generating n-sided
polygons with cubic sides and control over the tangent, so you can
make smooth surfaces combining them with bicubic patches. These are
not implemented in POV (yet) so you can not use them.

> If case of 4-sided patches the spline-mesh specifies 12 of the 16 
> control-points, so I'm looking for a method to compute the missing 4 
> control-points. 
For first order continuity the inner control points on both
sides of an edge and the control point on the edge should be on a
straight line. That does not completely specify the point, but
it severely restricts it at least.
> Setting the twist vectors to 0 is fine if the mesh has 
> only rectangular patches, but it leads to cracks when joining 
> non-4-sided patches.
> 
> I thought that twist vectors might be easier to handle than bezier 
> controlpoints.
No, especially not if you use non-4-sided patches. The Hermite
formulation is easiest in 4-sided and (I think) very complicated
otherwise.
Bezier is very easy to control. That is in fact why it is so
popular.
One way of creating a smooth surface actually consists of
manupulating only the inner 4 points of a patch and compute
the others by interpolating.
> Another thing related is splitting non-4-sided patches into 4-sided ones.
One obvious way to create a triangle with a bicubic patch is
to make two sides conform to the same cubic equation.
These two sides have 7 points that you will need to compute
from the 4 control points from the adjacent 4-sided patch.
Not very difficult, but there will probably be 'cracks' in
the surface as POV will internally convert them to smooth
triangles and it will not use the same points on both
patches. So this is not a good approach.
Another technique is to fuse the 4 control points on one
side into one point. With this technique you also lose the
symmetry, but you can always divide a triangle into three
smaller ones and restore it.


> -sascha
> 
> 
> andrel wrote:
> 
>> Ok, I wil put the generation of the four 16 by 16 matrices
>> on my todo list. It may be a few days before I have some time
>> to do it. If you have access to Matlab it will be even easier,
>> then I could send you some of my scripts.
>>
>> Further down on my list will be to create some macros for
>> the conversion and even further down to create some
>> tutorial pages on bicubic patches in POV and how to convert
>> from one representation to the other (unless someone already
>> did that of course).
>>
>>     Andrel
>>
>> Sascha Ledinsky wrote:
>>
>>> As I was able to compute all but the four inner bezier controlpoints 
>>> (or the hermite twist vectors) I searched the internet again and 
>>> found the following equation to convert from bezier to hermite (or 
>>> vice versa):
>>>
>>> d^2P/dudv(0,0) = 9(P00-P011+P10-P11)
>>>
>>> I'll have to try it, but it looks promising.
>>>
>>> Anyway, thanks a lot for your help!
>>> -Sascha
>>>
>>>
>>> andrel wrote:
>>>
>>>> Have you solved your ploblem yet.
>>>>
>>>> Today in the train I realized that my suggestion
>>>> is correct, but that it is too much influenced by
>>>> the fact that I do have a program to solve the inverse
>>>> of a 16 by 16.
>>>>
>>>> Rethinking it from the perspective of: 'how would
>>>> I solve this by hand?' often gives better results.
>>>> - there are only three types of points in the (realized)
>>>>  patch: corner points (4), side points (8) and center
>>>>  poinys (4)
>>>> - cornerpoints are in all representations the same, so
>>>>  we do not have to apply any interpolation.
>>>> - sidepoints are only influenced by the two cornerpoints
>>>>  on that side and in case ot the bezier patch the control
>>>>  points on that side, and in the hermite case by the
>>>>  2 derivatives along the side. All in all we need 4
>>>>  numbers only to do the conversion from one representation
>>>>  to the other. We use symmetry to apply the same 4 to
>>>>  every sidepoint of course.
>>>> - For the center points we need only 16 numbers to
>>>>  describe the conversions.
>>>> All in al we need compute only 4+16 numbers to do
>>>> all conversions. so the 16 by 16 matrix is a bit overkill
>>>> (I will keep using it because it greatly somplifies
>>>>  my code but that is another issue).
>>>>
>>>>   Andrel
>>>> Sascha Ledinsky wrote:
>>>>
>>>>> I've got to delve into that.
>>>>> Thanks a lot for your help!
>>>>> -Sascha
>>>>
>>>>
>>>>
>>>>
>>>>
>>


Post a reply to this message

From: andrel
Subject: Re: bicubic bezier and hermite patches
Date: 18 Mar 2004 11:56:01
Message: <4059D478.4020307@hotmail.com>
As promised here are some 16 by 16 matrices.

For the bezier control points (Bxy) I assume that they are numbered
from left to right and from top to bottom (just as POV does)
For the actual points (Axy) I take the values at a grid with 1/3
separation and counting from left to right and from top to bottom
i.e. A11=(0,0),A12=(1/3,0),A13=(2/3,0),A14=(1,0), A21=(0,1/3),
A22=(1/3,1/3),...A44=(1,1)
For the Hermite representation I use H11=u(0,0),H12=du(0,0)/dx,
H13=du(0,0)/dy,H14=d^2u(0,0)/dxdy,H21=u(1,0),...H44=d^2u(1,1)/dxdy

I have scaled all matrices by a factor such that all values
are integers in order not to loose accuracy.

This one is to convert from Bezier control points to grid points
(divide by 729)
So A11=B11, A12=8/27*B11+4/9*B12+2/9*B13+1/27*B14

  729,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
  216, 324, 162,  27,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
   27, 162, 324, 216,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
    0,   0,   0, 729,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
  216,   0,   0,   0, 324,   0,   0,   0, 162,   0,   0,   0,  27,   0, 
   0,   0,
   64,  96,  48,   8,  96, 144,  72,  12,  48,  72,  36,   6,   8,  12, 
   6,   1,
    8,  48,  96,  64,  12,  72, 144,  96,   6,  36,  72,  48,   1,   6, 
  12,   8,
    0,   0,   0, 216,   0,   0,   0, 324,   0,   0,   0, 162,   0,   0, 
   0,  27,
   27,   0,   0,   0, 162,   0,   0,   0, 324,   0,   0,   0, 216,   0, 
   0,   0,
    8,  12,   6,   1,  48,  72,  36,   6,  96, 144,  72,  12,  64,  96, 
  48,   8,
    1,   6,  12,   8,   6,  36,  72,  48,  12,  72, 144,  96,   8,  48, 
  96,  64,
    0,   0,   0,  27,   0,   0,   0, 162,   0,   0,   0, 324,   0,   0, 
   0, 216,
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 729,   0, 
   0,   0,
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 216, 324, 
162,  27,
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  27, 162, 
324, 216,
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0, 729,

This one is to convert from grid points to Bezier control points
(divide by 36)
So B11=A11, B12=-5/6*A11+3*A12-1.5*A13+1/3*A14
   36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
  -30, 108, -54,  12,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
   12, -54, 108, -30,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
    0,   0,   0,  36,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
  -30,   0,   0,   0, 108,   0,   0,   0, -54,   0,   0,   0,  12,   0, 
   0,   0,
   25, -90,  45, -10, -90, 324,-162,  36,  45,-162,  81, -18, -10,  36, 
-18,   4,
  -10,  45, -90,  25,  36,-162, 324, -90, -18,  81,-162,  45,   4, -18, 
  36, -10,
    0,   0,   0, -30,   0,   0,   0, 108,   0,   0,   0, -54,   0,   0, 
   0,  12,
   12,   0,   0,   0, -54,   0,   0,   0, 108,   0,   0,   0, -30,   0, 
   0,   0,
  -10,  36, -18,   4,  45,-162,  81, -18, -90, 324,-162,  36,  25, -90, 
  45, -10,
    4, -18,  36, -10, -18,  81,-162,  45,  36,-162, 324, -90, -10,  45, 
-90,  25,
    0,   0,   0,  12,   0,   0,   0, -54,   0,   0,   0, 108,   0,   0, 
   0, -30,
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  36,   0, 
   0,   0,
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, -30, 108, 
-54,  12,
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  12, -54, 
108, -30,
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,  36,

This one is to convert from Hermite representation to grid points
(divide by 729)
So A11=H11, A12=20/27*H11+4/27*H12+7/27*H21-2/27*H22
NB A14=H21

  729,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
  540, 108,   0,   0, 189, -54,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
  189,  54,   0,   0, 540,-108,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
    0,   0,   0,   0, 729,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
  540,   0, 108,   0,   0,   0,   0,   0, 189,   0, -54,   0,   0,   0, 
   0,   0,
  400,  80,  80,  16, 140, -40,  28,  -8, 140,  28, -40,  -8,  49, -14, 
-14,   4,
  140,  40,  28,   8, 400, -80,  80, -16,  49,  14, -14,  -4, 140, -28, 
-40,   8,
    0,   0,   0,   0, 540,   0, 108,   0,   0,   0,   0,   0, 189,   0, 
-54,   0,
  189,   0,  54,   0,   0,   0,   0,   0, 540,   0,-108,   0,   0,   0, 
   0,   0,
  140,  28,  40,   8,  49, -14,  14,  -4, 400,  80, -80, -16, 140, -40, 
-28,   8,
   49,  14,  14,   4, 140, -28,  40,  -8, 140,  40, -28,  -8, 400, -80, 
-80,  16,
    0,   0,   0,   0, 189,   0,  54,   0,   0,   0,   0,   0, 540, 
0,-108,   0,
    0,   0,   0,   0,   0,   0,   0,   0, 729,   0,   0,   0,   0,   0, 
   0,   0,
    0,   0,   0,   0,   0,   0,   0,   0, 540, 108,   0,   0, 189, -54, 
   0,   0,
    0,   0,   0,   0,   0,   0,   0,   0, 189,  54,   0,   0, 540,-108, 
   0,   0,
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 729,   0, 
   0,   0,

Finally, this one is to convert from grid points to Hermite
representation (divide by 4)
So H11=A11, H12=-11/2*A11+9*A12-9/2*A13+H14
    4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
  -22,  36, -18,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
  -22,   0,   0,   0,  36,   0,   0,   0, -18,   0,   0,   0,   4,   0, 
   0,   0,
  121,-198,  99, -22,-198, 324,-162,  36,  99,-162,  81, -18, -22,  36, 
-18,   4,
    0,   0,   0,   4,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
   -4,  18, -36,  22,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   0,
    0,   0,   0, -22,   0,   0,   0,  36,   0,   0,   0, -18,   0,   0, 
   0,   4,
   22, -99, 198,-121, -36, 162,-324, 198,  18, -81, 162, -99,  -4,  18, 
-36,  22,
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   4,   0, 
   0,   0,
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, -22,  36, 
-18,   4,
   -4,   0,   0,   0,  18,   0,   0,   0, -36,   0,   0,   0,  22,   0, 
   0,   0,
   22, -36,  18,  -4, -99, 162, -81,  18, 198,-324, 162, -36,-121, 198, 
-99,  22,
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 
   0,   4,
    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  -4,  18, 
-36,  22,
    0,   0,   0,  -4,   0,   0,   0,  18,   0,   0,   0, -36,   0,   0, 
   0,  22,
    4, -18,  36, -22, -18,  81,-162,  99,  36,-162, 324,-198, -22, 
99,-198, 121,

I hope the meaning of these grids is clear (and I did not make any
stupid mistakes). I think it is obvious why I should have made some
macro's ;)

	Andrel


Post a reply to this message

<<< Previous 10 Messages Goto Initial 10 Messages

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.