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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2010, 11:50   #1
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию OpenGL Изменение цвета

Код:
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <glut.h>

#define PI 3.1415926535898
 
#pragma comment (lib, "glut32.lib")
 

struct Vector {float x, y;};  
Vector v1, v2, v3,v4; 
Vector pos;
float angle;
 bool TestCollide();
struct Vec3D {float X, Y, Z;};
class Asteroid
{
public:
void Init(int N)
{
  int i = N / 4;
  int j = N % 4;
  A.X = -0.5+i/2;
  A.Y = -0.5+j/2;
  A.Z = 0;
  B.X = i/2;
  B.Y = -0.5+j/2;
  B.Z = 0;
  C.X = -0.5+i/2;
  C.Y = j/2;
  C.Z = 0;
  D.X = i/2;
  D.Y = j/2;
  D.Z = 0;
  dx = 0;
  dy = 0;
  dz = 0;
} 
 
Vec3D A, B, C, D;
float dx, dy, dz;

public:
void Draw();
};
 
int N = 10; 
Asteroid AstArr[10];   //Массив астероидов
 
 
 
//------------------------------------------------------------------------------------

 
//------------------------------------------------------------------------------------
 
Vector Rotate(Vector v,float a) // функция вращения вектора на угол а.
{
 
Vector r;
 
 
a = a * (PI/180.0);
r.x = (v.x*cos(a)) + (v.y*sin(a));
r.y = (v.x*-sin(a)) + (v.y*cos(a));
 
 
 
 
return r;
 
}
 
//------------------------------------------------------------------------------------
 
void init() // Задаем установки прогы
{
v1.x = 0.3; v1.y = 0.3; // записываем статичиские кординаты фигуры
v2.x =-0.08; v2.y = 0.08;
v4.x = 0.08; v4.y =-0.08;
 
}
void Asteroid::Draw()
{
        glBegin(GL_QUADS);
        glColor3ub(255,255,255);
            glVertex3f(A.X, A.Y, A.Z);   // Слева вверху
            glVertex3f(B.X, B.Y, B.Z);   // Справа вверху
            glVertex3f(C.X, C.Y, C.Z);   // Справа внизу
            glVertex3f(D.X, D.Y, D.Z);   // Слева внизу
        
        glEnd(); 
}
//------------------------------------------------------------------------------------
 
 

void display(void)

{
 
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 
glLoadIdentity();
 
for (int i = 0; i < N; i++)
 {
  glLoadIdentity();
  glTranslatef(AstArr[i].dx, AstArr[i].dy, AstArr[i].dz);
  AstArr[i].Draw();
 }
 
glLoadIdentity(); 
 
 if(GetAsyncKeyState(VK_LEFT))  angle -= 0.7; // Кнопки Влево и вправо крутят фигуру! 
 if(GetAsyncKeyState(VK_RIGHT)) angle += 0.7;
 
 if(GetAsyncKeyState(VK_UP)) { 
         Vector tmp; tmp.x = 0.004; tmp.y = 0.004;
         tmp = Rotate(tmp, angle);
         
         pos.x += tmp.x; pos.y += tmp.y;
         if(pos.x > 5.1) pos.x = -5.1;
         if(pos.x < - 5.1) pos.x = 5.1;
 
         if(pos.y > 5.1) pos.y = -5.1;
         if(pos.y < - 5.1) pos.y = 5.1;
 
 }  // Кнопки вверх и вниз меняют позицию фигуру! 
 if(GetAsyncKeyState(VK_DOWN)) {
         Vector tmp; tmp.x = -0.003; tmp.y = -0.003;
         tmp = Rotate(tmp, angle);
         pos.x += tmp.x; pos.y += tmp.y;
 
         pos.x += tmp.x; pos.y += tmp.y;
         if(pos.x > 5.1) pos.x = -5.1;
         if(pos.x < - 5.1) pos.x = 5.1;
 
         if(pos.y > 5.1) pos.y = -5.1;
         if(pos.y < - 5.1) pos.y = 5.1;
 
 }
 
 
 Vector tv1 = Rotate(v1,angle); // создаем временой вектор  для создания глобальних кординат
 Vector tv2 = Rotate(v2,angle);
 Vector tv3 = Rotate(v4,angle);

 
 bool collide = TestCollide();
 
 glBegin(GL_TRIANGLES);
 
     if (collide) {
    glColor3ub(255,0,0);
 }
 else {
   glColor3ub(255,255,0);
 }
    glVertex2d(tv1.x + pos.x, tv1.y + pos.y); // рисуем фигуру и добовляем позицию
         
    glVertex2d(tv2.x + pos.x, tv2.y + pos.y);
    glVertex2d(tv3.x + pos.x, tv3.y + pos.y);
        glEnd();
        
 
 
glutSwapBuffers();
glutPostRedisplay();
 
 
}
 
void Timer(int value)
{
for (int i = 0; i < N; i++)
 {
   float Angle = rand() * PI/180;
  AstArr[i].dx = AstArr[i].dx + cos(Angle)-sin(Angle);
  AstArr[i].dy = AstArr[i].dy + sin(Angle)+cos(Angle);
  if (AstArr[i].dx > 5) 
           AstArr[i].dx =4.7;
  if (AstArr[i].dx < -5) 
           AstArr[i].dx =-4.7;
  if (AstArr[i].dy > 5) 
           AstArr[i].dy =4.7;
  if (AstArr[i].dy < -5) 
           AstArr[i].dy =-4.7;
}
  glutPostRedisplay();  // Redraw windows
  glutTimerFunc(300, Timer, 0);
}
 
//------------------------------------------------------------------------------------
int main(int argc, char *argv[])
{
 
 
for (int i = 0; i < N; i++)
 {
 AstArr[i].Init(i);
 AstArr[i].Draw();
 }
 
 
 
  init();
    glutInit(&argc, argv);             
    glutInitWindowSize(800, 700);        
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 
    glutCreateWindow("FrOsT");
    glutReshapeFunc(resize);
        glutTimerFunc(300, Timer, 0);
    glutDisplayFunc(display);
    glutMainLoop();
 
        return 0;
}

Последний раз редактировалось revaldo666; 29.07.2010 в 13:27.
revaldo666 вне форума Ответить с цитированием
Старый 29.07.2010, 11:51   #2
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

Реализовал изменение цвета при столкновении треугольника с астероидом, но выдаёт ошибку.
error LNK2019: ссылка на неразрешенный внешний символ "bool __cdecl TestCollide(void)" (?TestCollide@@YA_NXZ) в функции "void __cdecl display(void)" (?display@@YAXXZ)
Подскажите что я нетак сделал?
Или может чтото недоделал...

Последний раз редактировалось revaldo666; 29.07.2010 в 13:29.
revaldo666 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение цвета (opengl) revaldo666 Общие вопросы C/C++ 0 26.07.2010 15:13
изменение цвета MaXoN66613 Помощь студентам 2 02.06.2010 18:56
Изменение цвета girz Общие вопросы Delphi 6 30.05.2009 13:43
ColorBar изменение цвета Vladya Помощь студентам 1 19.11.2008 10:09
Изменение цвета Artem Общие вопросы Delphi 5 12.07.2007 09:07