Пример #1
0
		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);
		}
Пример #2
0
 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));
 }
Пример #3
0
		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;
		}