protected override Geometry2D.Single.Box SegmentBounds(Geometry2D.Single.Transform transform) { Geometry2D.Single.Point p0 = this.Start; Geometry2D.Single.Point p1 = this.First; Geometry2D.Single.Point p2 = this.Second; Geometry2D.Single.Point p3 = this.End; Geometry2D.Single.Transform derivative = new Geometry2D.Single.Transform(transform.A, transform.B, transform.C, transform.D, 0, 0); Geometry2D.Single.Transform inverse = derivative.Inverse; Geometry2D.Single.Point e1p = inverse * new Geometry2D.Single.Point(1, 0); Geometry2D.Single.Point e2p = inverse * new Geometry2D.Single.Point(0, 1); Geometry2D.Single.Point zero = -3 * p0 + 3 * p1; Geometry2D.Single.Point one = 6 * p0 - 12 * p1 + 6 * p2; Geometry2D.Single.Point two = -3 * p0 + 9 * p1 - 9 * p2 + 3 * p3; Collection.List<float> parameters = new Collection.List<float>(); parameters.Add(0f); parameters.Add(1f); this.AddParameterValues(parameters, e1p, zero, one, two); this.AddParameterValues(parameters, e2p, zero, one, two); Geometry2D.Single.Point[] points = new Geometry2D.Single.Point[parameters.Count]; for (int i = 0; i < points.Length; i++) { //float alpha = i / (float)(points.Length - 1); float alpha = parameters[i]; Geometry2D.Single.Point current = Kean.Math.Single.Power(1 - alpha, 3) * p0 + 3 * Kean.Math.Single.Power(1 - alpha, 2) * alpha * p1 + 3 * (1 - alpha) * Kean.Math.Single.Power(alpha, 2) * p2 + Kean.Math.Single.Power(alpha, 3) * p3; points[i] = transform * current; } return Geometry2D.Single.Box.Bounds(points); }
protected override Tuple <Bitmap.Image, Tuple <string, object>[]> Generate(int frame) { Geometry2D.Single.Transform initialValues = this.interpolate.Interpolate(0); Geometry2D.Single.Transform initialAbsolute = initialValues; Geometry2D.Single.Transform currentValues = this.interpolate.Interpolate(frame); Geometry2D.Single.Transform currentAbsolute = currentValues; Tuple <string, object>[] meta = null; if (this.metaData) { int previousFrame = frame > 0 ? frame - 1 : (this.motionType == MotionType.Mirror ? this.frames - 1 : 0); Geometry2D.Single.Transform previousValues = this.interpolate.Interpolate(previousFrame); Geometry2D.Single.Transform previousAbsolute = previousValues; meta = new Tuple <string, object>[2] { Tuple.Create <string, object>("RelativeSyntetic", previousAbsolute.Inverse * currentAbsolute), Tuple.Create <string, object>("AbsoluteSyntetic", initialAbsolute.Inverse * currentAbsolute) }; } return(Tuple.Create <Bitmap.Image, Tuple <string, object>[]>(this.photo.Copy(this.resolution, currentAbsolute) as Bitmap.Image, meta)); }
protected override Geometry2D.Single.Box SegmentBounds(Geometry2D.Single.Transform transform) { Geometry2D.Single.Box result = new Geometry2D.Single.Box(); Tuple<Geometry2D.Single.Point, float, float> coordinates = this.PlatformctArcCoordinates(); float startAngle = coordinates.Item2; float endAngle = coordinates.Item3; Geometry2D.Single.Transform derivative = new Geometry2D.Single.Transform(transform.A, transform.B, transform.C, transform.D, 0, 0); Geometry2D.Single.Transform inverse = derivative.Inverse; Geometry2D.Single.Point e1p = inverse * new Geometry2D.Single.Point(1, 0); Geometry2D.Single.Point e2p = inverse * new Geometry2D.Single.Point(0, 1); Collection.List<float> angles = new Collection.List<float>(); angles.Add(startAngle); angles.Add(endAngle); this.AnglesAdd(angles, Kean.Math.Single.ArcusTangensExtended(-e1p.X * this.Radius.Height, e1p.Y * this.Radius.Width), startAngle, endAngle); this.AnglesAdd(angles, Kean.Math.Single.ArcusTangensExtended(-e2p.X * this.Radius.Height, e2p.Y * this.Radius.Width), startAngle, endAngle); Geometry2D.Single.Point[] points = new Geometry2D.Single.Point[angles.Count]; for (int i = 0; i < points.Length; i++) { float angle = angles[i]; points[i] = transform * (new Geometry2D.Single.Point(this.Radius.Width * Kean.Math.Single.Cosinus(angle), this.Radius.Height * Kean.Math.Single.Sinus(angle)) + coordinates.Item1); } result = Geometry2D.Single.Box.Bounds(points); return result; }