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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2018, 13:58   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию неправильно работает программа

Здравствуйте.
Нужно в цикле заполнить окно кругами так, чтобы они не накладывались друг на друга.

написал код, но круги всё-равно накладываются.

Код:

struct TBall{
    TVector Position;
    TVector Motion;
    double Radius;
    COLORREF Color;
};


struct TVector{
    double X;
    double Y;
    double Z;
};


TVector Vect(double X, double Y, double Z){
    TVector V1;
    V1.X = X;
    V1.Y = Y;
    V1.Z = Z;
    return V1;
}


double VectorsDistance(TVector V1, TVector V2){
//    return sqrt(pow(V1.X - V2.X, (double)2) + pow(V1.Y - V2.Y, (double)2) + pow(V1.Z - V2.Z, (double)2));
    return sqrt(pow(V1.X - V2.X, (double)2) + pow(V1.Y - V2.Y, (double)2));
}

VOID SetBalls(int nMaxCount){
    nMaxCount = 2000;
    if (nMaxCount > 0){
        if (Balls!=NULL)
            free(Balls);
        Balls = (TBall*)malloc(sizeof(TBall));
        BallsCount = 1;
        memset(&Balls[0], 0, sizeof(TBall));

        Balls[0].Radius = 50;
        Balls[0].Position = Vect(50,50,0);
        Balls[0].Color = RGB(rand() % 255, rand() % 255, rand() % 255);

            for (int i = 0; i < nMaxCount; i++){
                int tmpRadius = 30;
                BOOL valid = true;
                TVector tmpPos;
                for (int j = 0; j < BallsCount; j++){
                     tmpPos = Vect(rand() % 300, rand() % 300, 0);
                     double d = VectorsDistance(tmpPos, Balls[j].Position);
                     double r = tmpRadius + Balls[j].Radius;
                     valid = (valid) && (d > r);
                     if (!valid)
                        break;
                }
                if (valid){
                    Balls = (TBall*)realloc(Balls, sizeof(TBall) * (BallsCount + 1));
                    memset(&Balls[BallsCount], 0, sizeof(TBall));
                    Balls[BallsCount].Radius = tmpRadius;
                    Balls[BallsCount].Position = tmpPos;
                    BallsCount += 1;

                }
            }
    }
    return;
}
не понимаю, почему работает неправильно.
BLACK_RAIN вне форума Ответить с цитированием
Старый 21.11.2018, 14:35   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Дык tmpPos позиция круга, который не пересекается с последним из Balls. А со всеми остальными как попало )
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.11.2018, 16:26   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Дык tmpPos позиция круга, который не пересекается с последним из Balls. А со всеми остальными как попало )
Всмысле как это? Там идет цикл проверки позиции всех кругов. Если tmpPos наложился хотябы на один из них - цикл прекращается и новый круг не создается. Затем рандомится новый tmpPos и т.д.
Разве нет? Где ошибка тогда?
p.s. Сейчас еще потестил. Такое ощущение, что проблема в функции rand(). Если ее не использовать, то всё нормально.
BLACK_RAIN вне форума Ответить с цитированием
Старый 21.11.2018, 16:30   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А чего tmpPos каждый раз в цикле новый? В том, вложенном. Один же нужен для всех проверок

Цитата:
Если ее не использовать, то всё нормально.
Дык и все нормально, что координаты не меняются )
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.11.2018 в 16:34.
Аватар вне форума Ответить с цитированием
Старый 21.11.2018, 16:38   #5
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Всмысле как это? Там идет цикл проверки позиции всех кругов.
И на каждом шаге этого цикла рандомится новый tmpPos
Black Fregat вне форума Ответить с цитированием
Старый 21.11.2018, 16:44   #6
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Спасибо. Осознал и исправил ошибку
BLACK_RAIN вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неправильно работает программа. Evgeny_L Общие вопросы C/C++ 0 09.11.2018 22:56
Неправильно работает программа (С#) julia9311 Помощь студентам 0 01.12.2014 02:10
неправильно работает программа CppForYou Общие вопросы C/C++ 0 26.04.2013 01:13
С++. Неправильно работает программа. Новенькая.. Помощь студентам 2 04.10.2012 00:01
Программа работает неправильно. Настюня Помощь студентам 2 16.06.2012 18:34