Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2011, 17:17   #1
zipwind
Пользователь
 
Регистрация: 06.04.2011
Сообщений: 26
По умолчанию Построение выпуклой оболочки.

Делаю программу на шарпе по заданию - построение выпуклой оболочки. Проблема с самим алгоритмом - он неплохо строит треугольник но для большего числа точек не работает - получаются какие-то странные результаты. Никто не подскажет как с этим разобраться?
Вот код построения(там вроде все достаточно просто, никаким я особым алгоритмом не пользовался а делал просто по определению - если над прямой, проходящей через две точки лежат другие точки то они выкидываются, если лежат только снизу или только сверху то они добавляются в список годных точек):

Код:
float a;
            float b;
            bool IsOnEdge=true;
            bool HasPointOnTop = false;
            bool HasPointOnBot = false;
           
            Point LinePoint=new Point();
            LineList.Clear();

            foreach (Circle Circle1 in CircleList)
            {
                foreach (Circle Circle2 in CircleList)
                {
                    if (Circle1.Center != Circle2.Center)
                    {
                        if (Circle1.Center.X == Circle2.Center.X)
                        {
                            foreach (Circle Circle3 in CircleList)
                            {


                                if (LinePoint.X > Circle3.Center.X)
                                {
                                    HasPointOnTop = true;

                                }
                                if (LinePoint.X < Circle3.Center.X)
                                {
                                    HasPointOnBot = true;

                                }
                                if (HasPointOnTop & HasPointOnBot)
                                {
                                    IsOnEdge = false;

                                }
                             

                            }
                            if (IsOnEdge)
                            {
                                LineList.Add(new Line(Circle1.Center, Circle2.Center));
                            }
                        }
                        else
                        {
                            
                            a = (float)(Circle1.Center.Y - Circle2.Center.Y) / (Circle1.Center.X - Circle2.Center.X);
                            b = (float)Circle1.Center.Y - Circle1.Center.X * a;

                            foreach (Circle Circle3 in CircleList)
                            {
                                if (!(Circle1.Center == Circle3.Center || Circle2.Center == Circle3.Center))
                                {
                                    LinePoint.Y =(int)( a * (float)Circle3.Center.X + b);
                                    if (LinePoint.Y > Circle3.Center.Y)
                                    {
                                        HasPointOnTop = true;;

                                    }
                                    if (LinePoint.Y < Circle3.Center.Y)
                                    {
                                        HasPointOnBot = true;

                                    }
                                    if (HasPointOnBot & HasPointOnTop)
                                    {
                                        IsOnEdge = false;

                                    }
                                }
                            }

                            if (IsOnEdge)
                            {
                                LineList.Add(new Line(Circle1.Center, Circle2.Center));
                            }
                        }
                    }
                }
                this.Invalidate();
                HasPointOnBot = false;
                IsOnEdge = true;
                HasPointOnTop = false;
            }
}

Последний раз редактировалось zipwind; 29.10.2011 в 20:19.
zipwind вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выбор оболочки под C++ Anton_uz Софт 1 22.10.2011 21:45
Создание графической оболочки на бейсике Nevik66 Помощь студентам 1 04.06.2011 17:52
Обсуждаем оболочки С/С++ Tema_Crazzzy Visual C++ 9 25.07.2010 19:24
Создание графической оболочки kaban199120 Microsoft Office Access 7 02.05.2010 19:40
Создание оболочки и отладчика a-jey Общие вопросы C/C++ 0 24.11.2008 17:42