public static Point3D Evaluate3DPolynomial( IList <Point3D> control, double parameter ) { var solver = new DeCastlejauSolver( BezierCurveC0.FillBernsteinCoordinatesArray( control, control.Count - 1, 0 ) ); return(MathHelpers.MakePoint3D(solver.Evaluate(parameter))); }
private void SaveToFile(string filename) { var serializer = new GM1.Serialization.XMLSerializer(); var scene = new Scene(); var ptCount = points.Count + hiddenPoints.Count; scene.Points = new GM1.Serialization.Point[ptCount]; int i = 0; foreach (var catPoint in points) { scene.Points[i] = new GM1.Serialization.Point() { Position = catPoint.Position.ToShitpoint(), Name = catPoint.Name }; catPoint.SerializationId = i; i++; } List <BezierCurveC0> beziersc0 = new List <BezierCurveC0>(); List <BezierCurveC2> beziersc2 = new List <BezierCurveC2>(); List <InterpolationBezierCurveC2> interpolators = new List <InterpolationBezierCurveC2>(); List <BezierSurfaceC0> surfacesc0 = new List <BezierSurfaceC0>(); List <BezierSurfaceC2> surfacesc2 = new List <BezierSurfaceC2>(); List <GM1.Serialization.CuttingCurve> cuttingCurves = new List <GM1.Serialization.CuttingCurve>(); foreach (var model in models) { var type = model.GetType(); if (type == typeof(Bezier)) { var bezier = model as Bezier; var sceneBezier = new BezierCurveC0 { Name = bezier.Name, DisplayPolygon = bezier.ShowPolygon, DisplayPolygonSpecified = true, Points = bezier.Points.Select(x => x.Point.SerializationId).ToArray() }; beziersc0.Add(sceneBezier); } else if (type == typeof(GeometryModels.CuttingCurve)) { var cr = model as GeometryModels.CuttingCurve; var ccr = new GM1.Serialization.CuttingCurve { Name = cr.Name, S1 = "no data", S2 = "no data", Points = cr.Points.Select(x => { var a = new GM1.Serialization.Vector4(); a.X = (float)x.X; a.Y = (float)x.Y; a.Z = (float)x.Z; a.W = (float)x.W; return(a); }).ToArray() }; cuttingCurves.Add(ccr); } else if (type == typeof(BezierC2)) { var bezier = model as BezierC2; var sceneBezier = new BezierCurveC2 { Name = bezier.Name, DisplayPolygon = bezier.ShowPolygon, DisplayPolygonSpecified = true, Points = bezier.Points.Select(x => x.Point.SerializationId).ToArray() }; beziersc2.Add(sceneBezier); } else if (type == typeof(BsplineInterpolator)) { var interpolationBezier = model as BsplineInterpolator; var sceneBezier = new InterpolationBezierCurveC2() { Name = interpolationBezier.Name, DisplayPolygon = interpolationBezier.ShowPolygon, DisplayPolygonSpecified = true, Points = interpolationBezier.Points.Select(x => x.Point.SerializationId).ToArray() }; interpolators.Add(sceneBezier); } else if (type == typeof(Surface)) { var surface = model as Surface; switch (surface.SurfaceType) { case SurfaceType.Bezier: var bezierSurf = new BezierSurfaceC0(); bezierSurf.Name = surface.Name; bezierSurf.PatchesU = surface.PatchesU; bezierSurf.PatchesV = surface.PatchesV; var ptchs = new List <BezierSurfaceC0Patch>(); foreach (var patch in surface.GetPatches().Cast <BezierPatch>()) { var scenePatch = new BezierSurfaceC0Patch() { Name = patch.Name, SurfaceDivisionsU = patch.WidthDiv, SurfaceDivisionsV = patch.HeightDiv, PatchV = patch.VPos, PatchU = patch.UPos, Points = new PointsU4V4() }; int ind = 0; foreach (var pt in patch.EnumerateCatPoints().Select(x => x.SerializationId)) { scenePatch.Points[ind] = pt; ind++; } ptchs.Add(scenePatch); } bezierSurf.Patches = ptchs.ToArray(); surfacesc0.Add(bezierSurf); break; case SurfaceType.BSpline: var sceneSurf = new BezierSurfaceC2(); sceneSurf.Name = surface.Name; sceneSurf.PatchesU = surface.PatchesU; sceneSurf.PatchesV = surface.PatchesV; var ptch = new List <BezierSurfaceC2Patch>(); foreach (var patch in surface.GetPatches().Cast <BSplinePatch>()) { var scenePatch = new BezierSurfaceC2Patch() { Name = patch.Name, SurfaceDivisionsU = patch.WidthDiv, SurfaceDivisionsV = patch.HeightDiv, PatchU = patch.UPos, PatchV = patch.VPos, Points = new PointsU4V4() }; int ind = 0; foreach (var pt in patch.EnumerateCatPoints().Select(x => x.SerializationId)) { scenePatch.Points[ind] = pt; ind++; } ptch.Add(scenePatch); } sceneSurf.Patches = ptch.ToArray(); surfacesc2.Add(sceneSurf); break; case SurfaceType.Nurbs: break; default: break; } } } scene.BezierSurfacesC0 = surfacesc0.ToArray(); scene.BezierSurfacesC2 = surfacesc2.ToArray(); scene.BezierCurvesC0 = beziersc0.ToArray(); scene.BezierCurvesC2 = beziersc2.ToArray(); scene.InterpolationBezierCurvesC2 = interpolators.ToArray(); scene.CuttingCurves = cuttingCurves.ToArray(); serializer.SerializeToFile(filename, scene); }