Пример #1
0
        public void LoadBezierToGallery()
        {
            //string currDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
            //string currDirectory = Directory.GetCurrentDirectory();
            string currDirectory = System.AppDomain.CurrentDomain.BaseDirectory;

#if FINAL
            //string fullPath = Path.Combine(currDirectory, "\\galleries\\bezier_surfaces\\");
            string fullPath = currDirectory + "\\galleries\\bezier_surfaces\\";
#else
            string fullPath = Path.Combine(currDirectory, "..\\..\\galleries\\bezier_surfaces\\");
#endif

            string[] paths = Directory.GetFiles(fullPath); // TODO poprawić ścieżkę w finalnej wersji

            foreach (string path in paths)
            {
                string file = Path.GetFileNameWithoutExtension(path);

                BezierSurface bezier = BezierSurface.ReadFromFile(path);
                if (bezier != null)
                {
                    //bezier.Name = file;
#if FINAL
                    bezier.ImageUri = currDirectory + "\\galleries\\bezier_surfaces\\" + bezier.Name + ".png";
#else
                    bezier.ImageUri = AppDomain.CurrentDomain.BaseDirectory + "..\\..\\galleries\\bezier_surfaces\\" + bezier.Name + ".png";
#endif
                    Add(bezier); // TODO poprawić ścieżkę w finalnej wersji
                }
            }
        }
Пример #2
0
    public override void OnInspectorGUI()
    {
        BezierSurface bs = target as BezierSurface;

        base.OnInspectorGUI();

        bool test = false;

        EditorGUI.BeginChangeCheck();

        if (GUILayout.Button("Create Surface"))
        {
            bs.AddBezierSurface(bs.startPosition);
            test = true;
        }

        if (GUILayout.Button("Reset"))
        {
            bs.Reset();
        }

        if (EditorGUI.EndChangeCheck())
        {
            Undo.RecordObject(bs, "add bezier surface");
        }
    }
Пример #3
0
 public DrawForm()
 {
     InitializeComponent();
     inputFileCmb.SelectedItem = inputFileCmb.Items[1];
     SetPoints();
     coordinates      = new Coordinates3D(Canvas.Size.Width, Canvas.Size.Height);
     surface          = new BezierSurface();
     startSurfaceGrid = new List <List <Point3> >();
     surface.SetPoints(points);
     SavePoints(pointsFilename);
     startSurfaceGrid.Clear();
 }
Пример #4
0
        public BezierSurface Redo(BezierSurface bezier)
        {
            if (firstRedo != null)
            {
                Element second = first;
                first        = new Element();
                first.next   = second;
                first.bezier = new BezierSurface(bezier);

                bezier    = firstRedo.bezier;
                firstRedo = firstRedo.next;
            }
            return(bezier);
        }
Пример #5
0
        private void DrawGrid(Rectangle rect, Graphics g)
        {
            if (startSurfaceGrid.Count == 0)
            {
                surface = new BezierSurface();
                surface.SetPoints(startPoints);
                startSurfaceGrid  = surface.GetSurfaceGridPoints(tolerance, rows, columns);
                surfaceGridPoints = null;
                startSurfaceCells.Clear();
                surfaceCells = null;
            }
            var drawGridPoints = Point3Utils.GetObjectProjection(surfaceGridPoints ?? startSurfaceGrid, rect.Width, rect.Height);

            g.DrawGrid(Pens.Black, drawGridPoints);
        }
        /// <summary>
        /// Działa tylko dla widoków ortogonalnych.
        /// </summary>
        /// <param name="bezierSurface"></param>
        /// <param name="bezierCam"></param>
        /// <param name="viewportType"></param>
        /// <param name="pos"></param>
        /// <param name="size"></param>
        /// <param name="orthoSize"></param>
        /// <param name="orthoPos"></param>
        /// <param name="orthoLookAt"></param>
        public static void SelectBezierControlPoint(BezierSurface bezierSurface, Camera bezierCam, ViewportType viewportType,
                                                    Point pos, Point size, Vector2 orthoSize, Vector3 orthoPos, Vector3 orthoLookAt)
        {
            Vector3 outCamPos = new Vector3(), outSurfPos = new Vector3();

            switch (viewportType)
            {
            case ViewportType.Perspective:
                CalcPerspCoords(pos, size, bezierCam.fovAngle, bezierCam.rotateAngle,
                                bezierCam.position, bezierCam.lookAt, out outCamPos, out outSurfPos);
                break;

            case ViewportType.Orto:
                CalcOrthoCoords(pos, size, orthoSize, orthoPos, orthoLookAt, out outCamPos, out outSurfPos);
                break;
            }

            Vector3 rayDir = Vector3.Normalize(outSurfPos - outCamPos);

            SlimDX.Ray  ray     = new SlimDX.Ray(outCamPos + 0.01f * rayDir, rayDir);
            float       dist    = float.PositiveInfinity;
            float       tmpDist = -1;
            BoundingBox bb;

            for (int i = 0; i < bezierSurface.ControlPoints.Length; i++)
            {
                bb = new BoundingBox(new Vector3(bezierSurface.ControlPoints[i].x - 0.05f,
                                                 bezierSurface.ControlPoints[i].y - 0.05f,
                                                 bezierSurface.ControlPoints[i].z - 0.05f),
                                     new Vector3(bezierSurface.ControlPoints[i].x + 0.05f,
                                                 bezierSurface.ControlPoints[i].y + 0.05f,
                                                 bezierSurface.ControlPoints[i].z + 0.05f));

                if (SlimDX.Ray.Intersects(ray, bb, out tmpDist))
                {
                    if (tmpDist < dist)
                    {
                        dist = tmpDist;
                        bezierSurface.selectedPointIdx = i;
                    }
                }
            }

            if (dist == float.PositiveInfinity)
            {
                bezierSurface.selectedPointIdx = -1;
            }
        }
