Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

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

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

Код:


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, 15:35   #2
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,081
Репутация: 6385
По умолчанию

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

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

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

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

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


09:04.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru