/* ********************************************************************************* */ 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 */ }
/* ********************************************************************************* */ 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); } }