Пример #7
0
        public void SaveBezierToGallery(BezierSurface bezier, Image bezierImage)
        {
            string currDirectory = System.AppDomain.CurrentDomain.BaseDirectory;

#if FINAL
            bezier.SaveBezierFile(currDirectory + "/galleries/bezier_surfaces/" + bezier.Name + ".bzr");
            bezier.ImageUri = currDirectory + "\\galleries\\bezier_surfaces\\" + bezier.Name + ".png";
#else
            bezier.SaveBezierFile("../../galleries/bezier_surfaces/" + bezier.Name + ".bzr");
            bezier.ImageUri = AppDomain.CurrentDomain.BaseDirectory + "..\\..\\galleries\\bezier_surfaces\\" + bezier.Name + ".png";
#endif

            bezierImage.Save(bezier.ImageUri, ImageFormat.Png);

            bezierImage.Dispose();
        }
Пример #8
0
        private void Canvas_Paint(object sender, PaintEventArgs e)
        {
            var rect = new Rectangle(Canvas.Location.X, Canvas.Location.Y, Canvas.Size.Width, Canvas.Size.Height);

            DrawXYZAxes(e.Graphics, rect);
            var basePointsArray = points.Select(row => row.Select(point => point.GetDrawingPoint(rect.Width, rect.Height)).ToArray()).ToArray();

            e.Graphics.DrawPoints(Brushes.Black, basePointsArray, pointRadius);

            if (startSurfaceGrid.Count == 0)
            {
                surface = new BezierSurface();
                surface.SetPoints(startPoints);
                startSurfaceGrid  = surface.GetSurfaceGridPoints(tolerance, rows, columns);
                surfaceGridPoints = null;
            }
            var drawPoints = Point3Utils.GetObjectProjection(surfaceGridPoints ?? startSurfaceGrid, rect.Width, rect.Height);

            e.Graphics.DrawGrid(Pens.Red, drawPoints);
        }
Пример #9
0
        private void DrawCells(Rectangle rect, Graphics g)
        {
            var innerBrush = Brushes.Cyan;
            var outerBrush = Brushes.DarkOrchid;

            if (startSurfaceCells.Count == 0)
            {
                surface = new BezierSurface();
                surface.SetPoints(startPoints);
                startSurfaceCells = surface.GetSurfaceCells(tolerance, rows, columns);
                surfaceCells      = null;
            }
            var check   = startSurfaceCells;
            var ordered = (surfaceCells ?? startSurfaceCells).OrderByDescending(cell => cell.FurthestDistance);

            foreach (SurfaceCell cell in ordered)
            {
                var drawPoints = Point3Utils.GetCurveProjection(cell.ToList(), rect.Width, rect.Height).ToArray();
                g.FillPolygon(cell.IsFront ? outerBrush : innerBrush, drawPoints);
            }
        }
Пример #10
0
        public void Save(BezierSurface bezier)
        {
            Element second = first;

            first        = new Element();
            first.next   = second;
            first.bezier = new BezierSurface(bezier);

            firstRedo = null;
            int m = 0;

            for (Element el = first; el != null; el = el.next)
            {
                //m += el.scene.EstimatedMemory();
                m += el.bezier.EstimatedMemory();
                if (m > MAX_MEMORY)
                {
                    el.next = null;
                }
            }
        }
Пример #11
0
    public void OnSceneGUI()
    {
        BezierSurface bs = target as BezierSurface;

        if (bs.controlVertices == null)
        {
            return;
        }

        if (!bs.drawHandles)
        {
            return;
        }

        Vector3[] vertices    = bs.controlVertices;
        int       uResolution = 4;
        int       vResolution = 4;


        EditorGUI.BeginChangeCheck();

        for (int i = 0; i < bs.controlVertices.Length; ++i)
        {
            vertices[i] = Handles.PositionHandle(bs.controlVertices[i], Quaternion.identity);
        }

        uResolution = bs.uResolution;
        vResolution = bs.vResolution;

        if (EditorGUI.EndChangeCheck())
        {
            Undo.RecordObject(bs, undoMsg);
            bs.controlVertices = vertices;
            bs.uResolution     = uResolution;
            bs.vResolution     = vResolution;
            bs.RecalculateVertices();
        }
    }
