Наскільки я знаю: потрібно рахувати 3 визначники, які і будуть координатами нормалі.
Перша координата це визначник складений з координат т. А(y, z) та т. B(y, z) і т. д.

Але чи правильно я думаю, підкажіть, будь ласка.

Усім привіт.
Роблю задачу усунення невидимих граней для проекції октаедра.
Так от для алгоритму мені потрібно знайти нормалі для кожної грані.
Питання як знайти їх, якщо я маю координати вершин октаедра.

struct OctaVertex {
    float x, y, z;
};

3

(5 відповідей, залишених у Дизайн та графіка)

а якщо не використовувати OpenGL для побудови октаедра.
Що потрібно для центральної проекції октаедра ?

4

(5 відповідей, залишених у Дизайн та графіка)

Величезне дякую )
Буду розбиратись  *THUMBSUP*

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);

Це ж алгоритм Z - буфера відсікання невидимих граней, правильно ?

5

(5 відповідей, залишених у Дизайн та графіка)

Дуже дякую )

Можливо, хтось ще знає функцію для зафарбовування граней ?

6

(5 відповідей, залишених у C++)

вже не актуально.
Списки переписав в масиви.
І на масивах реалізував додавання, проходом з кінця на початок.
Усім дякую )

7

(5 відповідей, залишених у Дизайн та графіка)

Привіт усім.
Підкажіть, будь ласка, алгоритм чи код побудови октаедра в OpenGL.

8

(4 відповідей, залишених у Обговорення)

0x9111A написав:

А в чому по вашому різниця між багатоцифровими і небагатоцифровими числами в термінах польського інверсного запису?

та я не знаю ))
Просто на просторах Інтернету зустрічав лише дії над цифрами.
Де поміщали перший операнд у стек, потім другий і після цього виконували дію.
А з багатоцифровими числами просто хочу уточнити: потрібно просто перше число повністю помістити у стек, потім друге і опісля просто виконати додавання/віднімання цих чисел ? Чи як ?
Чи для такої однієї дії взагалі нераціонально використовувати даний запис ?

9

(4 відповідей, залишених у Обговорення)

Мене зацікавив даний спосіб запису операцій. Читаючи про нього, так і не зрозумів як би можна було подати додавання чи віднімання багатоцифрових чисел. Наприклад: 16846 + 3116.
і як Ви вважаєте, коли його доцільно використовувати?

10

(5 відповідей, залишених у C++)

koala написав:

Ви вкрай невдало вибрали структуру для збереження інформації.
По суті: вам треба взяти останні елементи двох списків, скласти їхні значення, записати результат (за модулем 10) в останній елемент нового списку. Потім взяти ПЕРЕДостанні елементи... ви вже побачили проблему?

я дійду до останього елементу у списку, але потім повернутись назад не зможу ж, оскільки в мене однонапрямлений список.

а повернутись назад мені потрібно в будь-якому випадку.
як би це обійти, крім двозв'язного списку?

Усім привіт.
Прошу Вас допомогти у вирішенні такого завдання :
я створив клас Довге ціле число , для збереження числа використав лінійний однонапрямлений список .

struct Digit {
        short a;
        Digit *next;
};

class LongDigit {
    Digit *head;
    short len;
public:
    LongDigit();
    LongDigit(char*, short);
    LongDigit(const LongDigit&);
    ~LongDigit();
    LongDigit& operator=(const LongDigit&);
    void input ();
    void print();
    inline friend int GetLen(const LongDigit);
    void ifNULL();
    void normalyze();
    friend LongDigit operator+ (const LongDigit, const LongDigit);
    friend LongDigit operator- (const LongDigit, const LongDigit);
};

LongDigit::LongDigit(){
    head = NULL;
    len = 0;
    cout << "\nConstruktor default\n";
}

LongDigit::LongDigit(char *ch, short n){
    len = n;
    head = new Digit;
    if(len) {
        short tmp;
        Digit *end = head;
        for(int i = 0; i < len; i ++) {
            tmp = ch[i] - '0';
            end->a = tmp;
            if(i != len - 1) {
                end->next = new Digit;
                end = end->next;
            }
        }
        end->next = NULL;
    }
    else {
        head->a = 0;
        head->next = NULL;
    }
    cout << "\nConstructor with parameters\n";
}

LongDigit::LongDigit(const LongDigit &ob) {
    len = ob.len;
    if(len) {
        head = new Digit;
        Digit *end = head;
        Digit *tmp = ob.head;
        for(int i = 0; i < len; i ++) {
            end->a = tmp->a;
            if(i != len - 1) {
                end->next = new Digit;
                end = end->next;
            }
            tmp = tmp->next;
        }
        end->next = NULL;
        }
    else
        head = NULL;
    cout << "copy construktor\n";
}

LongDigit::~LongDigit(){
    if(len) {
        Digit *end = head;
        Digit *tmp;
        while(end) {
            tmp = end->next;
            delete end;
            end = tmp;
        }
        delete head;
        len = 0;
        cout << "\nDestruktor worked\n";
    }
}

