コード例 #1
0
        /// <summary>
        /// Updates curve points of <para name="knots"/>
        /// </summary>
        /// <param name="knots"></param>
        /// <returns></returns>
        public override AlgResult UpdateCurvePoints(Matrix <Point3D> kMatrix)
        {
            AlgResult result = new AlgResult(kMatrix);

            this.CurvePointsInner(result);

            return(result);
        }
コード例 #2
0
ファイル: RendererBase.cs プロジェクト: RivaCode/BSpline3DGen
        /// <summary>
        /// Render the <see cref="MainWindow"/> with the <see cref="AlgInfoResult"/>
        /// </summary>
        /// <param name="result"></param>
        public void Render(AlgResult result)
        {
            this.AlgInfoResult = result;
            this.Main.GridLowerPanel.Visibility = Visibility.Hidden;
            this.Main.PaintControl.Visibility   = Visibility.Hidden;


            this.Clear();
            this.RenderOverride();
        }
コード例 #3
0
        /// <summary>
        /// Filter points which are two close according to treshhold
        /// </summary>
        /// <param name="kvectorPoints"></param>
        /// <param name="result"></param>
        private void FilterKVectorPointsByTreshHold(List <Point3D> kvectorPoints, AlgResult result)
        {
            for (int i = 0, j = 0; i < kvectorPoints.Count - 1; i++)
            {
                if (Math.Sqrt(
                        Math.Pow(kvectorPoints[i + 1].X - kvectorPoints[j].X, 2) +
                        Math.Pow(kvectorPoints[i + 1].Y - kvectorPoints[j].Y, 2)
                        ) > 35)
                {
                    result.KVector.Add(kvectorPoints[i + 1]);
                    j = i + 1;
                }
            }

            result.KVector.ForEach(p3D => p3D.Y += 75);
        }
コード例 #4
0
        /// <summary>
        /// Create vector according to <code>vectorIndex</code> and insert it into <code>result</code>
        /// </summary>
        /// <param name="result"></param>
        /// <param name="vectorIndex"></param>
        private void CreateVectors(AlgResult result, int vectorIndex)
        {
            int n = result.KVector.Count - 1;

            double[] rhs = new double[n];

            List <Point3D> adjustedVector = this.CreatedAdjustKnotVector(result.KMatrix[vectorIndex]);

            for (int columnIndex = 0; columnIndex < adjustedVector.Count; columnIndex++)
            {
                result.AdjustedKMatrix[vectorIndex].Add(adjustedVector[columnIndex]);
            }

            // Set right hand side X values
            for (int i = 1; i < n - 1; ++i)
            {
                rhs[i] = 4 * result.AdjustedKMatrix[vectorIndex][i].X + 2 * result.AdjustedKMatrix[vectorIndex][i + 1].X;
            }
            rhs[0]     = result.AdjustedKMatrix[vectorIndex][0].X + 2 * result.AdjustedKMatrix[vectorIndex][1].X;
            rhs[n - 1] = (8 * result.AdjustedKMatrix[vectorIndex][n - 1].X + result.AdjustedKMatrix[vectorIndex][n].X) / 2.0;
            // Get first control points X-values
            double[] x = CreateStartCurvePoints(rhs);

            // Set right hand side Y values
            for (int i = 1; i < n - 1; ++i)
            {
                rhs[i] = 4 * result.AdjustedKMatrix[vectorIndex][i].Y + 2 * result.AdjustedKMatrix[vectorIndex][i + 1].Y;
            }
            rhs[0]     = result.AdjustedKMatrix[vectorIndex][0].Y + 2 * result.AdjustedKMatrix[vectorIndex][1].Y;
            rhs[n - 1] = (8 * result.AdjustedKMatrix[vectorIndex][n - 1].Y + result.AdjustedKMatrix[vectorIndex][n].Y) / 2.0;
            // Get first control points Y-values
            double[] y = CreateStartCurvePoints(rhs);


            for (int i = 0; i < n; ++i)
            {
                // First control point
                result.StartCurveMatrix[vectorIndex].Add(new Point3D(x[i], y[i], result.AdjustedKMatrix[vectorIndex][i].Z));
                // Second control point
                result.EndCurveMatrix[vectorIndex].Add(i < n - 1
                    ? new Point3D(2 * result.AdjustedKMatrix[vectorIndex][i + 1].X - x[i + 1],
                                  2 * result.AdjustedKMatrix[vectorIndex][i + 1].Y - y[i + 1], result.AdjustedKMatrix[vectorIndex][i].Z)
                    : new Point3D((result.AdjustedKMatrix[vectorIndex][n].X + x[n - 1]) / 2, (result.AdjustedKMatrix[vectorIndex][n].Y + y[n - 1]) / 2,
                                  result.AdjustedKMatrix[vectorIndex][i].Z));
            }
        }