Пример #12
0
        public void GetVCount()
        {
            double[][][]  ptGrid = null;
            double        r, a;
            BezierSurface surface = null;

            ptGrid = new double[][][]
            {
                new double[][]
                {
                    new double[]  { 0.0, 0.0, 0.0 },
                    new double[] { 0.0, 1.0, 2.0 },
                    new double[] { 0.0, 2.0, 1.0 },
                    new double[] { 0.0, 3.0, 0.0 },
                },
                new double[][]
                {
                    new double[] { 1.0, 0.0, 2.0 },
                    new double[] { 1.0, 1.0, 0.0 },
                    new double[] { 1.0, 2.0, 2.0 },
                    new double[] { 1.0, 3.0, 1.0 },
                },
                new double[][]
                {
                    new double[] { 2.0, 0.0, 1.0 },
                    new double[] { 2.0, 1.0, 0.0 },
                    new double[] { 2.0, 2.0, 2.0 },
                    new double[] { 2.0, 3.0, 0.0 },
                },
            };
            surface = new BezierSurface(ptGrid);
            r       = surface.GetVCount();
            a       = 4;

            Assert.IsTrue(r == a);
        }
Пример #13
0
        /// <summary>
        /// Test scene for BezierSurface.
        /// </summary>
        public static void Bezier( IRayScene sc )
        {
            Debug.Assert( sc != null );

              // CSG scene:
              CSGInnerNode root = new CSGInnerNode( SetOperation.Union );
              root.SetAttribute( PropertyName.REFLECTANCE_MODEL, new PhongModel() );
              root.SetAttribute( PropertyName.MATERIAL, new PhongMaterial( new double[] { 1.0, 0.8, 0.1 }, 0.1, 0.5, 0.5, 64 ) );
              sc.Intersectable = root;

              // Background color:
              sc.BackgroundColor = new double[] { 0.0, 0.05, 0.07 };

              // Camera:
              sc.Camera = new StaticCamera( new Vector3d( 0.7, 0.5, -5.0 ),
                                    new Vector3d( 0.0, -0.18, 1.0 ),
                                    50.0 );

              // Light sources:
              sc.Sources = new LinkedList<ILightSource>();
              sc.Sources.Add( new AmbientLightSource( 0.8 ) );
              sc.Sources.Add( new PointLightSource( new Vector3d( -5.0, 3.0, -3.0 ), 1.0 ) );

              // --- NODE DEFINITIONS ----------------------------------------------------

              // Bezier patch (not yet):
              BezierSurface b = new BezierSurface( 1, 2, new double[] {
            0.0, 0.0, 3.0,  // row 0
            1.0, 0.0, 3.0,
            2.0, 0.0, 3.0,
            3.0, 0.0, 3.0,
            4.0, 0.0, 3.0,
            5.0, 0.0, 3.0,
            6.0, 0.0, 3.0,
            0.0, 0.0, 2.0,  // row 1
            1.0, 0.0, 2.0,
            2.0, 3.0, 2.0,
            3.0, 3.0, 2.0,
            4.0, 3.0, 2.0,
            5.0, 0.0, 2.0,
            6.0, 0.0, 2.0,
            0.0, 0.0, 1.0,  // row 2
            1.0, 0.0, 1.0,
            2.0, 0.0, 1.0,
            3.0, 1.5, 1.0,
            4.0, 3.0, 1.0,
            5.0, 0.0, 1.0,
            6.0, 0.0, 1.0,
            0.0, 0.0, 0.0,  // row 3
            1.0, 0.0, 0.0,
            2.0, 0.0, 0.0,
            3.0, 0.0, 0.0,
            4.0, 0.0, 0.0,
            5.0, 0.0, 0.0,
            6.0, 0.0, 0.0,
            } );
              b.SetAttribute( PropertyName.TEXTURE, new CheckerTexture( 10.5, 12.0, new double[] { 0.0, 0.0, 0.1 } ) );
              root.InsertChild( b, Matrix4d.RotateY( -0.4 ) * Matrix4d.CreateTranslation( -1.1, -0.9, 0.0 ) );

              // Cylinders for reflections..
              Cylinder c = new Cylinder();
              c.SetAttribute( PropertyName.MATERIAL, new PhongMaterial( new double[] { 0.0, 0.6, 0.0 }, 0.2, 0.6, 0.3, 8 ) );
              root.InsertChild( c, Matrix4d.Scale( 0.15 ) * Matrix4d.RotateX( MathHelper.PiOver2 ) * Matrix4d.CreateTranslation( -0.4, 0.0, 0.0 ) );
              c = new Cylinder();
              c.SetAttribute( PropertyName.MATERIAL, new PhongMaterial( new double[] { 0.8, 0.2, 0.0 }, 0.2, 0.6, 0.3, 8 ) );
              root.InsertChild( c, Matrix4d.Scale( 0.2 ) * Matrix4d.RotateX( MathHelper.PiOver2 ) * Matrix4d.CreateTranslation( -1.9, 0.0, 3.0 ) );

              // Infinite plane with checker:
              Plane pl = new Plane();
              pl.SetAttribute( PropertyName.COLOR, new double[] { 0.3, 0.0, 0.0 } );
              pl.SetAttribute( PropertyName.TEXTURE, new CheckerTexture( 0.6, 0.6, new double[] { 1.0, 1.0, 1.0 } ) );
              root.InsertChild( pl, Matrix4d.RotateX( -MathHelper.PiOver2 ) * Matrix4d.CreateTranslation( 0.0, -1.0, 0.0 ) );
        }
