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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2017, 22:46   #1
mosvladislav
 
Регистрация: 23.01.2017
Сообщений: 5
По умолчанию Изменение цвета движущейся фигуры C++

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

Вот код
Код:
long int cvet1 = RGB(255,255,0);//цвет круга
long int cvet2 = 0;//цвет звезды
double mash = 1;  //масштаб фигуры
int napravlenie = 1;//направление движения круга
int rux=0;//выдвижение панели

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{}
/*center-центр круга, radius1-внешний радиус круга, radius2- внутренний радиус круга
luchi-лучи звезды
*/

void TForm1::zvezda(TPoint center, int radius1, int radius2, int luchi, double mash, TColor cvet1, TColor cvet2, double angle)
{
Refresh();
// масштаб внешнего и внутреннего радиуса
  radius1 *= mash;
  radius2 *= mash;

  // рисуем окружность
Canvas->Pen->Color = cvet1;
  Canvas->Brush->Color = cvet1;
  Canvas->Ellipse(center.x - radius1, center.y - radius1, center.x + radius1 + 1, center.y + radius1 + 1);

Canvas->FloodFill(center.x, center.y, cvet1, fsBorder);

Canvas->Pen->Color = cvet2;
Canvas->Brush->Color = cvet2;
  // переходим в "начальную точку" звезды
  Canvas->MoveTo(center.x+sin(angle)*radius1, center.y-cos(angle)*radius1);
  // рисуем лучи
  for (int i = 1; i <= luchi; i++)
  {
    Canvas->LineTo(center.x+sin(angle+(i*2-1)*M_PI/luchi)*radius2, center.y-cos(angle+(i*2-1)*M_PI/luchi)*radius2);
    Canvas->LineTo(center.x+sin(angle+(i*2-3)*M_PI/luchi)*radius2, center.y-cos(angle+(i*2-3)*M_PI/luchi)*radius2);
    Canvas->MoveTo(center.x+sin(angle+(i*2-1)*M_PI/luchi)*radius2, center.y-cos(angle+(i*2-1)*M_PI/luchi)*radius2);
    Canvas->LineTo(center.x+sin(angle+i*2*M_PI/luchi)*radius1, center.y-cos(angle+i*2*M_PI/luchi)*radius1);
  }
Canvas->FloodFill(center.x, center.y, cvet2, fsBorder);

}
//===========================================================================

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled = true;
 Button1->Enabled=false;
 Button2->Enabled=true;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 Timer1->Interval = TrackBar1->Max - TrackBar1->Position + 1;

 //масштаб
  mash = StrToFloatDef(Edit1->Text, 1) / StrToFloatDef(Edit2->Text, 1);

  //  радиусы и кол-во лучей
  int radius1 = 90, radius2 = 45, luchi = 6;
  //  кординаты центра фигуры
  int x = Tag+radius1*mash, y = -100*sin(Tag*180./ClientWidth/15/M_PI)+ClientHeight-radius1*mash-1;

  // фигура строится вначале в левом нижнем углу, туда и возвращается

//===========================================================================

//  zvezda(TPoint(x, y), radius1, radius2, luchi, mash, TColor(RGB(cvet1*259, cvet1*15, cvet1*254)), TColor(RGB(cvet1*259, cvet1*15, cvet1*254)), Tag*180./M_PI/ClientWidth/50*StrToFloatDef(Edit4->Text, 0));
        float   B1 = (float)(ClientWidth-x)/ClientWidth*255,
                R = (float)(ClientWidth-x)/ClientWidth*255,
                 GB = (float)x/ClientWidth*255,
                B2 = (float)x/ClientWidth*255;
  zvezda(TPoint(x, y), radius1, radius2, luchi, mash, TColor(RGB(B1, R, B2)), TColor(RGB(GB, 0, B1)), Tag*180./M_PI/ClientWidth/50*StrToFloatDef(Edit4->Text, 0));
//===========================================================================



  // проверка на достижение фигурой границ формы
  if (((x+radius1*mash >= ClientWidth || y-radius1*mash <= 0 || y+radius1*mash >= ClientHeight) && napravlenie > 0) || (x-radius1*mash <= 0 && napravlenie < 0))
  {
    // меняем направление движения
    napravlenie *= -1;
    Timer1->Enabled = false;

    // задаем время, через которое фигура начнет двигаться в другую сторону
    Timer2->Enabled = true;
    Timer2->Interval= StrToFloatDef(Edit3->Text, 0)*1000+1;
}
// смещаем фигуру
  Tag += napravlenie;
}
Изображения
Тип файла: png 1.png (16.7 Кб, 129 просмотров)
Тип файла: png 2.png (16.0 Кб, 123 просмотров)
Вложения
Тип файла: rar GRAFIKA.rar (1.43 Мб, 6 просмотров)
mosvladislav вне форума Ответить с цитированием
Старый 08.02.2017, 07:51   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Надо делать "полую фигуру" - удали лишнее в цикле (в функции "zvezda") и оставь только:

0.jpg


Кстате, у тебя (вообще) проект запускается?... Когда я попытался запустить "GRAFIKA", то у меня ошибки вывело:

1.jpg

Пришлось перенабирать заново проект...

Последний раз редактировалось ura_111; 08.02.2017 в 08:08.
ura_111 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение кода для ускорения движения фигуры. 7vlad37 Microsoft Office Excel 7 28.07.2011 14:52
изменение цвета MaXoN66613 Помощь студентам 2 02.06.2010 18:56
Изменение размеров фигуры по F1 inzener-tolik Win Api 4 24.03.2010 15:37
Изменение цвета girz Общие вопросы Delphi 6 30.05.2009 13:43
Изменение цвета Artem Общие вопросы Delphi 5 12.07.2007 09:07