예제 #1
0
 public Vertexes GetRange2d(Double BeginLen, Double EndLen)
 {
     Vertexes Res = new Vertexes();
     Double SumLen = 0.0;
     Double Begin = Math.Min(BeginLen, EndLen);
     Double End = Math.Max(BeginLen, EndLen);
     Double CurL;
     Boolean BeginUsed = false;
     for (Int32 i = 0; i < Count - 1; i++)
     {
         if (BeginUsed) Res.Add(this[i]);
         Vertex Vect = (this[i + 1] - this[i]).Normalize(out CurL);
         if (!BeginUsed && (CurL + SumLen > Begin))
         {
             BeginUsed = true;
             Res.Add(this[i] + Vect * (CurL + SumLen - Begin));
         }
         if (BeginUsed && (CurL + SumLen > End))
         {
             Res.Add(this[i] + Vect * (CurL + SumLen - End));
             break;
         }
         SumLen += CurL;
     }
     if (!BeginUsed) return null;
     return Res;
 }
예제 #2
0
 public Vertexes Clone()
 {
     Vertexes Result = new Vertexes();
     Result.Count = Count;
     for (Int32 i = 0; i < Count; i++)
         Result[i] = this[i].Clone();
     return Result;
 }
예제 #3
0
 public Vertexes DeleteDuplicates()
 {
     Int32 n = 0;
     Vertexes Result = new Vertexes();
     Result.Count = Count;
     Boolean[] B = new Boolean[Count];
     for (Int32 i = 0; i < Count; i++)
         if (!B[i])
         {
             for (Int32 j = i + 1; j < Count; j++)
                if (this[i].Equal(this[j])) B[j] = true;
             Result[n] = this[i];
             n++;
         }
     Result.Count = n;
     return Result;
 }
예제 #4
0
 public Vertexes Smooth(Double step)
 {
     Vertexes Result = new Vertexes();
     List<Double> Dists = new List<Double>();
     Dists.Add(0);
     for (Int32 i = 1; i < Count; i++)
        Dists.Add(Dists[i-1]+this[i-1].LengthTo(this[i]));
     Int32 m = (Int32)(Dists[Dists.Count-1]/step) + 1;
     for (Int32 i = 1; i <= m; i++)
     {
         Double Len = i * step;
         for (Int32 j = 1; j < Count; j++)
         {
             if (Dists[j] < Len) continue;
             Vertex Vect = (this[j] - this[j-1]).Normalize();
             Result.Add(this[j-1] + Vect * (Len - Dists[j-1]));
             break;
         }
     }
    return Result;
 }
예제 #5
0
 public Vertexes Offset(Double Dist)
 {
     Vertexes Result = new Vertexes();
     Line PrevLine = null;
     for (Int32 i = 0; i < Count; i++)
     {
         Line Line = null;
         if (i == Count - 1)
         {
             Vertex Vector = (this[i] - this[i-1]).Normalize();
             Vector = Vector.RotateZ(Math.PI / 2) * Dist;
             Result.Add(this[i] + Vector);
             break;
         }
         if (i == 0)
         {
             Vertex Vector = (this[i + 1] - this[i]).Normalize();
             Vector = Vector.RotateZ(Math.PI/2) * Dist;
             Result.Add(this[i] + Vector);
             Line = new Line((this[i + 1] - this[i]).Normalize(), this[i] + Vector);
         }
         else
         {
             Vertex Vector = (this[i + 1] - this[i]).Normalize();
             Vector = Vector.RotateZ(Math.PI / 2) * Dist;
             Line = new Line((this[i + 1] - this[i]).Normalize(), this[i] + Vector);
             Vertex point = new Vertex();
             if (Line.Cross2d(PrevLine, ref point))
             {
                 Result.Add(point);
             }
         }
         PrevLine = new Line(Line.Direction, Line.Point);
     }
     return Result;
 }
예제 #6
0
파일: Rect.cs 프로젝트: stdcallua/Robots
 public Boolean VertexesIn(Vertexes V)
 { 
     for (Int32 i = 0; i < V.Count; i++)
         if (VertexIn(V[i])) return true;
     return false;
 }