Пример #14
0
        public void ParameterAt()
        {
            double[][][]  ptGrid = null;
            double[]      r, a;
            double        u, v, e;
            BezierSurface surface = null;


            ptGrid = new double[][][]
            {
                new double[][]
                {
                    new double[]  { 0.0, 0.0, 0.0 },
                    new double[] { 0.0, 1.0, 2.0 },
                    new double[] { 0.0, 2.0, 1.0 },
                    new double[] { 0.0, 3.0, 0.0 },
                },
                new double[][]
                {
                    new double[] { 1.0, 0.0, 2.0 },
                    new double[] { 1.0, 1.0, 0.0 },
                    new double[] { 1.0, 2.0, 2.0 },
                    new double[] { 1.0, 3.0, 1.0 },
                },
                new double[][]
                {
                    new double[] { 2.0, 0.0, 1.0 },
                    new double[] { 2.0, 1.0, 0.0 },
                    new double[] { 2.0, 2.0, 2.0 },
                    new double[] { 2.0, 3.0, 0.0 },
                },
            };
            u       = 0.3;
            v       = 0.4;
            e       = 0.0001;
            surface = new BezierSurface(ptGrid);
            r       = surface.ParameterAt(u, v);
            a       = new double[] { 0.6, 1.2, 1.086 };

            Assert.IsTrue(r.SequenceEqual(a, e));


            ptGrid = new double[][][]
            {
                new double[][]
                {
                    new double[]  { 0.0, 0.0, 0.0 },
                    new double[] { 0.0, 1.0, 2.0 },
                    new double[] { 0.0, 2.0, 1.0 },
                    new double[] { 0.0, 3.0, 0.0 },
                },
                new double[][]
                {
                    new double[] { 1.0, 0.0, 2.0 },
                    new double[] { 1.0, 1.0, 0.0 },
                    new double[] { 1.0, 2.0, 2.0 },
                    new double[] { 1.0, 3.0, 1.0 },
                },
                new double[][]
                {
                    new double[] { 2.0, 0.0, 1.0 },
                    new double[] { 2.0, 1.0, 0.0 },
                    new double[] { 2.0, 2.0, 2.0 },
                    new double[] { 2.0, 3.0, 0.0 },
                },
            };
            u       = 0.8;
            v       = 0.9;
            e       = 0.0001;
            surface = new BezierSurface(ptGrid);
            r       = surface.ParameterAt(u, v);
            a       = new double[] { 1.6, 2.7, 0.713 };

            Assert.IsTrue(r.SequenceEqual(a, e));


            ptGrid = new double[][][]
            {
                new double[][]
                {
                    new double[]  { 0.0, 0.0, 0.0 },
                    new double[] { 0.0, 1.0, 2.0 },
                    new double[] { 0.0, 2.0, 1.0 },
                    new double[] { 0.0, 3.0, 0.0 },
                },
                new double[][]
                {
                    new double[] { 1.0, 0.0, 2.0 },
                    new double[] { 1.0, 1.0, 0.0 },
                    new double[] { 1.0, 2.0, 2.0 },
                    new double[] { 1.0, 3.0, 1.0 },
                },
                new double[][]
                {
                    new double[] { 2.0, 0.0, 1.0 },
                    new double[] { 2.0, 1.0, 0.0 },
                    new double[] { 2.0, 2.0, 2.0 },
                    new double[] { 2.0, 3.0, 0.0 },
                },
            };
            u       = 0.1;
            v       = 0.2;
            e       = 0.0001;
            surface = new BezierSurface(ptGrid);
            r       = surface.ParameterAt(u, v);
            a       = new double[] { 0.2, 0.6, 0.9272 };

            Assert.IsTrue(r.SequenceEqual(a, e));
        }
Пример #15
0
    // Use this for initialization

    void Start()
    {
        mySurface = BezierSurface.CreateSurface();
    }
Пример #16
0
 public static void Test_Factorial()
 {
     Console.WriteLine(BezierSurface.Factorial(3));
 }
Пример #17
0
        public override void OnPaint()
        {
            switch (ActiveSurface)
            {
            case SurfaceKind.ArrayExtruder:
                xyArray A = new xyArray();
                A.data = new xy[] { new xy(0, 0), new xy(0, 4), new xy(4, 4), new xy(4, 0), new xy(0, 0) };
                ArrayExtruder AE = new ArrayExtruder();
                AE.Array  = A;
                AE.Height = 5;
                AE.Paint(this);
                break;

            case SurfaceKind.BezierSurface:
                Lights[0].Position = DefaultLightPos;
                BezierSurface Bezs = new BezierSurface();
                Bezs.ControlPoints = new xyz[, ] {
                    { new xyz(0, 0, 0), new xyz(2, 0, 0), new xyz(4, 0, 0), new xyz(6, 0, 0) },
                    { new xyz(0, 3, 1), new xyz(2, 3, 3), new xyz(4, 3, 0), new xyz(6, 3, 0) },
                    { new xyz(0, 6, 1), new xyz(2, 6, 3), new xyz(4, 6, 0), new xyz(6, 6, 0) },
                    { new xyz(0, 9, 0), new xyz(2, 9, 0), new xyz(4, 9, 0), new xyz(6, 9, 0) },
                };


                Bezs.Paint(this);
                break;

            case SurfaceKind.BsplineSurface:
                BSplineSurface BS = new BSplineSurface();

                Lights[0].Position = DefaultLightPos;
                BS.ControlPoints   = new xyz[, ] {
                    { new xyz(0, 0, 0), new xyz(0, 3, 0), new xyz(0, 6, 0), new xyz(0, 9, 0), },
                    { new xyz(2, 0, 1), new xyz(2, 3, 3), new xyz(2, 6, 3), new xyz(2, 9, 0), },
                    { new xyz(4, 0, 1), new xyz(4, 3, 3), new xyz(4, 6, 3), new xyz(4, 9, 0), },
                    { new xyz(6, 0, 0), new xyz(6, 3, 0), new xyz(6, 6, 0), new xyz(6, 9, 0) },
                };

                BS.UDegree = 3;
                BS.VDegree = 2;
                BS.SetDefaultKnots();



                BS.Paint(this);
                break;

            case SurfaceKind.Cone:
                Lights[0].Position = new xyzwf(5, 0, (float)2.5, 1);
                Cone Cone = new Cone(new xyz(0, 0, 0), 5, 2, System.Math.PI / 4);
                Cone.Paint(this);
                break;

            case SurfaceKind.Curve2DRotator:
                Lights[0].Position = DefaultLightPos;
                Curve2dRotator C2d = new Curve2dRotator();
                C2d.Curve     = new Bezier(new xy(1, 0), new xy(2, 3), new xy(4, 3), new xy(6, 0));;
                C2d.FromAngle = 0;
                C2d.ToAngle   = Math.PI / 2;

                C2d.Paint(this);
                break;

            case SurfaceKind.Curve3dRotator:
                Curve3dRotator C3d = new Curve3dRotator();
                C3d.Curve = new Bezier3D(new xyz(1, 2, 0), new xyz(2, 1, 3), new xyz(4, 2, 3), new xyz(5, 2, 0));
                C3d.Paint(this);
                break;

            case SurfaceKind.CurveExtruder:
                Lights[0].Position = new xyzwf(3, 6, 3, 1);
                CurveExtruder CE = new CurveExtruder();
                CE.Curve     = new Bezier(new xy(1, 0), new xy(2, 3), new xy(4, 3), new xy(6, 0));
                CE.UpPlane   = new Plane(new xyz(0, 0, 4), new xyz(0, 0.3, 1));
                CE.DownPlane = new Plane(new xyz(0, 0, 0), new xyz(0, -0.3, 1));
                CE.Height    = -5;
                CE.Paint(this);
                break;

            case SurfaceKind.CustomSurface:
                Lights[0].Position = new xyzwf(8, 1, 2, 1);
                CustomSurface.Paint(this);
                break;

            case SurfaceKind.Cylinder:
                Lights[0].Position = new xyzwf(8, 1, 2, 1);
                Cylinder Cylinder = new Cylinder(3, 5);
                drawSurface(Cylinder);
                break;

            case SurfaceKind.NurbsSurface:
                NurbsSurface NS = new NurbsSurface();
                Lights[0].Position = DefaultLightPos;
                NS.ControlPoints   = new xyz[, ] {
                    { new xyz(0, 0, 0), new xyz(0, 3, 0), new xyz(0, 6, 0), new xyz(0, 9, 0), },
                    { new xyz(2, 0, 1), new xyz(2, 3, 3), new xyz(2, 6, 3), new xyz(2, 9, 0), },
                    { new xyz(4, 0, 1), new xyz(4, 3, 3), new xyz(4, 6, 3), new xyz(4, 9, 0), },
                    { new xyz(6, 0, 0), new xyz(6, 3, 0), new xyz(6, 6, 0), new xyz(6, 9, 0) },
                };

                NS.UDegree = 3;
                NS.VDegree = 2;
                NS.Weights = new double[, ] {
                    { 1, 1, 1, 1 },
                    { 1, 3, 3, 1 },
                    { 1, 3, 3, 1 },
                    { 1, 1, 1, 1 }
                };
                NS.SetDefaultKnots();
                NS.Paint(this);
                break;

            case SurfaceKind.OffsetSurface:
                Lights[0].Position = DefaultLightPos;
                BSplineSurface _BS = new BSplineSurface();
                _BS.ControlPoints = new xyz[, ] {
                    { new xyz(0, 0, 0), new xyz(0, 3, 0), new xyz(0, 6, 0), new xyz(0, 9, 0), },
                    { new xyz(2, 0, 1), new xyz(2, 3, 3), new xyz(2, 6, 3), new xyz(2, 9, 0), },
                    { new xyz(4, 0, 1), new xyz(4, 3, 3), new xyz(4, 6, 3), new xyz(4, 9, 0), },
                    { new xyz(6, 0, 0), new xyz(6, 3, 0), new xyz(6, 6, 0), new xyz(6, 9, 0) },
                };

                _BS.UDegree = 3;
                _BS.VDegree = 2;
                _BS.SetDefaultKnots();

                OffsetSurface OS = new OffsetSurface();
                OS.BasisSurface = _BS;
                OS.Distance     = 0.5;
                OS.Paint(this);


                break;

            case SurfaceKind.PlaneSurface:
                Lights[0].Position = new xyzwf(2, 2, 4, 1);
                PlaneSurface PS = new PlaneSurface(new xyz(0, 0, 0), new xyz(4, 2, 2), new xyz(1, 5, 7));
                PS.Width  = 4;
                PS.Length = 5;
                PS.Paint(this);
                break;

            case SurfaceKind.SmoothPlane:
                Lights[0].Position = new xyzwf(2, 2, 4, 1);
                SmoothPlane SP = new SmoothPlane(new xyz(0, 0, 0), new xyz(0, 5, 0), new xyz(5, 5, 0), new xyz(5, 0, 0), new xyz(-1, -1, 1), new xyz(-1, 1, 1), new xyz(1, 1, 1), new xyz(1, 1, 1));
                SP.Width  = 5;
                SP.Length = 6;
                SP.Paint(this);
                break;

            case SurfaceKind.Sphere:
                Lights[0].Position = DefaultLightPos;
                Sphere Sphere = new Sphere(new xyz(2, 1, 1), 4);
                drawSurface(Sphere);

                break;

            case SurfaceKind.Torus:
                Lights[0].Position = DefaultLightPos;
                Torus Torus = new Torus(1, 4);
                drawSurface(Torus);
                break;

            default:
                break;
            }
            base.OnPaint();
        }
