Пример #1
0
 public static void refresh_picture_points(main_form form)
 {
     form.paint(0, 0, true); //очищаем экран
     if (form.display_cros_chb.Checked && form.display_dots_chb.Checked)
     {
         form.draw_points(g, sol.cros, Color.Green); //пересечения - обвод
     }
     if (form.display_end_chb.Checked && form.display_dots_chb.Checked)
     {
         form.draw_points(g, sol.tops, Color.Yellow); //вершины - обвод
     }
     if (form.display_skel_chb.Checked)
     {
         form.draw_group(g, skel_mod, Color.Gray); //скелет
     }
     if (form.display_cros_chb.Checked)
     {
         form.draw_group(g, sol.cros, Color.Red); //точки пересечения
     }
     if (form.display_end_chb.Checked)
     {
         form.draw_group(g, sol.tops, Color.Pink); //точки вершин
     }
     draw_border(form);                            //границы
     if (form.display_sharp_chb.Checked)
     {
         form.draw_sharp(g, sharp, Color.MediumPurple); //отрисовываем решётку
     }
 }
Пример #2
0
            public static void solve(main_form form)
            {
                sol_begin = true;

                sol = new solution(form.bmp);
                sol.load_templates(form);
                g = Graphics.FromImage(form.picture.Image);

                sol.find_borders(); //ищем границы

                int r = 0;          //начальный радиус

                if (form.make_soft_chb.Checked)
                {
                    sol.delete_borders(1);
                    r = 2;
                }


                //int r_ = (int)r_NUD.Value;
                //int lim = (int)lim_NUD.Value;
                //bool kkk = true;
                while (sol.iteration(r))    //пока есть точки, которые можно удалить
                {
                    form.paint(0, 0, true); //очищаем экран
                    draw_border(form);

                    for (int i = 0; i < form.bmp.Width; i++) //рисуем оставшиеся точки
                    {
                        for (int j = 0; j < form.bmp.Height; j++)
                        {
                            if (sol.bin_map[i, j])
                            {
                                g.FillRectangle(Brushes.White, i, j, 1, 1);
                            }
                        }
                    }
                    form.picture.Refresh(); //обновляем изображение
                    r++;                    //увеличиваем толщину слоя проверки
                         //if (kkk)
                         //{
                         //    kkk = false;
                         //    MessageBox.Show(r.ToString());
                         //}
                }

                skel_first = sol.add_to_skel(); //добавляем все оставшиеся точки в скелет
                //sol.tops_cros_update(skel_first);

                form.paint(0, 0, true);        //очищаем экран

                skel_mod = new List <Point>(); //модифицированный скелет
                skel_mod.AddRange(skel_first);

                //удаляем "мусорные" пиксели
                while (sol.pixels_buitifier(skel_mod))
                {
                    foreach (var p in sol.removed_points)
                    {
                        skel_mod.Remove(p);
                    }
                    foreach (var p in sol.added_points)
                    {
                        skel_mod.Add(p);
                    }
                    //draw_group(g, sol.removed_points, Color.Magenta);
                    //draw_group(g, sol.added_points, Color.AntiqueWhite);
                }
                sol.tops_cros_update(skel_mod); //поиск вершин и пересечений
                sharp = sol.get_sharp(skel_mod);

                refresh_picture_points(form);

                skel_array = sol.get_skel_array(sharp, sol.tops, sol.cros); //массив-идентификатор особых точек
                find_templ(form);
            }