[vtk-developers] Triangular patch interpolation

Lin M majcjc at gmail.com
Thu Aug 20 11:56:30 EDT 2015


Hi Dr. Thompson,

I have added image based tests for almost all vtkFiltersBezier related
class including BREP file reader, patch(simplicial) interpolation and point
projection for both curve and surface example.

I will complete required documents soon.

Best,
Lin

On Tue, Aug 18, 2015 at 8:23 PM, David Thompson <david.thompson at kitware.com>
wrote:

> Hi Lin,
>
> It has been a while since we talked about that, and I am not sure from
> looking at the method whether Pt is supposed to be the input or output. If
> the input, then it should be named something like coord instead of Pt. If
> the output, then you are correct, it should be a "double*" and the
> documentation should spell out how much memory it must point to. (Since in
> general the n-th derivative is a symmetric tensor of rank n, there are
> (n+1)(n+2)...(n+k-1)/(k-1) partial derivatives. This is related to Pascal's
> simplex. See
> https://en.wikipedia.org/wiki/Pascal%27s_pyramid#Parallels_to_Pascal.27s_triangle_and_Multinomial_Coefficients
>  and
> https://en.wikipedia.org/wiki/Differential_of_a_function#Higher-order_differentials
>  .)
>
> It is fine to have different methods for curves, surfaces, and volumes for
> now. As you can see in the links above, the general pattern is that the
> n-th total derivative is a tensor of all possible combinations of partial
> derivatives with respect to the 1, 2, or 3 parametric coordinates. Call the
> parametric coordinates r_i for i in {1, 2, 3} and say we are taking the
> n-th derivative of f. Then Python code to compute one possible ordering of
> the partial differentials in the output array would be
>
> def pdiff(i,n):
>     r=[]
>     if i == 1:
>         return [[n,],]
>     for x in range(n+1):
>         for y in pdiff(i-1,n-x):
>             r.append(y+[x,])
>     return r
>
> which returns a list of i-tuples that all sum to n. For example
>
> pdiff(2,1) returns [[1, 0], [0, 1]]
> pdiff(2,2) returns [[2, 0], [1, 1], [0, 2]]
>
> pdiff(3,1) returns [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
> pdiff(3,2) returns [[2, 0, 0], [1, 1, 0], [0, 2, 0], [1, 0, 1], [0, 1,
> 1], [0, 0, 2]]
>
> However, really only the first (Jacobian, a vector) and second (Hessian, a
> symmetric 3x3 matrix with 6 unique entries) derivatives are used very much
> because (a) the number of terms grows very fast with increasing derivative
> and (b) the first 2 derivatives are used widely for root-finding and
> curvature computation but further derivatives are not.
>
>     David
>
> On Aug 17, 2015, at 22:40, Lin M <majcjc at gmail.com> wrote:
>
> Hi Dr. Thompson,
>
> I found you left an interface for
> vtkBezierPatchAdaptro::EvaluateDeriv(double Pt[3], double* Paras, int d).
> For 1-d curve, the derivative is always a 3*1 vector, but with the
> parametric dimension increasing, higher order derivatives will contain
> many points (it becomes matrix-by-vector differential). I can't figure out
> a generalized way to interpret this. That's why I declared functions to
> compute derivative for curve, surface and volume separately. Do you have
> any suggestions for that? Thanks!
>
> Best,
> Lin
>
> On Tue, Aug 18, 2015 at 1:04 AM, David Thompson <
> david.thompson at kitware.com> wrote:
>
>> Hi Lin,
>>
>> > I have some questions about the test.
>> > 1. About simplicial interpolation. Should I test some simple cases
>> (hard coded simple shape) or some shapes like the motorcycle?
>>
>> Those are 2 different types of tests. (There are many; see
>> http://stackoverflow.com/questions/437897/what-are-unit-testing-and-integration-testing-and-what-other-types-of-testing-s
>> for some lists of test types). The first test (simple hard-coded shape) is
>> a unit test and the second (test of both the reader, spline-to-patch class,
>> and patch interpolation) is an integration test.
>>
>> Both are important, but since you already have an integration test for
>> the motorcycle, I think a good set of unit tests for simplicial
>> interpolation would be enough.
>>
>> > If it is the latter one, how to convert the rectangular patch to
>> simpicial patch?
>> >
>> > 2. About point inversion. How to test it for the simpicial patch? I
>> only implemented the point inversion for NURBS patch.
>>
>> If you didn't implement it, you can't test it. :-) However, if you know
>> what you want the test to look like, you can write the test before you
>> implement inversion and just leave it commented out with a note. Many
>> people think this is how development should be done in the first place,
>> since it forces you to consider how people will use what you write.
>>
>> > 3. About derivative computation. Should I just test them numerically?
>> For example, given a shape and a parametric coordinate, test the result of
>> our implementation with ground truth.
>>
>> Again, since you are using the derivatives in code that is part of an
>> integration, I think unit testing (as you suggest) is enough.
>>
>>         David
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtk-developers/attachments/20150820/23cf781a/attachment.html>


More information about the vtk-developers mailing list