Пример #1
0
        public canshu xielv(zuobiao shou, zuobiao wei)//求斜率
        {
            double k, b;
            canshu newcs = new canshu();

            k       = (wei.y - shou.y) / (wei.x - shou.x);
            b       = shou.y - k * shou.x;
            newcs.k = k;
            newcs.b = b;
            return(newcs);
        }
Пример #2
0
        public void Douglas(int number1, int number2)
        {
            int    max = 0;//定义拥有最大距离值的点的编号
            canshu myc = new canshu();

            myc = xielv((zuobiao)myar[number1], (zuobiao)myar[number2 - 1]);
            double maxx  = distance((zuobiao)myar[number1 + 1], myc);                                   //假设第二个点为最大距离点
            double yuzhi = Convert.ToInt32(textBox1.Text);                                              //设阈值

            for (int i = number1 + 1; i < number2 - 1; i++)                                             //从第二个点遍历到最后一个点前方的点
            {
                if (distance((zuobiao)myar[i], myc) > yuzhi && distance((zuobiao)myar[i], myc) >= maxx) //找出拥有最大距离的点
                {
                    max  = i;
                    maxx = distance((zuobiao)myar[i], myc);
                }
            }
            if (max == 0)//若不存在最大距离点,则只将首尾点存入arraylist,结束这一次的道格拉斯抽稀
            {
                newar.Add((zuobiao)myar[number2 - 1]);
                return;
            }
            else if (number1 + 1 == max && number2 - 2 != max)//如果第二个点是最大距离点,则以下一个点和尾点作为参数进行道格拉斯抽稀释
            {
                Douglas(max + 1, number2);
            }
            else if (number2 - 2 == max && number1 + 1 != max)//<span style="font-family: Arial;">如果倒数第二个点是最大距离点,则以首点和倒数第三点作为参数进行道格拉斯抽稀  lt;/span>
            {
                Douglas(0, max + 1);
            }
            else if (number1 + 1 == max && number2 - 2 == max)//如果首点尾点夹住最大距离点,则将最大距离点和尾点存入arraylist
            {
                newar.Add((zuobiao)myar[max]);
                newar.Add((zuobiao)myar[max + 1]);
                return;
            }
            else
            {
                Douglas(number1, max + 1);
                Douglas(max, number2);
            }
        }
Пример #3
0
        public double distance(zuobiao dot, canshu cs)//求点到直线距离
        {
            double dis = (Math.Abs(cs.k * dot.x - dot.y + cs.b)) / Math.Sqrt(cs.k * cs.k + 1);

            return(dis);
        }