コード例 #1
0
 protected Scene(
     HomogeneousPoint3D observer,
     int distanceBetweenScreenAndObserver)
 {
     _observerPosition = observer;
     _distanceBetweenScreenAndObserver = distanceBetweenScreenAndObserver;
 }
コード例 #2
0
 public SingleObjectScene(
     HomogeneousPoint3D observer,
     IPolyhedron3D initialObject,
     int distanceBetweenScreenAndObserver) : base(observer, distanceBetweenScreenAndObserver)
 {
     AddObject(initialObject);
 }
コード例 #3
0
        public static IPolyhedron3D CreateCubes(
            double a, double b, double c,
            HomogeneousPoint3D geometricCenter,
            HomogeneousPoint3D rotationCenter)
        {
            var cubes = new List <IPolyhedron3D>
            {
                CreateParallelepiped(
                    a, b, c,
                    new HomogeneousPoint3D(0, 0, 0, 1),
                    new HomogeneousPoint3D(rotationCenter.X, rotationCenter.Y, rotationCenter.Z, rotationCenter.W),
                    new [] { 1, 2, 4 }),
                CreateParallelepiped(
                    a, b, c,
                    new HomogeneousPoint3D(a, 0, 0, 1),
                    new HomogeneousPoint3D(rotationCenter.X, rotationCenter.Y, rotationCenter.Z, rotationCenter.W),
                    new [] { 3 }),
                CreateParallelepiped(
                    a, b, c,
                    new HomogeneousPoint3D(0, 0, c, 1),
                    new HomogeneousPoint3D(rotationCenter.X, rotationCenter.Y, rotationCenter.Z, rotationCenter.W),
                    new [] { 0 }),
                CreateParallelepiped(
                    a, b, c,
                    new HomogeneousPoint3D(0, -b, 0, 1),
                    new HomogeneousPoint3D(rotationCenter.X, rotationCenter.Y, rotationCenter.Z, rotationCenter.W),
                    new [] { 5 }),
            };

            var result = new CompositePolyhedron3D(rotationCenter, new HomogeneousPoint3D(a / 2, -b / 2, c / 2, 1), cubes, (0, 0));

            MovePolyhedronGeometricCenter(new HomogeneousPoint3D(a / 2, -b / 2, c / 2, 1), geometricCenter, result);

            return(result);
        }
コード例 #4
0
        protected void MoveObserverToTransformation(HomogeneousPoint3D point, IPolyhedron3D obj)
        {
            Matrix affineMatrix = AffineTransformation.MoveOriginTo(point);

            obj.Transform(affineMatrix);
            obj.TransformRotationCenter(affineMatrix);
        }
コード例 #5
0
        public static Matrix RotateAroundAxisAtPoint(Axis3D axis, HomogeneousPoint3D point, double angle)
        {
            var    returnPoint       = new HomogeneousPoint3D(-point.X, -point.Y, -point.Z, point.W);
            Matrix moveOriginToPoint = MoveOriginTo(point);
            Matrix rotationMatrix;
            Matrix returnOrigin = MoveOriginTo(returnPoint);

            switch (axis)
            {
            case Axis3D.OX:
                rotationMatrix = RotateAroundXAxis(angle);
                break;

            case Axis3D.OY:
                rotationMatrix = RotateAroundYAxis(angle);
                break;

            case Axis3D.OZ:
                rotationMatrix = RotateAroundZAxis(angle);
                break;

            default:
                throw new ArgumentException("Unknown axis");
            }

            return(returnOrigin.MultiplyBy(rotationMatrix.MultiplyBy(moveOriginToPoint)));
        }
コード例 #6
0
 /// <summary>
 /// Creates <see cref="IPolyhedron3D"/> object with specified parameters.
 /// </summary>
 /// <param name="a">Size along OX axis.</param>
 /// <param name="b">Size along OY axis.</param>
 /// <param name="c">Size along OZ axis.</param>
 /// <param name="geometricCenter">Geometric center of figure.</param>
 /// <param name="rotationCenter">Rotation center of figure.</param>
 /// <returns></returns>
 public static IPolyhedron3D CreateSingleSimplePolyhedron(
     double a, double b, double c,
     HomogeneousPoint3D geometricCenter,
     HomogeneousPoint3D rotationCenter)
 {
     return(CreateParallelepiped(a, b, c, geometricCenter, rotationCenter, new int[0]));
 }
コード例 #7
0
 /// <summary>
 /// Creates <see cref="IPolyhedron3D"/> object with specified parameters.
 /// </summary>
 /// <param name="a">Size along OX axis.</param>
 /// <param name="b">Size along OY axis.</param>
 /// <param name="c">Size along OZ axis.</param>
 /// <param name="geometricCenter">Geometric center of figure.</param>
 /// <param name="rotationCenter">Rotation center of figure.</param>
 /// <returns></returns>
 public static IPolyhedron3D CreateCompositePolyhedron(
     double a, double b, double c,
     HomogeneousPoint3D geometricCenter,
     HomogeneousPoint3D rotationCenter)
 {
     return(CreateParallelepipedWithHole(a, b, c, geometricCenter, rotationCenter, 0, false));
 }
コード例 #8
0
 /// <summary>
 /// Creates <see cref="IPolyhedron3D"/> object with specified parameters.
 /// </summary>
 /// <param name="a">Size along OX axis.</param>
 /// <param name="b">Size along OY axis.</param>
 /// <param name="c">Size along OZ axis.</param>
 /// <param name="geometricCenter">Geometric center of figure.</param>
 /// <param name="rotationCenter">Rotation center of figure.</param>
 /// <param name="distance">Distance from Origin to each polyhedron geometric center.</param>
 /// <returns></returns>
 public static IPolyhedron3D CreateManySimplePolyhedrons(
     double a, double b, double c,
     HomogeneousPoint3D geometricCenter,
     HomogeneousPoint3D rotationCenter,
     double distance)
 {
     return(CreateParallelepipedWithHole(a, b, c, geometricCenter, rotationCenter, distance, true));
 }
コード例 #9
0
        public MultipleObjectsScene(
            HomogeneousPoint3D observer,
            IPolyhedron3D initialObject,
            int distanceBetweenScreenAndObserver) : base(observer, distanceBetweenScreenAndObserver)
        {
            _objects = new List <IPolyhedron3D>();

            AddObject(initialObject);
        }
コード例 #10
0
        /// <inheritdoc />
        public override void MoveObserverTo(HomogeneousPoint3D point)
        {
            foreach (var o in _objects)
            {
                MoveObserverToTransformation(point, o);
            }

            _observerPosition = _observerPosition.Add(point);
        }
コード例 #11
0
        private static IPolyhedron3D CreateParallelepipedWithHole(
            double a, double b, double c,
            HomogeneousPoint3D geometricCenter,
            HomogeneousPoint3D rotationCenter,
            double distance, bool showInvisibleFacets)
        {
            var parallelepiped = new List <IPolyhedron3D>
            {
                CreateParallelepiped(
                    a / 3, b, c / 3,
                    new HomogeneousPoint3D(0, 0, -2 * c / 6 - distance, 1),
                    new HomogeneousPoint3D(rotationCenter.X, rotationCenter.Y, rotationCenter.Z, rotationCenter.W),
                    showInvisibleFacets ? new int[0] : new [] { 2, 3 }),
                CreateParallelepiped(
                    a / 3, b, c / 3,
                    new HomogeneousPoint3D(0, 0, 2 * c / 6 + distance, 1),
                    new HomogeneousPoint3D(rotationCenter.X, rotationCenter.Y, rotationCenter.Z, rotationCenter.W),
                    showInvisibleFacets ? new int[0] : new [] { 2, 3 }),
                CreateParallelepiped(
                    a / 3, b, c / 3,
                    new HomogeneousPoint3D(-2 * a / 6 - distance, 0, 0, 1),
                    new HomogeneousPoint3D(rotationCenter.X, rotationCenter.Y, rotationCenter.Z, rotationCenter.W),
                    showInvisibleFacets ? new int[0] : new [] { 0, 1 }),
                CreateParallelepiped(
                    a / 3, b, c / 3,
                    new HomogeneousPoint3D(2 * a / 6 + distance, 0, 0, 1),
                    new HomogeneousPoint3D(rotationCenter.X, rotationCenter.Y, rotationCenter.Z, rotationCenter.W),
                    showInvisibleFacets ? new int[0] : new [] { 0, 1 }),
                CreateParallelepiped(
                    a / 3, b, c / 3,
                    new HomogeneousPoint3D(-2 * a / 6 - distance, 0, -2 * c / 6 - distance, 1),
                    new HomogeneousPoint3D(rotationCenter.X, rotationCenter.Y, rotationCenter.Z, rotationCenter.W),
                    showInvisibleFacets ? new int[0] : new [] { 1, 2 }),
                CreateParallelepiped(
                    a / 3, b, c / 3,
                    new HomogeneousPoint3D(2 * a / 6 + distance, 0, -2 * c / 6 - distance, 1),
                    new HomogeneousPoint3D(rotationCenter.X, rotationCenter.Y, rotationCenter.Z, rotationCenter.W),
                    showInvisibleFacets ? new int[0] : new [] { 1, 3 }),
                CreateParallelepiped(
                    a / 3, b, c / 3,
                    new HomogeneousPoint3D(2 * a / 6 + distance, 0, 2 * c / 6 + distance, 1),
                    new HomogeneousPoint3D(rotationCenter.X, rotationCenter.Y, rotationCenter.Z, rotationCenter.W),
                    showInvisibleFacets ? new int[0] : new [] { 0, 3 }),
                CreateParallelepiped(
                    a / 3, b, c / 3,
                    new HomogeneousPoint3D(-2 * a / 6 - distance, 0, 2 * c / 6 + distance, 1),
                    new HomogeneousPoint3D(rotationCenter.X, rotationCenter.Y, rotationCenter.Z, rotationCenter.W),
                    showInvisibleFacets ? new int[0] : new [] { 0, 2 }),
            };

            var result = new CompositePolyhedron3D(rotationCenter, new HomogeneousPoint3D(0, 0, 0, 1), parallelepiped, (0, 1));

            MovePolyhedronGeometricCenter(new HomogeneousPoint3D(0, 0, 0, 1), geometricCenter, result);

            return(result);
        }
コード例 #12
0
        public static Matrix MoveOriginTo(HomogeneousPoint3D point)
        {
            Matrix result = GetZeroMatrix();

            result[0, 3] = -point.X;
            result[1, 3] = -point.Y;
            result[2, 3] = -point.Z;

            return(result);
        }
コード例 #13
0
        private static void MovePolyhedronGeometricCenter(HomogeneousPoint3D currentCenter,
                                                          HomogeneousPoint3D needCenter, IPolyhedron3D polyhedron)
        {
            var originPoint = new HomogeneousPoint3D(
                currentCenter.X - needCenter.X,
                currentCenter.Y - needCenter.Y,
                currentCenter.Z - needCenter.Z,
                needCenter.W);
            Matrix affineMatrix = AffineTransformation.MoveOriginTo(originPoint);

            polyhedron.Transform(affineMatrix);
        }
コード例 #14
0
        public override void AddObject(IPolyhedron3D obj)
        {
            _objects.Add(obj);

            CalculateObjectsPosition();

            _compositeObject = new CompositePolyhedron3D(
                new HomogeneousPoint3D(0, 0, 0, 1),
                new HomogeneousPoint3D(0, 0, 0, 1),
                _objects.ToArray(),
                (0, 0));

            _observerPosition = new HomogeneousPoint3D(0, 0, -Radius, 1);
            MoveObserverToTransformation(_observerPosition, _compositeObject);
        }
コード例 #15
0
        /// <summary>
        /// 0 - Front
        /// 1 - Back
        /// 2 - Right
        /// 3 - Left
        /// 4 - Top
        /// 5 - Bottom
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="c"></param>
        /// <param name="geometricCenter"></param>
        /// <param name="rotationCenter"></param>
        /// <param name="notVisibleFacets"></param>
        /// <returns></returns>
        private static IPolyhedron3D CreateParallelepiped(
            double a, double b, double c,
            HomogeneousPoint3D geometricCenter,
            HomogeneousPoint3D rotationCenter,
            int[] notVisibleFacets)
        {
            var allFacets = new List <int[]>
            {
                new[] { 0, 4, 7, 3 },
                new[] { 1, 2, 6, 5 },
                new[] { 7, 6, 2, 3 },
                new[] { 0, 1, 5, 4 },
                new[] { 0, 3, 2, 1 },
                new[] { 4, 5, 6, 7 },
            };
            var visibleFacets = new List <int[]>();

            for (int i = 0; i < allFacets.Count; i++)
            {
                if (!notVisibleFacets.Contains(i))
                {
                    visibleFacets.Add(allFacets[i]);
                }
            }

            var parallelepiped = new SimplePolyhedron3D(
                rotationCenter, new HomogeneousPoint3D(a / 2, b / 2, c / 2, 1),
                new[]
            {
                new HomogeneousPoint3D(0, 0, 0, 1),
                new HomogeneousPoint3D(0, 0, c, 1),
                new HomogeneousPoint3D(a, 0, c, 1),
                new HomogeneousPoint3D(a, 0, 0, 1),
                new HomogeneousPoint3D(0, b, 0, 1),
                new HomogeneousPoint3D(0, b, c, 1),
                new HomogeneousPoint3D(a, b, c, 1),
                new HomogeneousPoint3D(a, b, 0, 1),
            }, visibleFacets, (0, 6));

            MovePolyhedronGeometricCenter(new HomogeneousPoint3D(a / 2, b / 2, c / 2, 1), geometricCenter, parallelepiped);

            return(parallelepiped);
        }
コード例 #16
0
        public static IPolyhedron3D CreatePolyhedron(
            PolyhedronType type,
            HomogeneousPoint3D geometricCenter,
            HomogeneousPoint3D rotationCenter,
            params double[] args)
        {
            switch (type)
            {
            case PolyhedronType.Parallelepiped:
                return(CreateSingleSimplePolyhedron(
                           args[0], args[0], args[0],
                           geometricCenter,
                           rotationCenter));

            case PolyhedronType.ParallelepipedWithHole:
                return(CreateCompositePolyhedron(
                           args[0], args[0], args[0],
                           geometricCenter,
                           rotationCenter));

            case PolyhedronType.ManyParallelepipeds:
                return(CreateManySimplePolyhedrons(
                           args[0], args[0], args[0],
                           geometricCenter,
                           rotationCenter,
                           50));

            case PolyhedronType.Cubes:
                return(CreateCubes(
                           args[0] / 2, args[0] / 2, args[0] / 2,
                           geometricCenter,
                           rotationCenter));

            default:
                throw new ArgumentException($"No builder for type {type}");
            }
        }
コード例 #17
0
        //
        // CLOCKWISE
        //
        //      ->--
        //      |  |
        //      |  |
        //      --<-
        //

        //
        // COUNTERCLOCKWISE
        //
        //      -<--
        //      |  |
        //      |  |
        //      -->-
        //

        /// <summary>
        /// Vertexes for facet should be in COUNTERCLOCKWISE order
        /// from point when this facet is visible for observer.
        /// </summary>
        /// <param name="rotationCenter">Rotation center.</param>
        /// <param name="vertexes">List of vertexes.</param>
        /// <param name="facetVertexes">Vertexes for every facet.</param>
        /// <param name="rotationAxis">Vertexes which determines rotation axis.</param>
        public SimplePolyhedron3D(
            HomogeneousPoint3D rotationCenter,
            HomogeneousPoint3D geometricCenter,
            IList <HomogeneousPoint3D> vertexes,
            IEnumerable <IEnumerable <int> > facetVertexes,
            (int startVertexIndex, int endVertexIndex) rotationAxis) : base(rotationCenter, geometricCenter)
コード例 #18
0
 public abstract void MoveObserverTo(HomogeneousPoint3D point);
コード例 #19
0
 /// <inheritdoc />
 public override void MoveObserverTo(HomogeneousPoint3D point)
 {
     MoveObserverToTransformation(point, _object);
     _observerPosition = _observerPosition.Add(point);
 }
コード例 #20
0
 public CompositePolyhedron3D(
     HomogeneousPoint3D rotationCenter,
     HomogeneousPoint3D geometricCenter,
     IList <IPolyhedron3D> polyhedrons,
     (int startIndex, int endIndex) rotationAxis) : base(rotationCenter, geometricCenter)