LongDigit& LongDigit::operator=(const LongDigit &ob) {
    len = ob.len;

    if(len) {
        Digit *end = head;
        Digit *tmp;
        while(end) {
            tmp = end->next;
            delete end;
            end = tmp;
        }
        delete head;
    /* ********************************************** */
        head = new Digit;
        Digit *h = head;
        end = ob.head;
        do {
            h->a = end->a;
            h->next = new Digit;
            h = h->next;
            end = end->next;
        }
        while(end);
        h = NULL;
    }
    return *this;
}

void LongDigit::input() {
    cout << "Введіть кількість цифр у числі\n";
    cin >> len;
    head = new Digit;

    if(len) {
        cout << "Введіть число\n";
        char *ch = new char[len];
        short tmp;
        cin >> ch;
        Digit *end = head;
        for(int i = 0; i < len; i ++){
            tmp = ch[i] - '0';
            end->a = tmp;
            if(i != len - 1) {
                end->next = new Digit;
                end = end->next;
            }
        }
        end->next = NULL;
        delete ch;
    }
    else {
        head->a = 0;
        head->next = NULL;
    }
}

void LongDigit::print(){
    cout << "\n*** Output ***\n";
    if(len){
        Digit *end = head;
        while(end) {
            cout << end->a;
            end = end->next;
        }
        cout << endl;
    }
    else
        cout << "0\n";
}

void LongDigit::ifNULL() {
    cout << "\n*** If NULL ***\n";

    if(head == NULL)
        cout << "Число дорівнює нулю!\n";
    else if(head->a == 0 && head->next == NULL) {
        cout << "Число дорівнює нулю!\n";
    }
    else
        cout << "Число не дорівнює нулю!\n";
}

int GetLen(LongDigit ob) {
    return ob.len;
}

void LongDigit::normalyze() { // відкидання нулів на початку
    if(len == 0 || len == 1)
        return;
    Digit *end = head;
    short flag = 0;
    for(int i = 0; i < len; i ++) {
        if(end->a == 0){
            end = end->next;
        }
        else{
            flag = 1;
            break;
        }
    }
    if(flag == 1) {
            short count = 0; // лічильник для підрахунку видалених елементів
        for(int i = 0; i < len; i ++) {
            if(head->a == 0) {
                end = head->next;
                delete head;
                head = end;
                count ++;
                if(head->a != 0)
                    break;
            }
        }
        len -= count; // становлення правильного розміру числа після видалення нулів
    }
    else {
        Digit *tmp;
        end = head->next;
        while (end != NULL){
            tmp = end->next;
            delete end;
            end = tmp;
        }
        head->next = NULL;
        delete tmp;
        len = 1;
    }
}

Тобто число розбите по розрядах.
І тепер мені потрібно перевизначити оператор додавання для цього класу, а як це зробити - важко собі уявляю, тому надіюсь на Вашу допомогу.

12

(4 відповідей, залишених у C++)

ОСь я дописав:
Створив кнопку, тсрічку вводу для n і для кнопки написав такий код ?
Він відповідає умові задачі :?


float x = 0, y = 0, x1, x2, y1, y2; 
int i, n = StrToInt(Edit1 -> Text);
for(i = 0; i < n; i++)
{
    // лівий верхній кут і правий нижній координати
    Form1->Canvas->Rectangle(x1 = 200 + x, y1 = 300 + y, x2 = 825 - x, y2 = 325 + y);
    y += 25;
    x += 0.1 * (x2 - x1);
    Form1->Canvas->Brush->Color = (TColor)RGB(rand() % 255, rand() % 255, rand() % 255);
}

13

(4 відповідей, залишених у C++)

Усім привіт.
Ось наткнувся на таку задачу: потрібно вивести на екран різнокольорову дитячу пірамідку з n (ми його вводимо) прямокутників, кожен з яких зменшується від попереднього на 10%.
Почав шукати в І - неті теорію, оскільки тільки почав пізнавати С++ і графіку.
трішки коду написав, але він лише створює прямокутник і окрашує його в червоний колір.
Допоможіть, будь ласка, з кодом або теорією, що б допомогла мені з цією задачею

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int n = StrToInt(Edit1->Text);
    Form1->Canvas->Rectangle(10, 10, 110, 110);
    Canvas->Brush->Color = clRed;
    Form1->Canvas->FloodFill(15, 15, clRed, fsSurface);
}

14

(9 відповідей, залишених у C++)

всім привіт..
От ніяк не можу вирішити задачу, будь ласка, допоможіть довести код до коректного вигляду.
Відомо, що в школі N класів (15≤N≤20) і в кожному класі навчається по 30 учнів. Підсумковий результат з математики (сума всіх оцінок за семестр) учнів всієї школи виписаний у вигляді таблиці розміром N*30, де кожний рядок  це підсумкові оцінки учнів даного класу з математики відповідно до списку в класному журналі. Визначити порядкові номери учнів у кожному класі, які мають найкращі та найгірші підсумкові бали з математики. Визначити також найкращих та найгірших учнів по всій школі.


буду дуже вдячний за будь- яку допомогу