Курсова крок 1
Картинки чим далі, тим красивіші.
Спочатку я думав знаходити якусь точку на межі нашої множини, і пошуком в ширину знаходити решту точок на її поверхні. Але, таке хоча і мало б працювати швидше, підходить не для всіх множин. Ми ж можемо мати і не однозв’язну множину. Що робити тоді? Як знайти кількість компонент зв’язності?
Тому, я подумав, що все таки варто перевірити всі точки певного куба. Назвемо цю множину . Елементи цієї множини назвемо кубелями (по аналогії з пікселями).
Але так як функція може бути складнюча, а обчислення тригонометрії на кожен кадр для кожного кубеля справа тормозяча, то я вирішив записати її значення в умовно кажучи карту висот. (Там для кожної проекції (x,y) вказується набір відрізків прямої паралельної z що проходить через (x,y) , на якому характеристична функція приймає значення true. Тому можна сказати що це вже явне задання множини, з витратою пам'яті в середньому n2).
Виглядає це все приблизно так:
class SetMap
{
vector <vector <vector <Interval> > > body;
double delta,size;
int Nsize;
double coord(int x)
{
return x*delta - size;
}
public:
SetMap(double d,double s)
{
delta=d; size=s;
Nsize=size/delta*2+1;
body.resize(Nsize);
for(int i=0;i<Nsize;i++) body[i].resize(Nsize);
}
void scan(XiFunc xi)
{
for(int i=0;i<Nsize;i++)
for(int j=0;j<Nsize;j++)
{
double x=coord(i);
double y=coord(j);
bool in=false;
Interval cur;
for(int k=0;k<Nsize;k++)
{
if((!in)&&xi(x,y,coord(k)))
{
cur.a=k;
in=true;
}
if(in&&(!xi(x,y,coord(k))))
{
cur.b=k-1;
in=false;
body[i][j].push_back(cur);
}
}
if(in)
{
cur.b=Nsize-1;
body[i][j].push_back(cur);
}
}
}
void draw()
{
glBegin(GL_QUADS);
for(int i=0;i<Nsize;i++)
for(int j=0;j<Nsize;j++)
for(int k=0;k<body[i][j].size();k++)
{
cubel2(coord(i),coord(j),coord(body[i][j][k].a),coord(body[i][j][k].b),delta);
}
glEnd();
}
};
І я не рахував яку складність ми отримаємо, але картинки стають більш детальними:
Все та ж куля з отворами:
А тут треба згадувати алгебру. Певне все таки гіперболічний параболоїд:
Ха. Я ще прочитаю про NURBS чи ще щось хороше, і MathLab мене не переплюне.





bunyk, поясни, будь ласка, нашо це все потрібно?:) Особливо “Гіперболічний параболоїд, чи щось таке”. Де можна використати ці знання? В яких галузях їх застосовують? Питаю просто з цікавості, жодних підколів.
pasha
Жовтень 9, 2009 at 12:57
Захотілось мені написати це на теорії ймовірностей. Ну і раз гіперболічний параболоїд, то і в алгебрі. В геометрії. (В комп’ютерній графіці
)
Ну, взагалі це просто інструмент, і нових знань не дасть. Хіба що його по новому використати. Але наочність може прискорити освоєння нових знань.
bunyk
Жовтень 9, 2009 at 14:33
Емммм… Гарно пояснив, доступно так:)
pasha
Жовтень 9, 2009 at 17:14
Крім цього ще є основна причина, про яку я забув.
Just for fun!
І ще в процесі я планую закріпити і розширити знання STL, OpenGL, SDL, можливо GTK+, і математику в кінці-кінців.
bunyk
Жовтень 9, 2009 at 19:14