tangent of spline point



  • On 05/05/2013 at 10:55, xxxxxxxx wrote:

    thank you. i didnt try GetTangentW, because in the sdk it says that it returns the first element. now i get the tangents. however, i had the hope to use the tangents to create a correctly offset position for the points. but, in liniear splines there are no tangents. how can i calculate the direction for the offset so that positive values go into one direction, and negative values go to the opposite direction? (see image)

    i did it like this:

    Vector winkel = VectorToHPB(p2-p1);
    Matrix richtung = HPBToMatrix(winkel, ROTATIONORDER_DEFAULT);

    however, that resulted in point offsets to unwanted directions, like if you changed the green and red for only some of the points in the image. thats why i thought using the tangents could help..

    maybe there is another solution?

    cheers,
    Ello



  • On 05/05/2013 at 11:57, xxxxxxxx wrote:

    If I wanted to move the points of a spline.
    This is the way I'd do it:

    #include "lib_splinehelp.h"  
      
      
      BaseDocument *doc = GetActiveDocument();  
      BaseObject *spline = doc->SearchObject("Spline");  
      PointObject *sp = ToPoint(spline);  
      
      AutoAlloc<SplineHelp> sh;  
      if(!sh) return FALSE;  
      sh->InitSpline(sp);  
      if(!sh->Exists()) return FALSE;  
      
      Vector *spPnts = sp->GetPointW();           //Get all the points in the spline  
      
      Real offsetX = 100.0;  
      Real offsetY = 100.0;                       //Some offset values that can be bound to GUI gizmos  
      Real offsetZ = 100.0;  
      
      LONG pntCnt = sh->GetPointCount();  
      for(LONG i=0; i<pntCnt; i++)  
      {  
          spPnts[i].x += offsetX;  
          spPnts[i].y += offsetY;                 //Move all the points in the spline by this offset amount  
          spPnts[i].z += offsetZ;  
      }  
      
      sp->Message(MSG_UPDATE);                    //Update the changes made to the spline
    

    -ScottA



  • On 06/05/2013 at 00:15, xxxxxxxx wrote:

    yes, i know how to move points, but how do i get the direction when there is no tangent and when  i need to take care that the points need to move all relatively to the right or left side of the spline.. thats the main problem i have here



  • On 06/05/2013 at 03:07, xxxxxxxx wrote:

    You can get the bisecting vector of a point by calculating the arithmetic middle of the adjacent points.



  • On 06/05/2013 at 04:26, xxxxxxxx wrote:

    i guess you mean something like

    tRot = Vector((getAngle(points[i-1],points[i]).x+getAngle(points[i+1],points[i]).x)/2,0,0);
      
    Matrix richtung = HPBToMatrix(tRot, ROTATIONORDER_DEFAULT);
    tPos += Vector(0,0,_ipOffset)*richtung;
    

    this still makes some objects move to the one direction end others to the opposite direction...



  • On 06/05/2013 at 14:13, xxxxxxxx wrote:

    double post, sorry.



  • On 06/05/2013 at 14:15, xxxxxxxx wrote:

    Not exactly. But I expressed myself not 100% correct. You can get a point that lies on the bisecting
    line this way:

    p1 = points[i]
    p2 = (points[i - 1] + points[i + 1]) * (1 / 2.0)   // I think division is not supported by the vector class
    bv = (p2 - p1).GetNormalized()
    

    Then again you can cross it with one of the adjacent lines and cross it
    again and you have the tangent:

    n = bv.Cross(points[i] - points[i - 1])
    tangent = bv.Cross(n)
    

    Best,
    Niklas



  • On 06/05/2013 at 21:32, xxxxxxxx wrote:

    thank you niklas. i'll try if this helps me solve my problem and report back...



  • On 07/05/2013 at 01:44, xxxxxxxx wrote:

    hm, this still produces the wrong direction for some points. i have no idea how to get this working...



  • On 07/05/2013 at 03:18, xxxxxxxx wrote:

    Hi ello,

    here, some example code quickly plucked together.

    import c4d
      
    class Tag(c4d.plugins.TagData) :
      
        SIZE_SPHERE = c4d.Vector(10)
        COLOR_SPHERE = c4d.Vector(1, 0.66, 0.02)
      
        LENGTH_TANGENT = 20
        COLOR_TANGENT = c4d.Vector(0.1, 0.95, 0.5)
      
        def Draw(self, tag, op, bd, bh) :
      
            if not isinstance(op, c4d.SplineObject) :
                return True
      
            bd.SetMatrix_Matrix(op, op.GetMg())
            segments = [op.GetSegment(i) for i in xrange(op.GetSegmentCount())]
            if not segments:
                segments = [{'cnt': op.GetPointCount(), 'closed': op.IsClosed()}]
      
            pi = 0
            for segment in segments:
                cnt = segment['cnt']
                closed = segment['closed']
      
                start = pi
                end = pi + cnt
                i_start = start
                i_end = end
                if not closed:
                    i_start += 1
                    i_end -= 1
      
                    bd.DrawSphere(op.GetPoint(pi), self.SIZE_SPHERE, self.COLOR_SPHERE, 0)
                    bd.DrawSphere(op.GetPoint(pi + cnt - 1), self.SIZE_SPHERE, self.COLOR_SPHERE, 0)
      
                bd.SetPen(self.COLOR_TANGENT)
                if start < end:
                    for i in xrange(i_start, i_end, 1) :
                        left = i - 1
                        right = i + 1
      
                        if left < start:
                            left = end - 1
                        if right >= end:
                            right = start
      
                        print left, i, right
      
                        pleft = op.GetPoint(left)
                        pright = op.GetPoint(right)
                        point = op.GetPoint(i)
      
                        mid = (pleft + pright) * 0.5
                        bv = point - mid
                        n = bv.Cross(point - pleft)
                        tangent = n.Cross(bv).GetNormalized() * self.LENGTH_TANGENT
      
                        pmin = point - tangent
                        pmax = point + tangent
                        bd.DrawLine(pmin, pmax, 0)
      
                pi += cnt
      
            print "-------------------"
      
            return True
      
    if __name__ == "__main__":
        c4d.plugins.RegisterTagPlugin(100003, "Spline Tangents", c4d.TAG_VISIBLE, Tag, "Tsplinetangents", None)
    

    Best,
    -Niklas

    http://www.file-upload.net/download-7562607/spline-tangents.zip.html



  • On 07/05/2013 at 03:20, xxxxxxxx wrote:

    Originally posted by xxxxxxxx

    this still makes some objects move to the one direction end others to the opposite direction...

    Uhm, I just see: The result in the image is correct. What else did you expect?
    The only thing left would be to rotate them about 90° to get the actual tangent (see my example code).



  • On 07/05/2013 at 04:05, xxxxxxxx wrote:

    thank you very much, but when i rotate the direction the problem still remains. it just doesnt move left/right but back and forward.. still some point to the opposite..


Log in to reply