コード例 #5
0
 /// <summary>
 /// <see cref="IPaintingDelegate"/>
 /// </summary>
 /// <param name="result"></param>
 public void OnSurfaceReady(AlgResult result)
 {
     Dispatcher.BeginInvoke((Action)(() =>
     {
         if (result != null)
         {
             this.RenderingProvider.Render(result);
         }
         else
         {
             MessageBox.Show("Points data was corrupted, please try again !",
                             "Error",
                             MessageBoxButton.OK,
                             MessageBoxImage.Error);
         }
     }));
 }
コード例 #6
0
        /// <summary>
        /// Creates the curve points according to the result
        /// </summary>
        /// <param name="result"></param>
        private void CurvePointsInner(AlgResult result)
        {
            if (result.KVector.Count == 1)
            {
                result.StartCurveVector.Add(new Point3D(
                                                (2 * result.KVector[0].X + result.KVector[1].X) / 3,
                                                (2 * result.KVector[0].Y + result.KVector[1].Y) / 3,
                                                result.KVector[0].Z));

                result.EndCurveVector.Add(new Point3D(
                                              2 * result.StartCurveVector[0].X - result.KVector[0].X,
                                              2 * result.StartCurveVector[0].Y - result.KVector[0].Y,
                                              result.KVector[0].Z));

                return;
            }

            for (int i = 0; i < result.KMatrix.Rows; i++)
            {
                CreateVectors(result, i);
            }
        }
コード例 #7
0
        /// <summary>
        /// Create curve points according to algorithm engine
        /// </summary>
        /// <param name="knots"></param>
        /// <returns></returns>
        public override AlgResult CreateCurvePoints(List <Point3D> kvectorPoints)
        {
            AlgResult result = new AlgResult();

            result.KVector.Add(kvectorPoints[0]);

            this.FilterKVectorPointsByTreshHold(kvectorPoints, result);

            const int deltaStep = 25;

            for (int i = 1; i < 4; i++)
            {
                int offset = i * deltaStep;
                foreach (Point3D originalPoint3D in result.KVector)
                {
                    result.KMatrix[i].Add(new Point3D(originalPoint3D.X + offset, originalPoint3D.Y - offset, originalPoint3D.Z));
                }
            }

            this.CurvePointsInner(result);
            return(result);
        }
コード例 #8
0
 /// <summary>
 /// Save current algorithm result in format of <see cref="System.Xml.Linq.XElement"/>
 /// </summary>
 /// <param name="result"></param>
 /// <returns></returns>
 public XElement BuildLayout(AlgResult result)
 {
     return(new XElement(KNOT_MATRIX, this.BuildElements(result.KMatrix)));
 }
コード例 #9
0
 internal override void UpdateScreenPaint(AlgResult result)
 {
     this.PaintingDelegate.OnSurfaceReady(result);
 }
コード例 #10
0
 /// <summary>
 /// Request the render to render <see cref="AlgResult"/>
 /// </summary>
 /// <param name="algResult"></param>
 internal void Render(AlgResult algResult)
 {
     this.Renderer.Render(algResult);
 }
コード例 #11
0
 /// <summary>
 /// Update the screen painting
 /// </summary>
 /// <param name="result"></param>
 internal virtual void UpdateScreenPaint(AlgResult result)
 {
 }