Пример #18
0
        public void GeneratePointGrid()
        {
            double[][][]      pts, r, a = null;
            ParametricSurface srf;
            int    uCount, vCount;
            double e;

            e = 0.0001;

            pts = new double[][][]
            {
                new double[][] {
                    new double[] { 0.0, 0.0, 1.0 },
                    new double[] { 0.0, 1.0, 2.0 },
                    new double[] { 0.0, 2.0, 0.0 },
                    new double[] { 0.0, 3.0, 1.0 },
                    new double[] { 0.0, 4.0, 1.0 },
                },
                new double[][] {
                    new double[] { 1.0, 0.0, 2.0 },
                    new double[] { 1.0, 1.0, 2.0 },
                    new double[] { 1.0, 2.0, 1.0 },
                    new double[] { 1.0, 3.0, 1.0 },
                    new double[] { 1.0, 4.0, 1.0 },
                },
                new double[][] {
                    new double[] { 2.0, 0.0, 2.0 },
                    new double[] { 2.0, 1.0, 1.0 },
                    new double[] { 2.0, 2.0, 1.0 },
                    new double[] { 2.0, 3.0, 1.0 },
                    new double[] { 2.0, 4.0, 2.0 },
                },
            };

            srf    = new BezierSurface(pts);
            uCount = 10;
            vCount = 4;
            r      = SurfaceDivider.GeneratePointGrid(srf, uCount, vCount);
            a      = new double[][][] {
                new double[][] {
                    new double[] { 0.0, 0.0, 1.0 },
                    new double[] { 0.0, 1.0, 1.210938 },
                    new double[] { 0.0, 2.0, 0.875 },
                    new double[] { 0.0, 3.0, 0.835938 },
                    new double[] { 0.0, 4.0, 1.0 },
                },
                new double[][] {
                    new double[] { 0.2, 0.0, 1.19 },
                    new double[] { 0.2, 1.0, 1.306953 },
                    new double[] { 0.2, 2.0, 0.95625 },
                    new double[] { 0.2, 3.0, 0.879453 },
                    new double[] { 0.2, 4.0, 1.01 },
                },
                new double[][] {
                    new double[] { 0.4, 0.0, 1.36 },
                    new double[] { 0.4, 1.0, 1.384063 },
                    new double[] { 0.4, 2.0, 1.025 },
                    new double[] { 0.4, 3.0, 0.924063 },
                    new double[] { 0.4, 4.0, 1.04 },
                },
                new double[][] {
                    new double[] { 0.6, 0.0, 1.51 },
                    new double[] { 0.6, 1.0, 1.442266 },
                    new double[] { 0.6, 2.0, 1.08125 },
                    new double[] { 0.6, 3.0, 0.969766 },
                    new double[] { 0.6, 4.0, 1.09 },
                },
                new double[][] {
                    new double[] { 0.8, 0.0, 1.64 },
                    new double[] { 0.8, 1.0, 1.481563 },
                    new double[] { 0.8, 2.0, 1.125 },
                    new double[] { 0.8, 3.0, 1.016562 },
                    new double[] { 0.8, 4.0, 1.16 },
                },
                new double[][] {
                    new double[] { 1.0, 0.0, 1.75 },
                    new double[] { 1.0, 1.0, 1.501953 },
                    new double[] { 1.0, 2.0, 1.15625 },
                    new double[] { 1.0, 3.0, 1.064453 },
                    new double[] { 1.0, 4.0, 1.25 },
                },
                new double[][] {
                    new double[] { 1.2, 0.0, 1.84 },
                    new double[] { 1.2, 1.0, 1.503438 },
                    new double[] { 1.2, 2.0, 1.175 },
                    new double[] { 1.2, 3.0, 1.113437 },
                    new double[] { 1.2, 4.0, 1.36 },
                },
                new double[][] {
                    new double[] { 1.4, 0.0, 1.91 },
                    new double[] { 1.4, 1.0, 1.486016 },
                    new double[] { 1.4, 2.0, 1.18125 },
                    new double[] { 1.4, 3.0, 1.163516 },
                    new double[] { 1.4, 4.0, 1.49 },
                },
                new double[][] {
                    new double[] { 1.6, 0.0, 1.96 },
                    new double[] { 1.6, 1.0, 1.449687 },
                    new double[] { 1.6, 2.0, 1.175 },
                    new double[] { 1.6, 3.0, 1.214688 },
                    new double[] { 1.6, 4.0, 1.64 },
                },
                new double[][] {
                    new double[] { 1.8, 0.0, 1.99 },
                    new double[] { 1.8, 1.0, 1.394453 },
                    new double[] { 1.8, 2.0, 1.15625 },
                    new double[] { 1.8, 3.0, 1.266953 },
                    new double[] { 1.8, 4.0, 1.81 },
                },
                new double[][] {
                    new double[] { 2.0, 0.0, 2.0 },
                    new double[] { 2.0, 1.0, 1.320313 },
                    new double[] { 2.0, 2.0, 1.125 },
                    new double[] { 2.0, 3.0, 1.320313 },
                    new double[] { 2.0, 4.0, 2.0 },
                },
            };

            for (int i = 0; i < r.Length; i++)
            {
                for (int j = 0; j < r[0].Length; j++)
                {
                    Assert.IsTrue(r[i][j].SequenceEqual(a[i][j], e));
                }
            }
        }
