Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Курсова крок 1

with 4 comments

Картинки чим далі, тим красивіші.

Спочатку я думав знаходити якусь точку на межі нашої множини, і пошуком в ширину знаходити решту точок на її поверхні. Але, таке хоча і мало б працювати швидше, підходить не для всіх множин. Ми ж можемо мати і не однозв’язну множину. Що робити тоді? Як знайти кількість компонент зв’язності?

Тому, я подумав, що все таки варто перевірити всі точки певного куба. Назвемо цю множину Z^3_\delta=\{ (x,y,z)| \frac{x}{\delta}\in Z \wedge \frac{y}{\delta}\in Z \wedge \frac{z}{\delta}\in Z \wedge |x|<\text{size} \wedge |y|<\text{size} \wedge |z|<\text{size} \} . Елементи цієї множини назвемо кубелями (по аналогії з пікселями).

Але так як функція може бути складнюча, а обчислення тригонометрії на кожен кадр для кожного кубеля справа тормозяча, то я вирішив записати її значення в умовно кажучи карту висот. (Там для кожної проекції (x,y) вказується набір відрізків прямої паралельної z що проходить через (x,y) , на якому характеристична функція приймає значення true. Тому можна сказати що це вже явне задання множини, з витратою пам'яті в середньому n2).

Виглядає це все приблизно так:

class SetMap
{
    vector &lt;vector &lt;vector &lt;Interval&gt; &gt; &gt; 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&lt;Nsize;i++) body[i].resize(Nsize);
    }
    void scan(XiFunc xi)
    {
        for(int i=0;i&lt;Nsize;i++)
            for(int j=0;j&lt;Nsize;j++)
            {
                double x=coord(i);
                double y=coord(j);

                bool in=false;
                Interval cur;
                for(int k=0;k&lt;Nsize;k++)
                {
                    if((!in)&amp;&amp;xi(x,y,coord(k)))
                    {
                        cur.a=k;
                        in=true;
                    }
                    if(in&amp;&amp;(!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&lt;Nsize;i++)
            for(int j=0;j&lt;Nsize;j++)
                for(int k=0;k&lt;body[i][j].size();k++)
                {
                    cubel2(coord(i),coord(j),coord(body[i][j][k].a),coord(body[i][j][k].b),delta);
                }
        glEnd();
    }
};

І я не рахував яку складність ми отримаємо, але картинки стають більш детальними:

Сфера в більшій роздільній здатності

Сфера в більшій роздільній здатності


Все та ж куля з отворами:
\begin{cases} x^2+y^2+z^2 \leq 1 \\ x^2+y^2 \geq \frac{1}{4}  \\ x^2+z^2 \geq \frac{1}{4} \\ z^2+y^2 \geq \frac{1}{4} \end{cases}

Гіперболічний параболоїд, чи щось таке

Гіперболічний параболоїд, чи щось таке


А тут треба згадувати алгебру. Певне все таки гіперболічний параболоїд:
0.4<x^2+y^2-z^2<0.5

Ха. Я ще прочитаю про NURBS чи ще щось хороше, і MathLab мене не переплюне. 😉

Advertisements

Written by bunyk

Жовтень 9, 2009 at 12:14

Оприлюднено в Графіка, Кодерство

Tagged with

Відповідей: 4

Subscribe to comments with RSS.

  1. 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


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: