/// <summary> /// Initializes a new instance of the Cube3D class /// </summary> /// <param name="faces">Faces</param> /// <param name="position">Position</param> public Cube3D(IEnumerable<Face3D> faces, CubeFlag position, Point3D location, double scale) { this.Faces = faces; this.Position = position; this.Location = location; this.Scale = scale; }
// *** METHODS *** /// <summary> /// Rotates the point around a particular axis /// </summary> /// <param name="type">Rotation axis</param> /// <param name="angleInDeg">Angle to be rotated</param> public void Rotate(RotationType type, double angleInDeg) { // Rotation matrix: http://de.wikipedia.org/wiki/Drehmatrix double rad = angleInDeg * Math.PI / 180; double cosa = Math.Cos(rad); double sina = Math.Sin(rad); Point3D old = new Point3D(this.X, this.Y, this.Z); switch (type) { case RotationType.X: this.Y = old.Y * cosa - old.Z * sina; this.Z = old.Y * sina + old.Z * cosa; break; case RotationType.Y: this.X = old.Z * sina + old.X * cosa; this.Z = old.Z * cosa - old.X * sina; break; case RotationType.Z: this.X = old.X * cosa - old.Y * sina; this.Y = old.X * sina + old.Y * cosa; break; } }
// *** METHODS *** /// <summary> /// Rotates the point around a particular axis /// </summary> /// <param name="type">Rotation axis</param> /// <param name="angle">Angle to be rotated</param> /// <param name="center">Center point of rotation</param> public Cube3D Rotate(RotationType type, double angle, Point3D center) { //Deep Clone var faces = new List<Face3D>(); foreach (var f2 in from f in this.Faces let edges = f.Vertices.Select(p => new Point3D(p.X, p.Y, p.Z)).ToList() select new Face3D(edges, f.Color, f.Position, f.MasterPosition)) { f2.Vertices.ToList().ForEach(e => { e.X -= center.X; e.Y -= center.Y; e.Z -= center.Z; }); f2.Rotate(type, angle); f2.Vertices.ToList().ForEach(e => { e.X += center.X; e.Y += center.Y; e.Z += center.Z; }); faces.Add(f2); } return new Cube3D(faces, this.Position, this.Location, this.Scale); }
// *** CONSTRUCTOR *** /// <summary> /// Initializes a new instance of the Cube3D class /// </summary> /// <param name="location">Center point</param> /// <param name="scale">Scale</param> /// <param name="position">Position</param> /// <param name="faces">Faces</param> public Cube3D(Point3D location, double scale, CubeFlag position, IEnumerable<Face> faces) { this.Faces = UniCube.GenFaces3D(position); this.Position = position; this.Location = location; this.Scale = scale; this.Faces.ToList().ForEach(f => { f.Color = faces.First(face => face.Position == f.Position).Color; f.Vertices.ToList().ForEach(e => { e.X *= scale; e.Y *= scale; e.Z *= scale; //scale e.X += location.X; e.Y += location.Y; e.Z += location.Z; //translate }); }); }
// *** METHODS *** /// <summary> /// Rotates the point around a particular axis /// </summary> /// <param name="type">Rotation axis</param> /// <param name="angle">Angle to be rotated</param> /// <param name="center">Center point of rotation</param> public Cube3D Rotate(RotationType type, double angle, Point3D center) { //Deep Clone List<Face3D> faces = new List<Face3D>(); foreach (Face3D f in Faces) { List<Point3D> edges = new List<Point3D>(); foreach (Point3D p in f.Vertices) { edges.Add(new Point3D(p.X, p.Y, p.Z)); } Face3D f2 = new Face3D(edges, f.Color, f.Position, f.MasterPosition); f2.Vertices.ToList().ForEach(e => { e.X -= center.X; e.Y -= center.Y; e.Z -= center.Z; }); f2.Rotate(type, angle); f2.Vertices.ToList().ForEach(e => { e.X += center.X; e.Y += center.Y; e.Z += center.Z; }); faces.Add(f2); } return new Cube3D(faces, this.Position, this.Location,this.Scale); }