Пример #19
0
        public void GenerateGridSegment()
        {
            double[][][]      pts;
            double [][]       r, a = null;
            ParametricSurface srf;
            int    uCount, vCount;
            double e;

            e = 0.0001;

            pts = new double[][][]
            {
                new double[][] {
                    new double[] { 0.0, 0.0, 1.0 },
                    new double[] { 0.0, 1.0, 2.0 },
                    new double[] { 0.0, 2.0, 0.0 },
                    new double[] { 0.0, 3.0, 1.0 },
                    new double[] { 0.0, 4.0, 1.0 },
                },
                new double[][] {
                    new double[] { 1.0, 0.0, 2.0 },
                    new double[] { 1.0, 1.0, 2.0 },
                    new double[] { 1.0, 2.0, 1.0 },
                    new double[] { 1.0, 3.0, 1.0 },
                    new double[] { 1.0, 4.0, 1.0 },
                },
                new double[][] {
                    new double[] { 2.0, 0.0, 2.0 },
                    new double[] { 2.0, 1.0, 1.0 },
                    new double[] { 2.0, 2.0, 1.0 },
                    new double[] { 2.0, 3.0, 1.0 },
                    new double[] { 2.0, 4.0, 2.0 },
                },
            };

            srf    = new BezierSurface(pts);
            uCount = 10;
            vCount = 4;
            r      = SurfaceDivider.GenerateGridSegment(srf, uCount, vCount);
            a      = new double[][] {
                new double[] { 0, 0, 1, 0, 1, 1.2109375 },
                new double[] { 0, 1, 1.2109375, 0, 2, 0.875 },
                new double[] { 0, 2, 0.875, 0, 3, 0.8359375 },
                new double[] { 0, 3, 0.8359375, 0, 4, 1 },
                new double[] { 0.2, 0, 1.19, 0.2, 1, 1.306953125 },
                new double[] { 0.2, 1, 1.306953125, 0.2, 2, 0.95625 },
                new double[] { 0.2, 2, 0.95625, 0.2, 3, 0.879453125 },
                new double[] { 0.2, 3, 0.879453125, 0.2, 4, 1.01 },
                new double[] { 0.4, 0, 1.36, 0.4, 1, 1.3840625 },
                new double[] { 0.4, 1, 1.3840625, 0.4, 2, 1.025 },
                new double[] { 0.4, 2, 1.025, 0.4, 3, 0.9240625 },
                new double[] { 0.4, 3, 0.9240625, 0.4, 4, 1.04 },
                new double[] { 0.6, 0, 1.51, 0.6, 1, 1.442265625 },
                new double[] { 0.6, 1, 1.442265625, 0.6, 2, 1.08125 },
                new double[] { 0.6, 2, 1.08125, 0.6, 3, 0.969765625 },
                new double[] { 0.6, 3, 0.969765625, 0.6, 4, 1.09 },
                new double[] { 0.8, 0, 1.64, 0.8, 1, 1.4815625 },
                new double[] { 0.8, 1, 1.4815625, 0.8, 2, 1.125 },
                new double[] { 0.8, 2, 1.125, 0.8, 3, 1.0165625 },
                new double[] { 0.8, 3, 1.0165625, 0.8, 4, 1.16 },
                new double[] { 1, 0, 1.75, 1, 1, 1.501953125 },
                new double[] { 1, 1, 1.501953125, 1, 2, 1.15625 },
                new double[] { 1, 2, 1.15625, 1, 3, 1.064453125 },
                new double[] { 1, 3, 1.064453125, 1, 4, 1.25 },
                new double[] { 1.2, 0, 1.84, 1.2, 1, 1.5034375 },
                new double[] { 1.2, 1, 1.5034375, 1.2, 2, 1.175 },
                new double[] { 1.2, 2, 1.175, 1.2, 3, 1.1134375 },
                new double[] { 1.2, 3, 1.1134375, 1.2, 4, 1.36 },
                new double[] { 1.4, 0, 1.91, 1.4, 1, 1.486015625 },
                new double[] { 1.4, 1, 1.486015625, 1.4, 2, 1.18125 },
                new double[] { 1.4, 2, 1.18125, 1.4, 3, 1.163515625 },
                new double[] { 1.4, 3, 1.163515625, 1.4, 4, 1.49 },
                new double[] { 1.6, 0, 1.96, 1.6, 1, 1.4496875 },
                new double[] { 1.6, 1, 1.4496875, 1.6, 2, 1.175 },
                new double[] { 1.6, 2, 1.175, 1.6, 3, 1.2146875 },
                new double[] { 1.6, 3, 1.2146875, 1.6, 4, 1.64 },
                new double[] { 1.8, 0, 1.99, 1.8, 1, 1.394453125 },
                new double[] { 1.8, 1, 1.394453125, 1.8, 2, 1.15625 },
                new double[] { 1.8, 2, 1.15625, 1.8, 3, 1.266953125 },
                new double[] { 1.8, 3, 1.266953125, 1.8, 4, 1.81 },
                new double[] { 2, 0, 2, 2, 1, 1.3203125 },
                new double[] { 2, 1, 1.3203125, 2, 2, 1.125 },
                new double[] { 2, 2, 1.125, 2, 3, 1.3203125 },
                new double[] { 2, 3, 1.3203125, 2, 4, 2 },
                new double[] { 0, 0, 1, 0.2, 0, 1.19 },
                new double[] { 0.2, 0, 1.19, 0.4, 0, 1.36 },
                new double[] { 0.4, 0, 1.36, 0.6, 0, 1.51 },
                new double[] { 0.6, 0, 1.51, 0.8, 0, 1.64 },
                new double[] { 0.8, 0, 1.64, 1, 0, 1.75 },
                new double[] { 1, 0, 1.75, 1.2, 0, 1.84 },
                new double[] { 1.2, 0, 1.84, 1.4, 0, 1.91 },
                new double[] { 1.4, 0, 1.91, 1.6, 0, 1.96 },
                new double[] { 1.6, 0, 1.96, 1.8, 0, 1.99 },
                new double[] { 1.8, 0, 1.99, 2, 0, 2 },
                new double[] { 0, 1, 1.2109375, 0.2, 1, 1.306953125 },
                new double[] { 0.2, 1, 1.306953125, 0.4, 1, 1.3840625 },
                new double[] { 0.4, 1, 1.3840625, 0.6, 1, 1.442265625 },
                new double[] { 0.6, 1, 1.442265625, 0.8, 1, 1.4815625 },
                new double[] { 0.8, 1, 1.4815625, 1, 1, 1.501953125 },
                new double[] { 1, 1, 1.501953125, 1.2, 1, 1.5034375 },
                new double[] { 1.2, 1, 1.5034375, 1.4, 1, 1.486015625 },
                new double[] { 1.4, 1, 1.486015625, 1.6, 1, 1.4496875 },
                new double[] { 1.6, 1, 1.4496875, 1.8, 1, 1.394453125 },
                new double[] { 1.8, 1, 1.394453125, 2, 1, 1.3203125 },
                new double[] { 0, 2, 0.875, 0.2, 2, 0.95625 },
                new double[] { 0.2, 2, 0.95625, 0.4, 2, 1.025 },
                new double[] { 0.4, 2, 1.025, 0.6, 2, 1.08125 },
                new double[] { 0.6, 2, 1.08125, 0.8, 2, 1.125 },
                new double[] { 0.8, 2, 1.125, 1, 2, 1.15625 },
                new double[] { 1, 2, 1.15625, 1.2, 2, 1.175 },
                new double[] { 1.2, 2, 1.175, 1.4, 2, 1.18125 },
                new double[] { 1.4, 2, 1.18125, 1.6, 2, 1.175 },
                new double[] { 1.6, 2, 1.175, 1.8, 2, 1.15625 },
                new double[] { 1.8, 2, 1.15625, 2, 2, 1.125 },
                new double[] { 0, 3, 0.8359375, 0.2, 3, 0.879453125 },
                new double[] { 0.2, 3, 0.879453125, 0.4, 3, 0.9240625 },
                new double[] { 0.4, 3, 0.9240625, 0.6, 3, 0.969765625 },
                new double[] { 0.6, 3, 0.969765625, 0.8, 3, 1.0165625 },
                new double[] { 0.8, 3, 1.0165625, 1, 3, 1.064453125 },
                new double[] { 1, 3, 1.064453125, 1.2, 3, 1.1134375 },
                new double[] { 1.2, 3, 1.1134375, 1.4, 3, 1.163515625 },
                new double[] { 1.4, 3, 1.163515625, 1.6, 3, 1.2146875 },
                new double[] { 1.6, 3, 1.2146875, 1.8, 3, 1.266953125 },
                new double[] { 1.8, 3, 1.266953125, 2, 3, 1.3203125 },
                new double[] { 0, 4, 1, 0.2, 4, 1.01 },
                new double[] { 0.2, 4, 1.01, 0.4, 4, 1.04 },
                new double[] { 0.4, 4, 1.04, 0.6, 4, 1.09 },
                new double[] { 0.6, 4, 1.09, 0.8, 4, 1.16 },
                new double[] { 0.8, 4, 1.16, 1, 4, 1.25 },
                new double[] { 1, 4, 1.25, 1.2, 4, 1.36 },
                new double[] { 1.2, 4, 1.36, 1.4, 4, 1.49 },
                new double[] { 1.4, 4, 1.49, 1.6, 4, 1.64 },
                new double[] { 1.6, 4, 1.64, 1.8, 4, 1.81 },
                new double[] { 1.8, 4, 1.81, 2, 4, 2 },
            };

            for (int i = 0; i < r.Length; i++)
            {
                Assert.IsTrue(r[i].SequenceEqual(a[i], e));
            }
        }