예제 #1
0
        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);
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        //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
                {