protected override void CreatePoints() { var D = Dimension; var(r1, r2, f1) = GetRadius(); var n = 0; var N = 1 + D * 2; // number of points per spline DXY = new List <(float dx, float dy)>(N); float dx = -r1, dy = r2, adx = r1 / D; Add(dx, 0); for (int i = 0; i < N; i++) { if (AddLobe()) { break; } } TransformPoints(Matrix3x2.CreateRotation(RadiansStart)); bool AddLobe() { dx += adx; if (Add(dx, dy)) { return(true); } dx += adx; if (Add(dx, dy)) { return(true); } dx += adx; if (Add(dx, dy)) { return(true); } dx += adx; if (Add(dx, 0)) { return(true); } dy = -1 * dy; return(false); } bool Add(float x, float y) { DXY.Add(Limit(x, y)); return(++n >= N); } }
protected override void CreatePoints() { var D = Dimension; var n = 0; var N = 1 + D; DXY = new List <(float dx, float dy)>(N); var(r1, r2, f1) = GetRadius(); var d = D / 2; var ax = r1 * 2 / d; //ax step size var bx = ax * f1; var dx = -r1; var dy = r2; Add(dx, -dy); dx += bx; for (int i = 0; i < D; i++) { if (Add(dx + bx, dy)) { return; } dx += ax; if (Add(dx - bx, dy)) { return; } if (Add(dx + bx, -dy)) { return; } dx += ax; if (Add(dx - bx, -dy)) { return; } } TransformPoints(Matrix3x2.CreateRotation(RadiansStart)); bool Add(float x, float y) { DXY.Add(Limit(x, y)); return(++n >= N); } }
internal bool TryAddPoint(int index, Vector2 p) { if (index < 0) { return(false); } if (index < DXY.Count) { DXY.Insert(index + 1, p); return(true); } else if (index == DXY.Count) { DXY.Add(p); return(true); } return(false); }
protected override void CreatePoints() { var D = Dimension; var(r1, r2, f1) = GetRadius(); var n = 0; var N = 1 + D * 2; // number of points per spline DXY = new List <(float dx, float dy)>(N); float dx = -r1, dy = r2, adx, bdx, cdx; var ps = (D < 7) ? PS.L1 : (D < 11) ? PS.L2 : (D < 15) ? PS.L3 : PS.L4; switch (ps) { case PS.L1: SetDelta(2 * r1 / 6); if (AddLobe(adx, -dy)) { break; // 1 } if (AddLobe(bdx, dy)) { break; // 2 } if (AddLobe(adx, -dy)) { break; // 3 } break; case PS.L2: SetDelta(2 * r1 / 9); if (AddLobe(adx, -dy)) { break; // 1 } if (AddLobe(bdx, dy)) { break; // 2 } if (AddLobe(cdx, -dy)) { break; // 3 } if (AddLobe(bdx, dy)) { break; // 4 } if (AddLobe(adx, -dy)) { break; // 5 } break; case PS.L3: SetDelta(2 * r1 / 12); if (AddLobe(adx, -dy)) { break; // 1 } if (AddLobe(bdx, dy)) { break; // 2 } if (AddLobe(cdx, -dy)) { break; // 3 } if (AddLobe(bdx, dy)) { break; // 4 } if (AddLobe(cdx, -dy)) { break; // 5 } if (AddLobe(bdx, dy)) { break; // 6 } if (AddLobe(adx, -dy)) { break; // 7 } break; case PS.L4: SetDelta(2 * r1 / 14); if (AddLobe(adx, -dy)) { break; // 1 } if (AddLobe(bdx, dy)) { break; // 2 } if (AddLobe(cdx, -dy)) { break; // 3 } if (AddLobe(bdx, dy)) { break; // 4 } if (AddLobe(cdx, -dy)) { break; // 5 } if (AddLobe(bdx, dy)) { break; // 6 } if (AddLobe(cdx, -dy)) { break; // 7 } if (AddLobe(bdx, dy)) { break; // 8 } if (AddLobe(adx, -dy)) { break; // 9 } break; } TransformPoints(Matrix3x2.CreateRotation(RadiansStart)); void SetDelta(float ds) { adx = ds * 2; bdx = ds * -1; cdx = ds * 2.5f; Add(dx, 0); } bool AddLobe(float tdx, float tdy) { if (Add(dx, tdy)) { return(true); } dx += tdx; if (Add(dx, tdy)) { return(true); } dx += tdx; if (Add(dx, tdy)) { return(true); } if (Add(dx, 0)) { return(true); } return(false); } bool Add(float x, float y) { DXY.Add(Limit(x, y)); return(++n >= N); } }