/// <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); }
/// <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(); }
/// <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); }
/// <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)); } }
/// <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); } })); }
/// <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); } }
/// <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); }
/// <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))); }
internal override void UpdateScreenPaint(AlgResult result) { this.PaintingDelegate.OnSurfaceReady(result); }
/// <summary> /// Request the render to render <see cref="AlgResult"/> /// </summary> /// <param name="algResult"></param> internal void Render(AlgResult algResult) { this.Renderer.Render(algResult); }
/// <summary> /// Update the screen painting /// </summary> /// <param name="result"></param> internal virtual void UpdateScreenPaint(AlgResult result) { }