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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2015, 01:49   #1
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 149
По умолчанию Программа рисующая звезды 3-x мерно

Написал программу на Borland C++ 4.5 генерирующую вывод 3-х мерных звезд.Но вместо вывода звезд на экране с миганием выводится белая полоса на ширину всего экрана , пробегая по экрану сверху вниз.Помогите разобраться в чем ошибка.Вот код программы:

Код:
#include<owl\applicat.h>
#include<owl\framewin.h>
#include<owl\dc.h>
#include<owl\gdiobjec.h>
#include<owl\scroller.h>

#pragma hdrstop

#define NUM_STARS 256

#define NEAR_Z 10
#define FAR_Z 2000

struct STAR3D_TYP
{
 float x,y,z;
} stars[NUM_STARS];

class TMyWin : public TFrameWindow
{
 public:
	TMyWin(TWindow * parent,const char far * title):TFrameWindow(parent,title)
	 {}
	void Paint(TDC & dc,BOOL erase,TRect & rect);
	void EvTimer(UINT);
	void SetupWindow();
 DECLARE_RESPONSE_TABLE(TMyWin);
};

DEFINE_RESPONSE_TABLE1(TMyWin,TFrameWindow)
EV_WM_TIMER,
END_RESPONSE_TABLE;

void TMyWin::SetupWindow()
{
 TRect rect;
 TFrameWindow::SetupWindow();
 GetClientRect(rect);

 for(int index=0;index<NUM_STARS;index++)
  {
	stars[index].x=-(rect.right-rect.left)/2+rand()%(rect.right-rect.left);
	stars[index].y=-(rect.bottom-rect.top)/2+rand()%(rect.bottom-rect.top);
	stars[index].z=NEAR_Z+rand()%(FAR_Z-NEAR_Z);
  }

 SetTimer(1,100);

}

void TMyWin::EvTimer(UINT)
{

 for(int index=0;index<NUM_STARS;index++)
 {
 stars[index].z-=4;
 if(stars[index].z<=NEAR_Z)
	 stars[index].z=FAR_Z;
 }
 Invalidate();

}

void TMyWin::Paint(TDC & dc,BOOL /* erase */,TRect & /* rect */)
{

 TRect rect2;
 GetClientRect(rect2);
 TBrush brBlack(TColor::Black);
 dc.SelectObject(brBlack);
 dc.FillRect(rect2,brBlack);

 TColor col(255,255,255);

 for(int index=0;index< NUM_STARS;index++)
  {
	stars[index].x=stars[index].x/stars[index].z;
	stars[index].y=stars[index].y/stars[index].z;
	dc.SetPixel(stars[index].x,stars[index].y,col);
  }

}

class TDrawApp : public TApplication
{
 public :
	TDrawApp(const char far * name):TApplication(name)
	 {};
	void InitMainWindow();
};

void TDrawApp::InitMainWindow()
{
 MainWindow=new TMyWin(0,"Draw Into Offscreen Bitmap");
}

int OwlMain(int argc,char * argv[])
{
 TDrawApp app("DrawBit");
 return app.Run();
}

Последний раз редактировалось Stilet; 03.09.2015 в 08:27.
Timurkh77 вне форума Ответить с цитированием
Старый 03.09.2015, 08:31   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну надо однозначно ковырять твой TMyWin::Paint.
Я не оч. пойму как ты звезду трехмерную нарисовал описав только ее координаты...
Убери пока таймер и опиши одну звезду, пусть только она рисуется.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.09.2015, 01:00   #3
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 149
По умолчанию

Звезду я описываю координатами ее положения,Вывод звезды осуществляется функцией рисования пикселя dc.SetPixel().
Исправил функцию на рисование одной звезды , но звезда не рисуется.
Код:
#include<owl\applicat.h>
#include<owl\framewin.h>
#include<owl\dc.h>
#include<owl\gdiobjec.h>
#include<owl\scroller.h>
#pragma hdrstop

#define NUM_STARS 256

#define NEAR_Z 10
#define FAR_Z 2000

struct STAR3D_TYP
{
 float x,y,z;
} stars[NUM_STARS];



class TMyWin : public TFrameWindow
{
 public:
	TMyWin(TWindow * parent,const char far * title):TFrameWindow(parent,title)
	 {}
	void Paint(TDC & dc,BOOL erase,TRect & rect);
	//void EvTimer(UINT);
	void SetupWindow();
 //DECLARE_RESPONSE_TABLE(TMyWin);
};

/*DEFINE_RESPONSE_TABLE1(TMyWin,TFrameWindow)
EV_WM_TIMER,
END_RESPONSE_TABLE;*/

void TMyWin::SetupWindow()
{
 TRect rect;
 TFrameWindow::SetupWindow();
 GetClientRect(rect);

 for(int index=0;index<NUM_STARS;index++)
  {
	stars[index].x=-(rect.right-rect.left)/2+rand()%(rect.right-rect.left);
	stars[index].y=-(rect.bottom-rect.top)/2+rand()%(rect.bottom-rect.top);
	stars[index].z=NEAR_Z+rand()%(FAR_Z-NEAR_Z);
  }

// SetTimer(1,100);

}

/*void TMyWin::EvTimer(UINT)
{

 for(int index=0;index<NUM_STARS;index++)
 {
 stars[index].z-=4;
 if(stars[index].z<=NEAR_Z)
	 stars[index].z=FAR_Z;
 }
 Invalidate();

} */

void TMyWin::Paint(TDC & dc,BOOL /* erase */,TRect & /* rect */)
{

 TRect rect2;
 GetClientRect(rect2);
 TBrush brBlack(TColor::Black);
 dc.SelectObject(brBlack);
 dc.FillRect(rect2,brBlack);

 TColor col(255,0,0);

// for(int index=0;index< NUM_STARS;index++)
//  {
	stars[0].x=stars[0].x/stars[0].z;
	stars[0].y=stars[0].y/stars[0].z;
	dc.SetPixel(stars[0].x,stars[0].y,col);
 // }

}

class TDrawApp : public TApplication
{
 public :
	TDrawApp(const char far * name):TApplication(name)
	 {};
	void InitMainWindow();
};

void TDrawApp::InitMainWindow()
{
 MainWindow=new TMyWin(0,"Draw Into Offscreen Bitmap");
}

int OwlMain(int argc,char * argv[])
{
 TDrawApp app("DrawBit");
 return app.Run();
}

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна программа рисующая схему базы MySQL veter_s_morya Софт 3 28.12.2010 19:03
Процедура, рисующая дерево. vedro-compota Мультимедиа в Delphi 14 16.05.2010 13:37
убрать звезды mrgrudge JavaScript, Ajax 5 13.05.2010 03:17
Смотрим на звезды ! Levsha100 Свободное общение 9 13.08.2009 03:05
Есть ли прога рисующая алгоритмы? Cyberbest Помощь студентам 6 04.05.2008 21:25