示例#1
0
        private int FindUpSum()
        {
            TriTree tree = new TriTree();

            tree.SetData(mDataList);

            return(tree.SumMaxValue());
        }
 public SCTriangleCrosshatchGenerator(
     MachineConfig machineConfig,
     GeneratorConfig generatorConfig,
     TriTree <PixelTriData> triTree,
     BitMapPointGenerator bitMapPointGenerator) :
     base(machineConfig, bitMapPointGenerator.inputImageBox, generatorConfig)
 {
     this.triTree              = triTree;
     this.BaseFileName         = bitMapPointGenerator.GetBaseName();
     this.bitMapPointGenerator = bitMapPointGenerator;
 }
示例#3
0
        public static string DebugTree(TriTree tritree)
        {
            string s = "";

            for (int i = 0; i < tritree.tris.Count; i++)
            {
                s += DebugTree(tritree.tris[i]);
            }
            s += tritree.index.ToString();
            return(s);
        }
示例#4
0
    private void SplittingTrianglesIntoGroups()
    {
        int k = 0, kk = 0;

        int verCount = _vertices.Count;
        int triCount = _triangles.Count;

        _verData = new List <ushort> [verCount];
        for (int i = 0; i < verCount; i++)
        {
            _verData[i] = new List <ushort>();
        }
        for (int i = 0; i < triCount; i++)
        {
            _verData[_triangles[i]].Add((ushort)(i / 3));
        }
        _triData = new TriTree[triCount / 3];
        for (int i = 0; i < triCount / 3; i++)
        {
            _triData[i] = new TriTree(i);
        }


        for (int i = 0; i < _notPolyLineIndex.Length; i++)
        {
            for (k = 0; k < _verData[_notPolyLineIndex[i]].Count; k++)
            {
                for (kk = k + 1; kk < _verData[_notPolyLineIndex[i]].Count; kk++)
                {
                    _triData[_verData[_notPolyLineIndex[i]][k]].AddList(_triData[_verData[_notPolyLineIndex[i]][kk]]);
                }
            }
        }

        for (int i = 0; i < _polyLineIndex.Length; i++)
        {
            if (_polyLineIndex[i] == -1)
            {
                continue;
            }
            for (k = 0; k < _verData[_polyLineIndex[i]].Count; k++)
            {
                for (kk = k + 1; kk < _verData[_polyLineIndex[i]].Count; kk++)
                {
                    if (CheckTriConnectionForLinePoints(_verData[_polyLineIndex[i]][k], _verData[_polyLineIndex[i]][kk]))
                    {
                        _triData[_verData[_polyLineIndex[i]][k]].AddList(_triData[_verData[_polyLineIndex[i]][kk]]);
                    }
                }
            }
        }
    }
示例#5
0
        public void AddList(TriTree added)
        {
            while (added.prev != null)
            {
                added = added.prev;
            }
            TriTree thisStart = this;

            while (thisStart.prev != null)
            {
                thisStart = thisStart.prev;
            }

            if (added.index != thisStart.index)
            {
                thisStart.tris.Add(added);
                added.prev = thisStart;
            }
        }
示例#6
0
 private void MakeTrianglesGroupRec(TriTree tri)
 {
     for (int i = 0; i < 3; i++)
     {
         int ind = verList.IndexOf(_triangles[tri.index * 3 + i]);
         if (ind == -1)
         {
             verout.Add(_vertices[_triangles[tri.index * 3 + i]]);
             verList.Add(_triangles[tri.index * 3 + i]);
             triout.Add((ushort)(verout.Count - 1));
         }
         else
         {
             triout.Add((ushort)ind);
         }
     }
     for (int i = 0; i < tri.tris.Count; i++)
     {
         MakeTrianglesGroupRec(tri.tris[i]);
     }
 }
        public TriTree <PixelTriData> getPixelTriTree(float scale = 1f)
        {
            //TSPPointSets psets = new TSPPointSets();

            Box2f imageBox = new Box2f
            {
                min = new Vector2f(0f, 0f),
                max = new Vector2f(texture.width, texture.height) * scale
            };
            var triTree = TriTree <PixelTriData> .TreeToContainBox <PixelTriData>(imageBox, tspProbMaxCities);

            //triTree.deviationThreshold = deviationThreshold;

            var tex = texture;

            if (tex == null)
            {
                Debug.Log("null. bmap name: " + bmapName);
                return(null);
            }

            Color    pix;
            Vector2f v;

            for (int x = 0; x < tex.width; ++x)
            {
                for (int y = 0; y < tex.height; ++y)
                {
                    pix = tex.GetPixel(x, y);
                    //
                    // TODO: handle grey scale images
                    // Tricky: define regions based on blobs of pixels of similar grey-ness
                    // Would help if: triangle regions (or square regions) could join themselves into sets (of similar grey levels)?
                    // Try: divide picture into 'a lot' of triangles
                    // At some point, each triangle should check it's members for tonal homogeneity.
                    // If not enough homogeneity, divide again.
                    // This would include white pixels!
                    // With this set of homogeneous tone triangles
                    // cull the points in each set based on median tone.
                    // lighter tone, more points get culled
                    // cull by again dividing the triangle, fewer times for lighter
                    // each sub triangle gives only one point. (perhaps the average)
                    // Sufficiently dark tonal regions can skip the second divide: we just want all of their points.
                    // Sufficiently filled triangles can skip the averaging, just provide the center point.
                    //
                    //if(pix.grayscale < MaxGrayScale)
                    //{
                    v = new Vector2f(x * scale, y * scale);
                    var tri = triTree.root.Add(new PixelTriData(new PixelV {
                        pos   = v,
                        color = pix
                    }));

                    if (tri != null)
                    {
                        tri.DivideR((IsoTriangle <PixelTriData> _tri) =>
                        {
                            return(TriShouldSplit(_tri));
                        });
                    }

                    //}
                }
            }

            return(triTree);
        }