public void AddRange(Vector3DCollection x) { for (int i = 0; i < x.Count; ++i) { Add(x[i]); } }
object ICloneable.Clone() { Vector3DCollection c = new Vector3DCollection(); c._size = this._size; c._data = (T[])_data.Clone(); return(c); }
/// <summary> /// Optimize the polygon by removing coincident points /// and collinear points. /// </summary> /// <returns>The number of points removed</returns> public int Optimize() { int pointsRemoved = 0; // remove coincident points if (this.Points.Count >= 2) { int count = _points.Count; Vector3DCollection newPoints = new Vector3DCollection(); for (int i = 0; i < count; i++) { Vector3D pt0 = _points[(i + count - 1) % count]; Vector3D pt1 = _points[i]; if ((pt1 - pt0).GetMagnitude() > Math3D.EpsilonF) { newPoints.Add(pt1); } } Debug.Assert(newPoints.Count <= _points.Count); if (newPoints.Count < _points.Count) { pointsRemoved += _points.Count - newPoints.Count; _points = newPoints; } } // remove collinear points if (this.Points.Count >= 3) { int count = _points.Count; Vector3DCollection newPoints = new Vector3DCollection(); for (int i = 0; i < count; i++) { Vector3D pt0 = _points[(i + count - 1) % count]; Vector3D pt1 = _points[i]; Vector3D pt2 = _points[(i + 1) % count]; if (Vector3D.Orientation(pt0, pt1, pt2) != 0) { newPoints.Add(pt1); } } Debug.Assert(newPoints.Count <= _points.Count); if (newPoints.Count < _points.Count) { pointsRemoved += _points.Count - newPoints.Count; _points = newPoints; } } return(pointsRemoved); }
/// <summary> /// Create a new polygon with a set of points /// </summary> /// <param name="points"></param> public Polygon3D(Vector3DCollection points) { Debug.Assert(points != null); _points.AddRange(points); }
public Vector3DCollection(Vector3DCollection x) { _data = new T[x.Count * 2]; AddRange(x); }
public Vector3DEnumerator(Vector3DCollection col) { temp = col; cursor = -1; }
//-------------------------------------------------------------------------------- /// <summary> /// Clip the given polygon by the plane so that only the regions /// located positive of the plane remain. /// </summary> /// <param name="polygon"></param> public void ClipPolygon(Polygon3D polygon) { Vector3D ptNormal = polygon.GetNormal(); Vector3DCollection vNewPoints = new Vector3DCollection(); int iPoints = polygon.Points.Count; for (int i = 0; i < iPoints; i++) { Vector3D pt0 = polygon.Points[(i + iPoints - 1) % iPoints]; Vector3D pt1 = polygon.Points[i]; int sign0 = (int)Math3D.GetSign(this.GetDistanceToPlane(pt0), Math3D.EpsilonF); int sign1 = (int)Math3D.GetSign(this.GetDistanceToPlane(pt1), Math3D.EpsilonF); if (sign0 > 0) { // line is infront if (sign1 >= 0) { vNewPoints.Add(pt1); } // line is entering plane else if (sign1 < 0) { Debug.Assert(sign0 > 0 && sign1 < 0); vNewPoints.Add(this.GetIntersection(pt0, pt1)); } } else if (sign0 == 0) { // line is infront if (sign1 > 0) { vNewPoints.Add(pt1); } // line is coplanar else if (sign1 == 0) { vNewPoints.Add(pt1); } // line is behind else if (sign1 < 0) { } } else if (sign0 < 0) { // line is leaving plane if (sign1 > 0) { Debug.Assert(sign0 < 0 && sign1 > 0); vNewPoints.Add(this.GetIntersection(pt0, pt1)); vNewPoints.Add(pt1); } // line is leaving plane else if (sign1 == 0) { vNewPoints.Add(pt1); } // line is behind else if (sign1 < 0) { } } } // set new points polygon.Points.Clear(); polygon.Points.AddRange(vNewPoints); /*if( this.Points.Count >= 3 ) { * if( Vector3D.Dot( this.GetNormal(), ptNormal ) < 0 ) { * this.Flip(); * } * } */ polygon.Optimize(); }