Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм "плавающего горизонта", Помогите разобраться с алгоритмом... 
:(
    Опции темы
Shadex
Дата 26.5.2005, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 23.5.2005

Репутация: нет
Всего: 1



Кто-нибудь знаком с алгоритмом "плавающего горизонта"? Мне необходимо нарисовать элипсоид вращения (формула (x*x)/(a*a)+(y*y)/(b*b)+(z*z)/(c*c)=1 при a=b), чтобы он был расположен в дальнем углу поля, при соотношении полуосей 2:2:1... у меня есть примерный код для рисования параболоида... подскажите если можете, что нужно в нем исправить, что бы нарисовать элипсоид! Или хотя бы объясните что происходит в этом коде, а то я только начал изучать С++ ... Заранее благодарен! smile

#include <graphics.h>
#include <math.h>
#include <dos.h>
#include <conio.h>

float dx;
float dz=0.1;
float lengx=12;
float lengz=12;
float x0=-5, y0=2, z0=-8;
float alpha=M_PI/4;
float scale=33;
float a;
int gd,gm;
int hor1[640];
int hor2[640];
int old_x, old_y;
int i,g,tmx,resy,tmy,k,zxc;

int round(float f) {
return ((int)(f+0.5));
}

float fy(float x, float z) {
float a=2,b=2,c=1,y,d;
d=(-(x*x)/(a*a)-(c-z)/©)*(b*b);
if (d<0) y=0; else y=sqrt(d);
return y;
//

}

void func3d(int color_up,int color_down,int speed)
{
float x, z;
int rx, ry;
int rx0=0,ry0=0;
char flag1=0;
char flag2=0;

i=1;
zxc=0;
for(z=z0;z<=z0+lengz;z+=dz)
{
zxc++;
for(x=x0;x<=x0+lengx;x+=dx)
{
rx=round((x-x0)*scale+rx0);
ry=round((fy(x,z)-y0)*scale+ry0);
flag1=0;
flag2=0;
if(hor1[rx]<ry)
{
flag1=1;
hor1[rx]=ry;
}
if(hor2[rx]>ry)
{
flag2=1;
hor2[rx]=ry;
}
if(flag1)
{
i++;
// if (i%(speed)==0) delay(1);
putpixel(rx,480-ry,color_up);
}
else if(flag2) putpixel(rx,480-ry,color_down);
//--------------------------------------------------------------------------
if((x>(lengx/2)-dx) && (zxc>1))
{
if(old_x!=0 && old_x>350) line(old_x,old_y,rx,480-ry);
old_x=rx; old_y=480-ry;
}
//--------------------------------------------------------------------------
if(x>(lengx/2)-dx) { tmx = rx; tmy = ry; }
}
rx0+=round(dz*cos(alpha)*scale);
ry0+=round(dz*sin(alpha)*scale);
}
}


void main(void)
{
gd=DETECT;
initgraph( &gd, &gm, "" );
dx=1/(scale);
settextstyle(GOTHIC_FONT, HORIZ_DIR, 3);
outtextxy(151,100, "Hit any key to stop the process...");
outtextxy(430,420, "By Chuper Corp...");
settextstyle(0, HORIZ_DIR, 1);
outtextxy(512,455, "1088/3 Group");

for (i=0;i<640;i++) hor1[i]=0;
for (i=0;i<640;i++) hor2[i]=480;
func3d(9,4,5);
getch();
closegraph();
}
PM MAIL   Вверх
kometa_triatlon
Дата 26.5.2005, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 2
Всего: 6



Код

#include <graphics.h>
#include <math.h>
#include <dos.h>
#include <conio.h>

float dx;
float dz=0.1;
float lengx=12;
float lengz=12;
float x0=-5, y0=2, z0=-8;
float alpha=M_PI/4;
float scale=33;
float a;
int gd,gm;
int hor1[640];
int hor2[640];
int old_x, old_y;
int i,g,tmx,resy,tmy,k,zxc;

int round(float f) {
return ((int)(f+0.5));
}

float fy(float x, float z) {
float a=2,b=2,c=1,y,d;
d=(-(x*x)/(a*a)-(c-z)/©)*(b*b);
if (d<0) y=0; else y=sqrt(d);
return y;
//

}

void func3d(int color_up,int color_down,int speed)
{
float x, z;
int rx, ry;
int rx0=0,ry0=0;
char flag1=0;
char flag2=0;

i=1;
zxc=0;
for(z=z0;z<=z0+lengz;z+=dz)
{
zxc++;
for(x=x0;x<=x0+lengx;x+=dx)
{
rx=round((x-x0)*scale+rx0);
ry=round((fy(x,z)-y0)*scale+ry0);
flag1=0;
flag2=0;
if(hor1[rx]<ry)
{
flag1=1;
hor1[rx]=ry;
}
if(hor2[rx]>ry)
{
flag2=1;
hor2[rx]=ry;
}
if(flag1)
{
i++;
// if (i%(speed)==0) delay(1);
putpixel(rx,480-ry,color_up);
}
else if(flag2) putpixel(rx,480-ry,color_down);
//--------------------------------------------------------------------------
if((x>(lengx/2)-dx) && (zxc>1))
{
if(old_x!=0 && old_x>350) line(old_x,old_y,rx,480-ry);
old_x=rx; old_y=480-ry;
}
//--------------------------------------------------------------------------
if(x>(lengx/2)-dx) { tmx = rx; tmy = ry; }
}
rx0+=round(dz*cos(alpha)*scale);
ry0+=round(dz*sin(alpha)*scale);
}
}


void main(void)
{
gd=DETECT;
initgraph( &gd, &gm, "" );
dx=1/(scale);
settextstyle(GOTHIC_FONT, HORIZ_DIR, 3);
outtextxy(151,100, "Hit any key to stop the process...");
outtextxy(430,420, "By Chuper Corp...");
settextstyle(0, HORIZ_DIR, 1);
outtextxy(512,455, "1088/3 Group");

for (i=0;i<640;i++) hor1[i]=0;
for (i=0;i<640;i++) hor2[i]=480;
func3d(9,4,5);
getch();
closegraph();
}



--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Shadex
Дата 26.5.2005, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 23.5.2005

Репутация: нет
Всего: 1



Всем спасибо, кто сюда зашел и посмотрел! Я уже все сделал! smile Оказывается ничего сложного тут нет!
PM MAIL   Вверх
Doc_d0s
Дата 27.5.2005, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 15.12.2004
Где: в кресле

Репутация: 2
Всего: 3



Дай код плз, мне тожа с крафикой надо работать, и тожа фигуры вращенияsmile
--------------------
Админ- это вождь Apache'й :)
PM MAIL ICQ   Вверх
Shadex
Дата 27.5.2005, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 23.5.2005

Репутация: нет
Всего: 1



так ведь код написан сверху! весь! только это для С под DOS... но его легко можно переделать для Bilder нужно Convas сделать и все!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0919 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.