}//end Solve public bool Solve3(double L1, double L2, double L3, cPointi target0) { cPointi target; cPointd Jk; // coords of kinked joint returned by Solve2 cPointi J1; // Joint1 on x-axis cPointi Ttarget; // translated target target = new cPointi(target0.X, target0.Y); System.Diagnostics.Debug.WriteLine("==>Solve3: links = " + L1 + ", " + L2 + ", " + L3); Jk = new cPointd(0, 0); if (Solve2(L1 + L2, L3, target, Jk)) { firstlinks++; nlinks = 2; System.Diagnostics.Debug.WriteLine("Solve3: link1=" + (L1 + L2) + ", link2=" + L3 + ", joint=\n"); LineTo_d(Jk); SetAChain(Jk, target); return(true); } else if (Solve2(L1, L2 + L3, target, Jk)) { System.Diagnostics.Debug.WriteLine("Solve3: link1= " + L1 + ", link2= " + (L2 + L3) + ", joint=\n"); nlinks = 2; LineTo_d(Jk); SetAChain(Jk, target); return(true); } else { // pin J0 to 0. // Shift so J1 is origin. //J1.x = L1; J1.y = 0; J1 = new cPointi(L1, 0); Ttarget = new cPointi(0, 0); SubVec(target, J1, Ttarget); if (Solve2(L2, L3, Ttarget, Jk)) { // Shift solution back to origin. Jk.x += L1; System.Diagnostics.Debug.WriteLine("Solve3: link1=" + L1 + ", link2= " + L2 + ", link3= " + L1 + ", joints=\n"); nlinks = 3; LineTo_i(J1); LineTo_d(Jk); SetAChain(Jk, target); cVertex VJ1 = new cVertex(list.head.Point.X + J1.X, list.head.Point.Y); list.InsertBefore(VJ1, list.head.NextVertex); return(true); } else { return(false); } } }//end Solve3