Ejemplo n.º 1
0
        /// <summary>
        /// Parsed eine VertexSplit Deklaration.
        /// </summary>
        /// <param name="l">
        /// Die Zeile, die die VertexSplit Deklaration enthält.
        /// </param>
        /// <returns>
        /// Der Vertex-Split Eintrag.
        /// </returns>
        /// <exception cref="InvalidOperationException">
        /// Die VertexSplit Deklaration ist ungültig.
        /// </exception>
        static VertexSplit ParseVertexSplit(string l)
        {
            var m = Regex.Match(l, @"^#vsplit\s+(\d+)\s+{(.*)}\s+{(.*)}\s+{(.*)}$");

            if (!m.Success)
            {
                throw new InvalidOperationException("Invalid vsplit: " + l);
            }
            var s = new VertexSplit()
            {
                S         = uint.Parse(m.Groups[1].Value) - 1,
                SPosition = ParseVector(m.Groups[2].Value),
                TPosition = ParseVector(m.Groups[3].Value)
            };
            var faceIndices = m.Groups[4].Value;
            var matches     = Regex.Matches(faceIndices, @"\((-?\d+)\s+(-?\d+)\s+(-?\d+)\)");

            for (int i = 0; i < matches.Count; i++)
            {
                var _m = matches[i];
                if (!_m.Success)
                {
                    throw new InvalidOperationException("Invalid face index entry in vsplit: " + l);
                }
                var indices = new[] {
                    uint.Parse(_m.Groups[1].Value) - 1,
                    uint.Parse(_m.Groups[2].Value) - 1,
                    uint.Parse(_m.Groups[3].Value) - 1
                };
                s.Faces.Add(new Triangle(indices));
            }
            return(s);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Prüft, ob die angegebene Facette ursprünglich dem angegebenen Vertex "gehörte".
 /// </summary>
 /// <param name="t">
 /// Der Vertex.
 /// </param>
 /// <param name="face">
 /// Die Facette.
 /// </param>
 /// <param name="split">
 /// Die zugehörige VertexSplit Instanz.
 /// </param>
 /// <returns>
 /// Der Facettenindex, an dessen Stelle der ursprüngliche Vertex eingetragen war,
 /// oder -1 falls die Facette nicht ursprünglich dem Vertex "gehörte".
 /// </returns>
 /// <remarks>
 /// Diese Methode könnte schöner sein und sollte eigentlich in 2 Methoden aufgeteilt
 /// werden: Eine Methode zum Prüfen mit Rückgabewert Bool und eine Methode zum
 /// Abfragen des Index. Aus Geschwindigkeitsgründen ist dies aber ungünstig.
 /// </remarks>
 int IsOriginalFaceOfT(uint t, Face face, VertexSplit split)
 {
     foreach (var f in split.Faces)
     {
         var index  = -1;
         var isface = true;
         for (int i = 0; i < 3; i++)
         {
             if (f.Indices[i] == t && face[i] == split.S)
             {
                 index = i;
             }
             else if (f.Indices[i] != face[i])
             {
                 isface = false;
             }
         }
         if (isface)
         {
             return(index);
         }
     }
     return(-1);
 }