Subversion Repositories DIN Is Noise

Rev

Rev 2197 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
* curve.h
* DIN Is Noise is copyright (c) 2006-2025 Jagannathan Sampath
* DIN Is Noise is released under GNU Public License 2.0
* For more information, please visit https://dinisnoise.org/
*/



#ifndef __CURVE__
#define __CURVE__

#include <list>
#include <vector>

#include "crvpt.h"
#include "point.h"

struct curve {

  float x0, y0, x1, y1; // start/end points
  float tx0, ty0, tx1, ty1; // start/end tangents
  float ptx0, pty0; // start point to tangent vector
  float ptx1, pty1; // end point to tangent vector

  std::vector<crvpt> vpts; // bezier curve points for draw & solve
  std::vector<crvpt> dpts; // shapeform points (see multi_curve.h/cc)

  curve ();
  curve (float x0, float y0, float x1, float y1, float tx0, float ty0, float tx1, float ty1, float d = 0);
   
  /*
   * din generates points on the bezier curve using recursive subdivision:
   *
   * find midpoint of line joining end points
   * if distance between midpoint on this line and point on the bezier curve > limit
   * insert point and repeat else stop
  */

 
  float limit2; // square of limit
  void set_limit (float l);

  // evaluation generates points of the curve
  //
  int eval;
  void evaluate (int find_length = 0);

  inline void vertex (int i, float xv, float yv) {
    if (i) {
      x1 = xv;
      y1 = yv;
      ptx1 = tx1 - x1;
      pty1 = ty1 - y1;
    } else {
      x0 = xv;
      y0 = yv;
      ptx0 = tx0 - x0;
      pty0 = ty0 - y0;
    }
    eval = 1;
  }

  inline void get_vertex (int i, float& xv, float& yv) {
    if (i) {
      xv = x1;
      yv = y1;
    } else {
      xv = x0;
      yv = y0;
    }
  }

  inline void tangent (int i, float xt, float yt) {
    if (i) {
      tx1 = xt;
      ty1 = yt;
      ptx1 = tx1 - x1;
      pty1 = ty1 - y1;
    } else {
      tx0 = xt;
      ty0 = yt;
      ptx0 = tx0 - x0;
      pty0 = ty0 - y0;
    }
    eval = 1;
  }

  inline void get_tangent (int i, float& xt, float& yt) {
    if (i) {
      xt = tx1;
      yt = ty1;
    } else {
      xt = tx0;
      yt = ty0;
    }
  }

  float length;
  float calc_length ();
  void normalise_length (float& now_length, float total_length);
  void calc_slope (crvpt& p, crvpt& q);

};

#endif