Выпускная работа специальность "Прикладное программирование"



Дата16.06.2016
өлшемі153.01 Kb.
#140701
түріВыпускная работа

МОСКОВСКИЙ КОМИТЕТ ОБРАЗОВАНИЯ

ЛИЦЕЙ №1533 (ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ)



ВЫПУСКНАЯ РАБОТА

(специальность "Прикладное программирование")

учащегося группы П-11.1 Веселовского Ильи Владимировича

учащегося группы П-11.2 Черкасова Александра Александровича



Эволюция двойной системы


Руководитель:

Розенштейн С.А.

Консультанты:

Завриев Н.К.

Конев А.А.





Москва - 2005




Оглавление

3

Глава 1. Введение 4

Постановка задачи 4

Цели и задачи разработки 4

Основные понятия и определения 5

Глава 2. Актуальность темы 8

Глава 3. Обзор аналогов 9

Глава 4. Программа 10

Описание функций 10

Общее описание 10

Описание пользовательского интерфейса 10

Глава 5. Направление дальнейших разработок 12

Глава 6. Выводы 12

void CStatistic::DrawSphere(double x,double y,double z, double size, double cone_size) 19

{ 19

glPushMatrix(); 19



glTranslated(x, y, z); 19

//PolygonalSphere(size, 32, 32); 19

glutSolidSphere(size,32,32); 19

if(accr==TRUE) //Åñëè íà÷àëàñü àêêðåöèÿ 19

{ 19

glColor3d(0.95,0.95,0.9); 19



glRotated(180,1,0,0); //Ïîâîðîò êîíóñà íà 180 ãðàäóñîâ, îðèåíòèðîâàíèå åãî â ñòîðîíó ê òî÷êå Ëàãðàíæà 19

glutSolidCone(cone_size,cone_size+delta,30,30); //Ðèñîâàíèå êîíóñà 19

delta+=0.01; //Óâåëè÷åíèå ïåðåìåííîé, îòâå÷àþùåé çà äëèíó êîíóñà 19

} 19


//glColor3d(0,0,0); 19

glPopMatrix(); 19

} 19

#define CACHE_SIZE 240 19



#define SIN sinf 19

#define COS cosf 19

#define M_PI 3.141592653 19

void CStatistic::PolygonalSphere(GLdouble radius, GLint slices, GLint stacks) 20

