public void Translate(Vector3D translationVector) { for (int i = 0; i < this.vertices.Count; i++) { this.vertices[i] += translationVector; } }
public Vector3D GetNormal() { Vector3D center = this.GetCenter(); Vector3D A = new Vector3D(center.X + this.Radius, center.Y, center.Z), B = new Vector3D(center.X, center.Y + this.Radius, center.Z); Vector3D normal = Vector3D.CrossProduct(center - A, center - B); normal.Normalize(); return normal; }
public static double DotProduct(Vector3D a, Vector3D b) { double result = 0; for (int d = 0; d < 3; d++) { result += a[d] * b[d]; } return result; }
public void Scale(Vector3D scaleCenter, double scaleFactor) { for (int i = 0; i < this.vertices.Count; i++) { Vector3D centeredCurrent = this.vertices[i] - scaleCenter; Vector3D scaledCenteredCurrent = centeredCurrent * scaleFactor; this.vertices[i] = scaledCenteredCurrent + scaleCenter; } }
public virtual Vector3D GetCenter() { Vector3D verticesSum = new Vector3D(0, 0, 0); for (int i = 0; i < this.vertices.Count; i++) { verticesSum += this.vertices[i]; } return verticesSum / this.vertices.Count; }
public void RotateInXY(Vector3D rotCenter, double angleDegrees) { for (int i = 0; i < this.vertices.Count; i++) { Vector3D centeredCurrent = this.vertices[i] - rotCenter; double angleRads = angleDegrees * Math.PI / 180.0; Vector3D rotatedCenteredCurrent = new Vector3D( centeredCurrent.X * Math.Cos(angleRads) - centeredCurrent.Y * Math.Sin(angleRads), centeredCurrent.X * Math.Sin(angleRads) + centeredCurrent.Y * Math.Cos(angleRads), centeredCurrent.Z ); this.vertices[i] = rotatedCenteredCurrent + rotCenter; } }
public Cylinder(Vector3D bottom, Vector3D top, double radius) : base(top, bottom) { this.Radius = radius; }
public Circle(Vector3D center, double radius) : base(center) { this.Radius = radius; }
public static Vector3D CrossProduct(Vector3D a, Vector3D b) { double crossX = a.Y * b.Z - a.Z * b.Y; double crossY = a.Z * b.X - a.X * b.Z; double crossZ = a.X * b.Y - a.Y * b.X; return new Vector3D(crossX, crossY, crossZ); }
public static double GetAngleDegrees(Vector3D a, Vector3D b) { return Math.Acos(DotProduct(a, b) / a.Magnitude * b.Magnitude); }
public Triangle(Vector3D a, Vector3D b, Vector3D c) : base(a, b, c) { }
public LineSegment(Vector3D a, Vector3D b) : base(a, b) { this.length = (this.A - this.B).Magnitude; }