private void Convert() { var cnt = points.Count / 5.0; var pts = new List <Vector4>(); for (int i = 0; i < cnt; i++) { pts.Add(points[i * 5]); } if (cyclic) { pts.Add(points[0]); } var interp = new BsplineInterpolator(pts.Select(x => scene.CreateCatPoint(P.GetPosition(x.X, x.Y))), scene); scene.AddNewModel(interp); //scene.RemoveModel(this); }
public CuttingCurve(List <Vector4> points, IIntersectable P, IIntersectable Q, SceneData scene, bool cyclic, double minimumStep = 0.1) { this.Q = Q; this.P = P; this.scene = scene; this.cyclic = cyclic; this.points = new List <Vector4>(points.Count / 2); Vector3 prevPoint = P.GetPosition(points[0].X, points[0].Y); for (int i = 1; i < points.Count; i++) { var actualPoint = P.GetPosition(points[i].X, points[i].Y); if ((actualPoint - prevPoint).Length() > minimumStep) { prevPoint = actualPoint; this.points.Add(points[i]); } } if (this.points.Count < 2) { this.points.Add(points[points.Count - 1]); } catPoints = new List <CatPoint>(this.points.Count); foreach (var point in this.points) { var pos = P.GetPosition(point.X, point.Y); catPoints.Add(scene.CreateHiddenCatPoint(pos)); } indices.Clear(); indices.Add(0); for (int i = 1; i < this.points.Count - 1; i++) { indices.Add(i); indices.Add(i); } indices.Add(this.points.Count - 1); Console.WriteLine($"Cyclic: {cyclic}"); if (cyclic) { indices.Add(this.points.Count - 1); indices.Add(0); } IsIntersectableP = CalculatePolygon(true, out pPolygon, out pPolygonBoundary); IsIntersectableQ = CalculatePolygon(false, out qPolygon, out qPolygonBoundary); if (IsIntersectableQ) { QtestSet = new bool[100, 100]; for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) { QtestSet[i, j] = true; } } PointsContainedByCurve(QtestSet, true, Q, 0, Q.FirstParamLimit, 0, Q.SecondParamLimit, true); } }
//private static SceneData _data; public static List <Vector4> Intersect(IIntersectable P, IIntersectable Q, SceneData scene, double newtonStep, out bool cycleIntersection) { if (P == null) { throw new ArgumentNullException(nameof(P)); } if (Q == null) { throw new ArgumentNullException(nameof(Q)); } double d = newtonStep; cycleIntersection = false; //_data = scene; int number = 32; var pPoints = P.GetPointsForSearch(number, number).ToList(); var qPoints = Q.GetPointsForSearch(number, number).ToList(); var closestDistance = double.MaxValue; var pPoint = new ParametrizedPoint(); var qPoint = new ParametrizedPoint(); if (scene.Cursor.Visible) { var cursorPos = scene.Cursor.Transform.Position; foreach (var pP in pPoints) { if ((pP.Position - cursorPos).LengthSquared() < closestDistance) { closestDistance = (pP.Position - cursorPos).LengthSquared(); pPoint = pP; } } closestDistance = double.MaxValue; foreach (var qP in qPoints) { if ((qP.Position - cursorPos).LengthSquared() < closestDistance) { closestDistance = (qP.Position - cursorPos).LengthSquared(); qPoint = qP; } } } else { foreach (var pP in pPoints) { foreach (var qP in qPoints) { if ((qP.Position - pP.Position).LengthSquared() < closestDistance) { closestDistance = (qP.Position - pP.Position).LengthSquared(); pPoint = pP; qPoint = qP; } } } } Func <Vector4, double> distanceFun = arg => (P.GetPosition(arg.X, arg.Y) - Q.GetPosition(arg.Z, arg.W)).LengthSquared(); Func <Vector4, Vector4> distanceGradient = arg => { var diff = P.GetPosition(arg.X, arg.Y) - Q.GetPosition(arg.Z, arg.W); var du = P.GetFirstParamDerivative(arg.X, arg.Y); var dv = P.GetSecondParamDerivative(arg.X, arg.Y); var ds = Q.GetFirstParamDerivative(arg.Z, arg.W); var dt = Q.GetSecondParamDerivative(arg.Z, arg.W); return(new Vector4(Vector3.DotProduct(diff, du), Vector3.DotProduct(diff, dv), -Vector3.DotProduct(diff, ds), -Vector3.DotProduct(diff, dt)) * 2.0); }; var startPoint = SimpleGradient(scene, distanceFun, distanceGradient, pPoint, qPoint, P, Q); if (startPoint == null) { return(null); } scene.CreateHiddenCatPoint(P.GetPosition(startPoint.Value.X, startPoint.Value.Y)); Func <Vector4, bool, Tuple <Matrix4, Vector3> > jacobian = (arg, invert) => { var du = P.GetFirstParamDerivative(arg.X, arg.Y); var dv = P.GetSecondParamDerivative(arg.X, arg.Y); var ds = Q.GetFirstParamDerivative(arg.Z, arg.W); var dt = Q.GetSecondParamDerivative(arg.Z, arg.W); Matrix4 jacob = new Matrix4 {