Exemplo n.º 1
0
        SF2 DrainageMonoDirr()
        {
            SF2 res = new SF2(this, 1);

            List <SP2> fieldcopy = getFieldCopy();

            fieldcopy.Sort((x, y) => y.CompareTo(x));

            for (int i = 0; i < fieldcopy.Count(); i++)
            {
                ResultCheckSlope result = CheckSlope(fieldcopy[i]);

                if (result.nb > 0)
                {
                    float sp = res.at(fieldcopy[i].pos.x, fieldcopy[i].pos.y);
                    for (int ind = 0; ind < result.nb; ind++)
                    {
                        float curr = res.at(result.q[ind].pos.x, result.q[ind].pos.y);
                        float set  = curr + (sp * result.avSlope[ind]);
                        set = Mathf.Clamp(set, 0, 1000);
                        res.setAt(result.q[ind].pos.x, result.q[ind].pos.y, set);
                        if (res.min > set)
                        {
                            res.min = set;
                        }
                        if (res.max < set)
                        {
                            res.max = set;
                        }
                    }
                }
            }

            return(res);
        }
Exemplo n.º 2
0
        private ResultCheckSlope CheckSlope(SP2 p)//, List<SP2> listSP2
        {
            ResultCheckSlope res = new ResultCheckSlope();

            float slopesum = 0f;
            float zp       = p.val;

            for (int i = -1; i < 1; i++)
            {
                for (int j = -1; j < 1; j++)
                {
                    if (i == 0 && j == 0)
                    {
                        continue;
                    }
                    if (p.pos.x + i <= 0 || p.pos.x + i >= nx - 1 || p.pos.y + j <= 0 || p.pos.y + j >= ny - 1)
                    {
                        continue;
                    }
                    float step = this.at(p.pos.x + i, p.pos.y + j) - zp;
                    if (step < 0f)
                    {
                        if ((i + j) % 2 != 0)
                        {
                            res.slope[res.nb] = -step;
                        }
                        else
                        {
                            res.slope[res.nb] = -step / Mathf.Sqrt(2);
                        }

                        slopesum     += res.slope[res.nb];
                        res.q[res.nb] = new SP2(this.at(p.pos.x + i, p.pos.y + j), new Vector2Int(p.pos.x + i, p.pos.y + j));
                        res.nb++;
                    }
                }
            }

            for (int i = 0; i < res.nb; i++)
            {
                res.avSlope[i] = res.slope[i] / slopesum;
            }

            return(res);
        }