Exemplo n.º 1
0
 private void DrawHermiteInterpolatedPoints(HermiteInterpolation HermiteInterpolator)
 {
     foreach (Point hermiteInterpolatedPoint in HermiteInterpolator.interpolatedSegmentsOfPoints)
     {
         InterpolationChart.Series[2].Points.AddXY(hermiteInterpolatedPoint.x, hermiteInterpolatedPoint.y);
     }
 }
Exemplo n.º 2
0
        public InterpolationForm()
        {
            InitializeComponent();
            DrawDefaultPoints();
            LineInterpolation LineInterpolator = new LineInterpolation();

            DrawLineInterpolatedPoints(LineInterpolator);
            HermiteInterpolation HermiteInterpolator = new HermiteInterpolation();

            DrawHermiteInterpolatedPoints(HermiteInterpolator);
        }
        internal new void Initialise(List <CamNode> points, int loops, CamTarget target)
        {
            if (target == null)
            {
                throw new Exception("No target found");
            }

            var center = target.GetPosition();

            if (center != null)
            {
                points.Add(points[0]);

                _target = target;
                var firstPoint  = new Vec3d(points[0].X, points[0].Y, points[0].Z);
                var centerPoint = new Vec3d(center.X, center.Y, center.Z);
                _sphereOrigin = new Vec3d(firstPoint.X, firstPoint.Y, firstPoint.Z);

                _sphereOrigin.Sub(centerPoint);

                _radius = _sphereOrigin.Length();

                var vecs  = new List <double>();
                var times = new List <double> {
                    0.0
                };

                vecs.Add(firstPoint.Y);
                var newPointsSorted = new List <CamNode> {
                    points[0]
                };

                for (var i = 1; i < points.Count - 1; i++)
                {
                    var point = new Vec3d(points[i].X, firstPoint.Y, points[i].Z);
                    point.Sub(centerPoint);

                    var dot   = point.Dot(_sphereOrigin);
                    var det   = ((point.X * _sphereOrigin.Z) - (point.Z * _sphereOrigin.X));
                    var angle = Math.Atan2(det, dot) * GameMath.RAD2DEG;

                    if (angle < 0)
                    {
                        angle += 360;
                    }

                    var time = angle / 360;
                    for (var j = 0; j < times.Count; j++)
                    {
                        if (times[j] > time)
                        {
                            times.Add(time);
                            vecs.Add(points[i].Y);
                            newPointsSorted.Add(points[i]);
                            break;
                        }
                    }
                    newPointsSorted.Add(points[i]);
                    times.Add(time);
                    vecs.Add(points[i].Y);
                }

                if (loops == 0)
                {
                    newPointsSorted.Add(newPointsSorted[0].Clone());
                }

                times.Add(1D);
                vecs.Add(firstPoint.Y);

                _yAxis = new HermiteInterpolation(times.ToArray(), vecs.ToArray());

                base.Initialise(times.ToArray(), newPointsSorted, loops, target);
            }
            else
            {
                throw new Exception("Invalid target");
            }
        }
        protected void Initialise(double[] times, List <CamNode> points, int loops, CamTarget target)
        {
            if (points.Count == 1)
            {
                throw new CamStudioException("At least two points are required");
            }

            var iterations = loops == 0 ? 1 : loops == 1 ? 2 : 3;

            _sizeOfIteration = 1D / iterations;

            var size = points.Count * iterations;

            if (iterations > 1)
            {
                size++;
            }

            var xPoints = new double[size];
            var yPoints = new double[size];
            var zPoints = new double[size];

            var yawPoints   = new double[size];
            var pitchPoints = new double[size];
            var rollPoints  = new double[size];

            var fovPoints        = new double[size];
            var saturationPoints = new double[size];
            var sepiaPoints      = new double[size];

            var newTimes = new double[size];

            for (var j = 0; j < iterations; j++)
            {
                if (times != null)
                {
                    for (var i = 0; i < times.Length; i++)
                    {
                        var index = i + points.Count * j;
                        if (index < size)
                        {
                            newTimes[index] = times[i] * _sizeOfIteration + _sizeOfIteration * j;
                        }
                    }
                }
                for (var i = 0; i < points.Count; i++)
                {
                    xPoints[i + j * points.Count] = points[i].X;
                    yPoints[i + j * points.Count] = points[i].Y;
                    zPoints[i + j * points.Count] = points[i].Z;

                    yawPoints[i + j * points.Count]   = points[i].Yaw;
                    pitchPoints[i + j * points.Count] = points[i].Pitch;
                    rollPoints[i + j * points.Count]  = points[i].Roll;

                    fovPoints[i + j * points.Count]        = points[i].FieldOfView;
                    saturationPoints[i + j * points.Count] = points[i].Saturation;
                    sepiaPoints[i + j * points.Count]      = points[i].Sepia;
                }

                if (iterations > 1)
                {
                    xPoints[points.Count * iterations] = points[0].X;
                    yPoints[points.Count * iterations] = points[0].Y;
                    zPoints[points.Count * iterations] = points[0].Z;

                    yawPoints[points.Count * iterations]   = points[0].Yaw;
                    pitchPoints[points.Count * iterations] = points[0].Pitch;
                    rollPoints[points.Count * iterations]  = points[0].Roll;

                    fovPoints[points.Count * iterations]        = points[0].FieldOfView;
                    saturationPoints[points.Count * iterations] = points[0].Saturation;
                    sepiaPoints[points.Count * iterations]      = points[0].Sepia;
                }

                _xSpline = new HermiteInterpolation(HermiteTension.Normal, xPoints);
                _ySpline = new HermiteInterpolation(HermiteTension.Normal, yPoints);
                _zSpline = new HermiteInterpolation(HermiteTension.Normal, zPoints);

                if (times == null)
                {
                    _yawSpline   = new HermiteInterpolation(yawPoints);
                    _pitchSpline = new HermiteInterpolation(pitchPoints);
                    _rollSpline  = new HermiteInterpolation(rollPoints);

                    _fovSpline        = new HermiteInterpolation(fovPoints);
                    _saturationSpline = new HermiteInterpolation(saturationPoints);
                    _sepiaSpline      = new HermiteInterpolation(sepiaPoints);
                }
                else
                {
                    _yawSpline   = new HermiteInterpolation(newTimes, yawPoints);
                    _pitchSpline = new HermiteInterpolation(newTimes, pitchPoints);
                    _rollSpline  = new HermiteInterpolation(newTimes, rollPoints);

                    _fovSpline        = new HermiteInterpolation(newTimes, fovPoints);
                    _saturationSpline = new HermiteInterpolation(newTimes, saturationPoints);
                    _sepiaSpline      = new HermiteInterpolation(newTimes, sepiaPoints);
                }
            }
        }