{ 20

GLint i, j; 20



GLfloat sinCache1a[CACHE_SIZE]; 20

GLfloat cosCache1a[CACHE_SIZE]; 20

GLfloat sinCache2a[CACHE_SIZE]; 20

GLfloat cosCache2a[CACHE_SIZE]; 20

GLfloat sinCache1b[CACHE_SIZE]; 20

GLfloat cosCache1b[CACHE_SIZE]; 20

GLfloat sinCache2b[CACHE_SIZE]; 20

GLfloat cosCache2b[CACHE_SIZE]; 20

GLfloat angle; 20

GLfloat zLow, zHigh; 20

GLfloat sintemp1, sintemp2, sintemp3, sintemp4; 20

GLfloat costemp3, costemp4; 20

if (slices >= CACHE_SIZE) slices = CACHE_SIZE - 1; 20

if (stacks >= CACHE_SIZE) stacks = CACHE_SIZE - 1; 20

if (slices < 2 || stacks < 1 || radius < 0.0) 20

return; 20

for (i = 0; i < slices; i++) 20

{ 20


angle = 2 * M_PI * i / slices; 20

sinCache2a[i] = sinCache1a[i] = SIN(angle); 20

cosCache2a[i] = cosCache1a[i] = COS(angle); 20

} 20


for (j = 0; j <= stacks; j++) 21

{ 21


angle = M_PI * j / stacks; 21

sinCache2b[j] = SIN(angle); 21

cosCache2b[j] = COS(angle); 21

sinCache1b[j] = (float)radius * sinCache2b[j]; 21

cosCache1b[j] = (float)radius * cosCache2b[j]; 21

} 21


/* Make sure it comes to a point */ 21

sinCache1b[0] = 0; 21

sinCache1b[stacks] = 0; 21

sinCache1a[slices] = sinCache1a[0]; 21

cosCache1a[slices] = cosCache1a[0]; 21

sinCache2a[slices] = sinCache2a[0]; 21

cosCache2a[slices] = cosCache2a[0]; 21

for (j = 0; j < stacks; j++) 21

{ 21

zLow = cosCache1b[j]; 21



zHigh = cosCache1b[j+1]; 21

sintemp1 = sinCache1b[j]; 21

sintemp2 = sinCache1b[j+1]; 21

sintemp3 = sinCache2b[j+1]; 21

costemp3 = cosCache2b[j+1]; 21

sintemp4 = sinCache2b[j]; 21

costemp4 = cosCache2b[j]; 21

glBegin(GL_QUAD_STRIP); 22

for (i = 0; i <= slices; i++) 22

{ 22


glNormal3f(sinCache2a[i] * sintemp3, cosCache2a[i] * sintemp3, costemp3); 22

glTexCoord2f(1 - (float)i / slices, 1 - (float) (j+1) / stacks); 22

glVertex3f(sintemp2 * sinCache1a[i], sintemp2 * cosCache1a[i], zHigh); 22

22


glNormal3f(sinCache2a[i] * sintemp4, cosCache2a[i] * sintemp4, costemp4); 22

glTexCoord2f(1 - (float)i / slices, 1 - (float) j / stacks); 22

glVertex3f(sintemp1 * sinCache1a[i], sintemp1 * cosCache1a[i], zLow); 22

} 22


glEnd(); 22

} 22

Глава 1. Введение

Постановка задачи

Исследование процесса эволюции двойных звезд – это задача, требующая использования сложной и дорогой техники; настоящая работа призвана облегчить изучение данного раздела астрономии в школах и ВУЗах посредством компьютерной визуализации и моделирования процесса аккреции вещества в двойных звездных системах.

Цели и задачи разработки




  • Разработка физической модели;

  • Визуализация физической модели и разработка удобного пользовательского интерфейса;

  • Основная задача работы– построение астрономического объекта “двойная звезда” не противоречащего математической модели.


Основные понятия и определения


Аккреция вещества отражает состояние взаимодействия между компонентами системы и позволяет изучать параметры компонентов, в частности массу. Это дает возможность правильно классифицировать аккрецирующий компонент двойной системы как нейтронную звезду или Черную дыру. Явление аккреции в двойных системах предполагает с одной стороны разные механизмы своей реализации, с другой имеет своим следствием разнообразнейший набор наблюдательных данных, описывающих такие свойства этих систем как масса, вращательный момент, магнитное поле, температура, энергия и спектр излучения.

1. Аккреция вещества отражает состояние взаимодействия между компонентами системы и позволяет изучать параметры компонентов, в частности массу. Это дает возможность правильно классифицировать аккрецирующий компонент двойной системы как нейтронную звезду или Черную дыру. Действительно, в зависимости от свойств аккрецирующего компонента вещество, перетекающее на него с другого компонента двойной, испытывает ускорение, которое сопровождается излучением определенной интенсивности, соответствующим участком спектра. Наличие магнитного поля в окрестности аккрецирующего компонента также определяет «траекторию» потока, его конфигурацию. Если аккрецируемый поток вещества обладает моментом импульса - очень вероятной характеристикой этого потока, то такой аккрецируемый поток будет непременно трансформироваться в дисковую конфигурацию... Действительно, сохранение момента импульса при условии роста скорости падающего на аккрецирующую звезду потока приводит к росту его центробежного ускорения, большему, чем ускорения силы тяжести. В результате вещество выходит на некоторую орбиту, причем из-за одинаковых начальных условий следующие порции вещества также оказываются на той же орбите. Из-за взаимных столкновений частиц и роста дисперсии скоростей орбита расплывается в диск.

2. Существует несколько механизмов аккреции. Самый очевидный связан с существованием звездного ветра – сферически симметричного потока плазмы с поверхности звезды за счет конвективного движения в поверхностном слое или излучения. Грубо говоря, речь идет об испарении вещества звезды. Другой механизм обязан существованию так называемой полости Роша – поверхности равного потенциала, содержащей общую точку с поверхностью Роша второго компонента двойной системы. Эта точка называется первой точкой Лагранжа, и именно через эту точку происходит перетекание вещества из компонента, заполнившего свою полость Роша, что может быть обеспечено процессом расширения звезды вследствие увеличения внутреннего давления за счет термоядерных реакций в недрах звезды. Очевидно, что первый механизм, обеспечивает практически радиальный поток аккреции при условии, что скорость звездного ветра значительно превышает скорость орбитального движения, тогда как второй из-за вклада орбитального вращения источника должен обеспечивать дисковую аккрецию.

3. Аккреция на звезду приводит к формированию излучения вследствие соударения падающего вещества с поверхностью звезды, например нейтронной. В случае пульсаров, обладающих чрезвычайно большим магнитным полем, аккрецируемый поток, двигаясь вдоль силовых линий должен концентрироваться в области магнитных полюсов пульсара. В то же время молодые пульсары сами являются источниками мощного излучения, и аккреция на них невозможна. Поэтому стадия аккреции в случае нейтронных звезд возможна только по достижении определенного возраста ( порядка миллионов лет) Одним из следствий аккреции на нейтронную звезду может быть зажигание термоядерных реакций на ее поверхности, которые возникают с определенным периодом от нескольких часов до нескольких дней. Такие источники мощного рентгеновского излучения называются барстерами.

4. Таким образом, явление аккреции в двойных системах предполагает с одной стороны разные механизмы своей реализации, с другой имеет своим следствием разнообразнейший набор наблюдательных данных, описывающих такие свойства этих систем как масса, вращательный момент, магнитное поле, температура, энергия и спектр излучения.



Рис.1 Возможные сценарии эволюции двойной системы.


  • Сценарий эволюции массивной тесной двойной системы.

  • 2 – Первичный обмен масс в системе через внутреннюю точку Лагранжа.

  • 3 – Система WR1+OB2.

  • 4 – стадия двойной системы C+OB’2 , содержащей релятивистский объект (C), но без аккреции и мощного рентгеновского излучения.

  • 5(а) – Рентгеновская двойная система с аккреционным диском вокруг релятивистского объекта;

  • 5(б) – Эволюция с общей оболочкой, приводящая либо к формированию объекта Ландау-Торна-Житков, либо 5(в) к двойной системе C+WR2 типа Cyg X-3. Стадия 5(а) может привести также к формированию объекта типа SS433 со сверхкритическим аккреционным диском вокруг релятивистского объекта , но без общей оболочки. 5(г) – Стадия двух релятивистских объектов.(см рис.1)



Глава 2. Актуальность темы

Эта программа является наглядным пособием, которое может использоваться в школах, институтах и других специализированных заведениях.

Доля двойных и кратных звезд в нашей галактике составляет около 50%. Астрономы считают большой удачей, когда интересующий их объект входит в состав двойной системы, поскольку в этом случае оказывается возможным определить важнейшие характеристики объекта: его массу, радиус, температуру, светимость и т.п. Двойные звезды занимают особое место в астрономии, так как только в двойных звездах мы можем проследить эволюцию звёзд. Чтобы проследить эволюцию двойной системы от начала до конца требуется специализированная техника и огромный (~10^5 лет) промежуток времени.

Глава 3. Обзор аналогов


  • По предметной области: аналоги существуют, но визуализация (конкретно аккреция вещества) нигде не протекает в том виде, в каком предполагается в программе, аккреция протекает, не показывая сам процесс.

  • По целям: аналоги есть, но затрагивающие аккрецию, не как основной процесс.

  • По задачам и функциям: аналогов не найдено.


Глава 4. Программа




Описание функций


Программа представляет собой учебное пособие по двойным звёздам, поэтому функции программы ограничены заданием и визуализацией двойной системы.

Общее описание


После запуска программы пользователь сразу видит готовый эксперимент с относительно стабильной двойной системой. Чтобы создать свой эксперимент нужно нажать на кнопку fail->new или на клавишу Ctrl+N, появиться диалоговое окно, в котором по умолчанию стоят параметры работающей стабильной системы, но пользователь может задать свои параметры. К введению параметров нужно относиться очень осторожно, потому что в общем случае пользователь создаёт нестабильную систему, и звёзды либо разлетаются, либо через некоторое время столкнуться.

Описание пользовательского интерфейса


При запуске программы пользователь видит перед собой стандартное окно.(Рис.2)

Рис.2 Стандартное окно программы.
Далее пользователь вызывает окно создания нового эксперимента, задаёт свои параметры, и подтверждает их кнопкой ОК (Рис.3). Далее пользователь может приближать и удалять сцену с помощью колеса мыши, а также передвигать сцену с помощью клавиш вверх, вниз, влево, вправо. Далее пользователь наблюдает систему до её распада, или до создания нового проекта.

Рис.3 Диалоговое окно изменения параметров.


Глава 5. Направление дальнейших разработок


Улучшение визуализации, добавление новых возможностей.… Из-за стремления реализовать реальную систему некоторые функции в программе стали менее наглядны, поэтому возможно написание упрощённого блока, где звёзды движутся по окружности, а не по эллипсу, как это было реализовано в данном проекте. Это позволит сократить число входных параметров и упростит понимание демонстрируемых процессов для пользователя (ученика, студента). Также из-за движения по эллипсу очень сложно ответить на ряд качественных вопросов, потому что во всех физических статьях, рассматривая аккрецию, авторы принимают траектории движения за окружности.

Глава 6. Выводы


Разработана программа, отвечающая всем требованиям заказчика и сочетающая в себе наглядность и функциональность. Эта программа позволяет достаточно подробно изучить аккрецию вещества в двойных звёздах.

Использованные информационные источники




  1. Учебные пособия по программированию: Дж.Круглински “Программирование на Visual C++ 6.0” 2003г., К.Грегори “Использование Visual C++ 6”

  2. Учебные пособия по астрономической физике: Соросовский Образовательный Журнал, В.П.Липунов “В мире двойных звезд”.

  3. Интернет ресурсы:

  4. Народный учебник по OpenGL: http://pmg.org.ru/russian/nehe/index.html

  5. Первые шаги: www.firststeps.ru

  6. Ne productions: http://nehe.gamedev.net

Приложение

// Функция, отвечающая за движение звёзд

void CStatistic::SchetKoordinat()

{

double F;// результирующая сила.



double a1[2];// ускорение

double a2[2];

rasstojanie=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

if((razmerzv1+razmerzv2)>=rasstojanie)// проверка на столкновение

{

MessageBox(NULL,"Звёзды столкнулись, попробуйте ввести другую систему","System",MB_OK);



}

//t =((GetTickCount() - StartTime+50)/50);

t=10+8*flag;//+10*flag;

StartTime=GetTickCount();

F=-G*m1*m2/((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

a1[0]=F/m1*x1/(sqrt(x1*x1+y1*y1));

a1[1]=F/m1*y1/(sqrt(x1*x1+y1*y1));

a2[0]=F/m2*x2/(sqrt(x2*x2+y2*y2));

a2[1]=F/m2*y2/(sqrt(x2*x2+y2*y2));
//x_last[i]=x1;

x1+=(V[0]*t);

//y_last=y1;

y1+=(V[1]*t);

x2+=(V2[0]*t);

y2+=(V2[1]*t);

V[0]+=t*a1[0];

V[1]+=t*a1[1];

//V2[0]+=t*a2[0];

//V2[1]+=t*a2[1];

V2[0]=-V[0]*m1/m2;

V2[1]=-V[1]*m1/m2;


}
// Функция, отвечающая за движение акрецируемого вещества.

void CStatistic::Acrethion()

{

double r1, r2, zt=GetTickCount();


double X,Y;
for(int i=0; (i

{

//Координаты точки Лагранжа. (Х, У).

X=(status.x2*status.m1-status.x1*status.m2

+(status.x1-status.x2)/(double)abs((status.x1-status.x2))*sqrt((status.x2*status.m1-status.x1*status.m2)*(status.x2*status.m1-status.x1*status.m2)

-(status.m1-status.m2)*(status.x2*status.x2*status.m1-status.m2*status.x1*status.x1)))/(status.m1-status.m2);

if ((status.x1-status.x2)==0) X=0;

Y=(status.y2*status.m1-status.y1*status.m2

+((status.y1-status.y2))/(double)abs((status.y1-status.y2))*sqrt((status.y2*status.m1-status.y1*status.m2)*(status.y2*status.m1-status.y1*status.m2)

-(status.m1-status.m2)*(status.y2*status.y2*status.m1-status.m2*status.y1*status.y1)))/(status.m1-status.m2);

//////////////////////////

if ((status.y1-status.y2)==0) Y=0;

r1=(x1-Tochki[i].x)*(x1-Tochki[i].x)+(y1-Tochki[i].y)*(y1-Tochki[i].y)+(z1-Tochki[i].z)*(z1-Tochki[i].z);

r2=(x2-Tochki[i].x)*(x2-Tochki[i].x)+(y2-Tochki[i].y)*(y2-Tochki[i].y)+(z2-Tochki[i].z)*(z2-Tochki[i].z);

if((sqrt(r1)<=(razmerzv1)||(sqrt(r2)<=(razmerzv2))))

{

if(sqrt(r1)<=razmerzv1){m1+=1; m2-=1;}



if(sqrt(r2)<=razmerzv2) {m2+=1; m1-=1;}

Tochki[i].x=X;//status.x1;

Tochki[i].y=Y;//status.y1;

Tochki[i].z=0;//status.z1;

Tochki[i].ax=0;

Tochki[i].ay=0;

Tochki[i].az=0;

srand(GetTickCount()+i);

Tochki[i].Vx=((double)rand()/RAND_MAX*0.8-0.4)/50;//+(double)i/20;

Tochki[i].Vy=((double)rand()/RAND_MAX*0.8-0.4)/50;//+(double)i/20;

Tochki[i].Vz=((double)rand()/RAND_MAX*0.8-0.4)/50;//+(double)i/20;

break;
}



//Функции рисования сцены.

void CMFCView::OnDraw(CDC* pDC)

{

// status.SchetKoordinat();



// for(int i=0; i<10000; i++)

// status.SchetKoordinat();

display();

}
void CMFCView::display()

{

double X=(status.x2*status.m1-status.x1*status.m2



+(status.x1-status.x2)/(double)abs(status.x1-status.x2)*sqrt((status.x2*status.m1-status.x1*status.m2)*(status.x2*status.m1-status.x1*status.m2)

-(status.m1-status.m2)*(status.x2*status.x2*status.m1-status.m2*status.x1*status.x1)))/(status.m1-status.m2);

double Y;

Y=(status.y2*status.m1-status.y1*status.m2

+(status.y1-status.y2)/(double)abs(status.y1-status.y2)*sqrt((status.y2*status.m1-status.y1*status.m2)*(status.y2*status.m1-status.y1*status.m2)

-(status.m1-status.m2)*(status.y2*status.y2*status.m1-status.m2*status.y1*status.y1)))/(status.m1-status.m2);


glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();

glTranslatef(0.0, 0.0, status.zoom);

glTranslated(0,status.slideY,0);

glTranslated(status.slideX,0,0);

status.SchetKoordinat();

if(status.flag==0)

{

status.razmerzv1+=status.m1/status.m2*0.01;



status.razmerzv2+=status.m2/status.m1*0.01;

if (status.razmerzv1>status.RAZM_MAX1) status.flag=1;

if (status.razmerzv2>status.RAZM_MAX2) status.flag=2;

}

// else



// {

// if ((status.razmerzv1

// }

glPushMatrix();



if((status.flag==1)&&(status.delta>=1)) //Åñëè èä¸ò àêêðåöèÿ 1

{

//DrawSphere íåìíîãî èçìåíåíà - äîáàâëåí ïàðàìåòð, îòâå÷àþùèé çà ðàçìåðû êîíóñà



glColor3d(0.90,0.95,0.90);

status.DrawSphere(status.x1,status.y1,status.z1,status.razmerzv1+status.delta/10,status.razmerzv1+status.delta/10);

// glColor3d(0,1,0);

status.DrawSphere(status.x2,status.y2,status.z2,status.razmerzv2,0);


}

else if((status.flag==2)&&(status.delta>=1)) //Åñëè àêêðåöèÿ íå èä¸ò, òî ðèñóþòñÿ ïðîñòî ñôåðû

{

glPushMatrix();



glColor3d(0.90,0.95,0.90);

status.DrawSphere(status.x1,status.y1,status.z1,status.razmerzv1,0);

// glColor3d(0,1,0);

status.DrawSphere(status.x2,status.y2,status.z2,status.razmerzv2,status.razmerzv2+status.delta/10);

}

else


{

glPushMatrix();

glColor3d(0.90,0.95,0.90);

status.DrawSphere(status.x1,status.y1,status.z1,status.razmerzv1,0);

// glColor3d(0,1,0);

status.DrawSphere(status.x2,status.y2,status.z2,status.razmerzv2,0);

}

glColor3d(0,0,0);



status.DrawSphere(X,Y,0,2,0);

if(status.flag) {

status.t=2;

status.Acrethion();

for(long int i=0;i

{//if((i!=0)&&((abs(Tochki[i].x-Tochki[i-1].x)<=10)||(abs(Tochki[i].y-Tochki[i-1].y)<=10)||(abs(Tochki[i].z-Tochki[i-1].z)<=0))) break;

//status.DrawSphere(15,15+i,15,2);

status.DrawSphere(Tochki[i].x,Tochki[i].y,Tochki[i].z,2,0);

}

}

//Оси координат



float xx,yy,zz;

if(m_Coord==1)

{

glPointSize(1);



glPushMatrix();

glBegin(GL_POINTS);

glColor3d(0,0,0);

//status.DrawSphere(0,0,0,-status.zoom/150);

for(xx=-300;xx<300;xx+=0.1)

{

glVertex3d(xx,0,0);



}

for(xx=300;xx>280;xx-=0.1)

{

glVertex3d(xx,100-xx/3,0);



}

for(xx=300;xx>280;xx-=0.1)

{

glVertex3d(xx,-100+xx/3,0);



}

glEnd();
glBegin(GL_POINTS);

for(yy=-250;yy<250;yy+=0.1)

{

glVertex3d(0,yy,0);



}

for(yy=250;yy>230;yy-=0.1)

{

glVertex3d(83-yy/3,yy,0);



}

for(yy=250;yy>230;yy-=0.1)

{

glVertex3d(-83+yy/3,yy,0);



}

glEnd();
glBegin(GL_POINTS);

for(zz=-200;zz<200;zz+=0.1)

{

glVertex3d(zz,zz/2,0);



}

for(zz=-200;zz<-180;zz+=0.1)

{

glVertex3d(zz,zz/1.2+68,0);



}

for(zz=-200;zz<-180;zz+=0.1)

{

glVertex3d(zz,zz/4.5-56,0);



}

glEnd();


}

glPopMatrix();

glFinish();

SwapBuffers(wglGetCurrentDC());



}

void CStatistic::DrawSphere(double x,double y,double z, double size, double cone_size)

{

glPushMatrix();

glTranslated(x, y, z);

//PolygonalSphere(size, 32, 32);

glutSolidSphere(size,32,32);

if(accr==TRUE) //Åñëè íà÷àëàñü àêêðåöèÿ

{

glColor3d(0.95,0.95,0.9);

glRotated(180,1,0,0); //Ïîâîðîò êîíóñà íà 180 ãðàäóñîâ, îðèåíòèðîâàíèå åãî â ñòîðîíó ê òî÷êå Ëàãðàíæà

glutSolidCone(cone_size,cone_size+delta,30,30); //Ðèñîâàíèå êîíóñà

delta+=0.01; //Óâåëè÷åíèå ïåðåìåííîé, îòâå÷àþùåé çà äëèíó êîíóñà

}

//glColor3d(0,0,0);

glPopMatrix();

}

#define CACHE_SIZE 240

#define SIN sinf

#define COS cosf

#define M_PI 3.141592653

void CStatistic::PolygonalSphere(GLdouble radius, GLint slices, GLint stacks)

{

GLint i, j;

GLfloat sinCache1a[CACHE_SIZE];

GLfloat cosCache1a[CACHE_SIZE];

GLfloat sinCache2a[CACHE_SIZE];

GLfloat cosCache2a[CACHE_SIZE];

GLfloat sinCache1b[CACHE_SIZE];

GLfloat cosCache1b[CACHE_SIZE];

GLfloat sinCache2b[CACHE_SIZE];

GLfloat cosCache2b[CACHE_SIZE];

GLfloat angle;

GLfloat zLow, zHigh;

GLfloat sintemp1, sintemp2, sintemp3, sintemp4;

GLfloat costemp3, costemp4;

if (slices >= CACHE_SIZE) slices = CACHE_SIZE - 1;

if (stacks >= CACHE_SIZE) stacks = CACHE_SIZE - 1;

if (slices < 2 || stacks < 1 || radius < 0.0)

return;

for (i = 0; i < slices; i++)

{

angle = 2 * M_PI * i / slices;

sinCache2a[i] = sinCache1a[i] = SIN(angle);

cosCache2a[i] = cosCache1a[i] = COS(angle);

}

for (j = 0; j <= stacks; j++)

{

angle = M_PI * j / stacks;

sinCache2b[j] = SIN(angle);

cosCache2b[j] = COS(angle);

sinCache1b[j] = (float)radius * sinCache2b[j];

cosCache1b[j] = (float)radius * cosCache2b[j];

}

/* Make sure it comes to a point */

sinCache1b[0] = 0;

sinCache1b[stacks] = 0;

sinCache1a[slices] = sinCache1a[0];

cosCache1a[slices] = cosCache1a[0];

sinCache2a[slices] = sinCache2a[0];

cosCache2a[slices] = cosCache2a[0];

for (j = 0; j < stacks; j++)

{

zLow = cosCache1b[j];

zHigh = cosCache1b[j+1];

sintemp1 = sinCache1b[j];

sintemp2 = sinCache1b[j+1];

sintemp3 = sinCache2b[j+1];

costemp3 = cosCache2b[j+1];

sintemp4 = sinCache2b[j];

costemp4 = cosCache2b[j];

glBegin(GL_QUAD_STRIP);

for (i = 0; i <= slices; i++)

{

glNormal3f(sinCache2a[i] * sintemp3, cosCache2a[i] * sintemp3, costemp3);

glTexCoord2f(1 - (float)i / slices, 1 - (float) (j+1) / stacks);

glVertex3f(sintemp2 * sinCache1a[i], sintemp2 * cosCache1a[i], zHigh);

glNormal3f(sinCache2a[i] * sintemp4, cosCache2a[i] * sintemp4, costemp4);

glTexCoord2f(1 - (float)i / slices, 1 - (float) j / stacks);

glVertex3f(sintemp1 * sinCache1a[i], sintemp1 * cosCache1a[i], zLow);

}

glEnd();

}



Достарыңызбен бөлісу:




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет