Ejemplo n.º 1
0
 /* ********************************************************************************* */
 public static void Create_Control_Point(
     PointX Prev, PointX CornerPnt, PointX Next, PointX CtrlPnt) {
   PointX before = new PointX(Prev), after = new PointX(Next);
   before.Subtract(CornerPnt);
   before.Normalize();
   after.Subtract(CornerPnt);
   after.Normalize();
   before.Add(after); // this now divides the angle between the two lines
   before.Normalize(); // this gives us normalized output
   // CtrlPnt.CopyFrom(before);
   double x0, y0, sin, cos;
   double d =
       (after.x * before.y)
           - (after.y * before.x); // winding order: d=(x-x1)*(y2-y1)-(y-y1)*(x2-x1)
   if (d > 0) {
     sin = Sin90; // 90 degrees
     cos = Cos90;
   } else {
     sin = Sin270; // 270 degrees
     cos = Cos270;
   }
   x0 = (before.x * cos) - (before.y * sin); // precalculated all to constants
   y0 = (before.y * cos) + (before.x * sin);
   CtrlPnt.Assign(x0, y0); // result is one point, 1 unit long, 'tangent' to the corner.
   /*
   position = sign((Bx - Ax) * (Y - Ay) - (By - Ay) * (X - Ax))// alternative: cross product
   */
 }
Ejemplo n.º 2
0
  /* ********************************************************************************* */
  public static void Cheap_Spline(
      Graphics2D gr,
      PointX p0,
      PointX ctr,
      PointX p1,
      PointX[] results) { // cheap spline, cross spline, cross curve
    PointX p0prime = new PointX(ctr), p1prime = new PointX(ctr);
    // p0prime.CopyFrom(ctr);
    p0prime.Subtract(p0);
    p0prime.Add(ctr);
    // p1prime.CopyFrom(ctr);
    p1prime.Subtract(p1);
    p1prime.Add(ctr);
    Line lcross0 = new Line(p0, p1prime), lcross1 = new Line(p0prime, p1);

    //    gr.setColor(Globals.ToColorWheel(Globals.RandomGenerator.nextDouble()));
    //    gr.drawLine((int) lcross0.pnt[0].x, (int) lcross0.pnt[0].y, (int) lcross0.pnt[1].x, (int)
    // lcross0.pnt[1].y);
    //
    //    gr.setColor(Globals.ToColorWheel(Globals.RandomGenerator.nextDouble()));
    //    gr.drawLine((int) lcross1.pnt[0].x, (int) lcross1.pnt[0].y, (int) lcross1.pnt[1].x, (int)
    // lcross1.pnt[1].y);
    // lcross0.Assign(p0, p1prime); lcross1.Assign(p0prime, p1);
    PointX results0 = new PointX(), results1 = new PointX(), resultsmeta = new PointX();
    Line crossmeta = new Line();
    int len = results.length; // 6;
    for (int cnt = 0; cnt < len; cnt++) {
      double Fract = ((double) cnt) / (double) len;
      System.out.println("lcross");
      lcross0.FractAlong(Fract, results0);
      lcross1.FractAlong(Fract, results1);

      // System.out.println("Fract:" + Fract + " results0 x0:" + results0.x + " y0:" + results0.y +
      // " x1:" + results1.x + " y1:" + results1.y);
      crossmeta.Assign(results0, results1);
      System.out.println("crossmeta");
      crossmeta.FractAlong(Fract, resultsmeta);

      //      gr.setColor(Globals.ToColorWheel(Globals.RandomGenerator.nextDouble()));
      //      gr.drawLine((int) crossmeta.pnt[0].x, (int) crossmeta.pnt[0].y, (int)
      // crossmeta.pnt[1].x, (int) crossmeta.pnt[1].y);
      results[cnt].CopyFrom(resultsmeta); // resultsmeta is the point we want to plot.
      // System.out.println("Fract:" + Fract + " crossmeta x0:" + crossmeta.pnt[0].x + " y0:" +
      // crossmeta.pnt[0].y + " x1:" + crossmeta.pnt[1].x + " y1:" + crossmeta.pnt[1].y);
    }
  }