Автор Тема: си плюс плюс  (Прочитано 9132 раз)

Оффлайн LanuHum

  • Житель
Re: си плюс плюс
« Ответ #30 : 31 Октябрь 2016, 20:14:03 »
Цитировать
Вот, кажется нашёл в одном из накачанных примеров рейтрейсеров про наследников и то, как это делается
...

Код
    objects.push_back(dynamic_cast<Object*>(mesh));
    objects.push_back(dynamic_cast<Object*>(plane));
Я тебе примерно это и толковал...

Но тут мои собственные знания и заканчиваются, к сожалению. Мне непонятно, как этот рейтрейсер, работая с массивом objects понимает, где тут Mesh, где Plane, и т.д., и, самое главное, как к ним применять функции, специфичные для этих разных классов? Я представляю себе такую возможность только через собственные виртуальные функции (здесь это intersect, computeBoundingBox, getNormalAt и rotate), а вот где-то извне... Ну разве что бесконечно длинные простыни со switch-case (терпеть их не могу).
Поищи там пример такого разбора.
Кажись, нашёл. Всё очень просто в рамках рейтрейсера. Это ж виртуальные функции, содержимое которых разное, и написано оно для каждого типа отдельно. Ему, просто, не нужно знать: меш это или плоскость.
Код
for (int i = 0, i < objects.size(); i  ){
    Object* RtObject = objects[i];
    RtObject -> computeBoundingBox();}
Теперь проясняется о чём sungreen толковал про get_type. Запрашиваем тип и используем switch...

Вот, глянь mesh.cpp
Код
#include "Mesh.h"
#include <iostream>

Mesh::Mesh() {
    position = Point3(0,0,0);
}

Mesh::Mesh(const Point3 &pos) {
    position = pos;
}

Mesh::~Mesh() {
    // TODO: stub
}

void Mesh::addVertex(float x, float y, float z) {
    vertices.push_back(new Vector3(x, y, z));
}

void Mesh::addNormal(float x, float y, float z) {
    normals.push_back(new Vector3(x, y, z));
}

void swap(float &a, float &b) {
    float temp = a;
    a = b;
    b = temp;
}

IntersectType intersectBbox(const Ray &r, const Mesh *m) {
    float tmin = (m->bboxMin.x - r.position.x) / r.direction.x;
    float tmax = (m->bboxMax.x - r.position.x) / r.direction.x;
    float tymin = (m->bboxMin.y - r.position.y) / r.direction.y;
    float tymax = (m->bboxMax.y - r.position.y) / r.direction.y;
    float tzmin = (m->bboxMin.z - r.position.z) / r.direction.z;
    float tzmax = (m->bboxMax.z - r.position.z) / r.direction.z;
    if(tmin > tmax) swap(tmin, tmax);
    if(tymin > tymax) swap(tymin, tymax);
    if((tmin > tymax) || (tymin > tmax))
        return MISS;
    if(tymin > tmin)
        tmin = tymin;
    if(tymax < tmax)
        tmax = tymax;
    if(tzmin > tzmax) swap(tzmin, tzmax);
    if((tmin > tzmax) || (tzmin > tmax))
        return MISS;
    if(tzmin > tmin) {
        tmin = tzmin;
    }
    if(tzmax < tmax) {
        tmax = tzmax;
    }
    return HIT;
}

IntersectType Mesh::intersect(const Ray &ray, IntersectData *data) const {
    if(intersectBbox(ray, this) == MISS) {
        return MISS;
    }

    int closestTriangleIndex = 0;
    float closestDistance = data->t;

    bool retval = false;
    for(int i = 0; i < normals.size();   i) {
        //Vector3 normal = *normals[i];
        Triangle triangle(*vertices[i*3], *vertices[i*3 1], *vertices[i*3 2]);
        triangle.intersect(ray, &(*data));
        if(data->t < closestDistance) {
            closestTriangleIndex = i;
            closestDistance = data->t;
            retval = true;
        }
    }

    if(retval) {
        Triangle triangle(*vertices[closestTriangleIndex*3], *vertices[closestTriangleIndex*3 1], *vertices[closestTriangleIndex*3 2]);
        return triangle.intersect(ray, &(*data));
    } else {
        return MISS;
    }
    return MISS;
}

Vector3 Mesh::getNormalAt(const Point3 &p) const {
    // TODO: fixme
    return Vector3(0,0,0);
}

void Mesh::computeBoundingBox() {
    // TODO
}



void Mesh::rotate(const Vector3 &n, const float theta) {
    float a = n.x*n.x*(1 - cos(theta))       cos(theta);
    float b = n.x*n.y*(1 - cos(theta))   n.z*sin(theta);
    float c = n.x*n.z*(1 - cos(theta)) - n.y*sin(theta);
   
    float d = n.x*n.y*(1 - cos(theta)) - n.z*sin(theta);
    float e = n.y*n.y*(1 - cos(theta))       cos(theta);
    float f = n.y*n.z*(1 - cos(theta))   n.x*sin(theta);

    float g = n.x*n.z*(1 - cos(theta))   n.y*sin(theta);
    float h = n.y*n.z*(1 - cos(theta)) - n.x*sin(theta);
    float i = n.z*n.z*(1 - cos(theta))       cos(theta);

    Matrix33 R(a,b,c,d,e,f,g,h,i);

    for(int i = 0; i < vertices.size(); i  ) {
        Vector3 &v = *vertices[i];
        *vertices[i] = v*R;
    }

    for(int i = 0; i < normals.size(); i  ) {
        Vector3 &v = *normals[i];
        *normals[i] = v*R;
                     
                     
    }
}             

Оффлайн LanuHum

  • Житель
Re: си плюс плюс
« Ответ #31 : 31 Октябрь 2016, 23:19:02 »
с getType() получилось, а вот данные извлекать не получается. Необходимы виртуальные функции getData() для BlenderObject и для BlenderMesh.
Нужно думать. ???

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: си плюс плюс
« Ответ #32 : 01 Ноябрь 2016, 05:52:22 »
>> функции getData() для BlenderObject и для BlenderMesh.
... для быстрого доступа к свойствам и методам, наверное будет уместным использовать приведение типов ...
... то есть, нужно разобраться как от BlenderMesh* перейти к BlenderObject* ...
https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B8%D0%BF%D0%B0
Для Кота

Оффлайн LanuHum

  • Житель
Re: си плюс плюс
« Ответ #33 : 01 Ноябрь 2016, 16:56:36 »
>> функции getData() для BlenderObject и для BlenderMesh.
... для быстрого доступа к свойствам и методам, наверное будет уместным использовать приведение типов ...
... то есть, нужно разобраться как от BlenderMesh* перейти к BlenderObject* ...
https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B8%D0%BF%D0%B0
Ну, так я ж и использовал приведение типов для getType().
Код
void BlenderScene::addMesh(std::string name,BlenderMesh* mesh){
    BlenderObject *obj = dynamic_cast<BlenderObject*>(mesh);
    objects.insert ( pair<std::string,BlenderObject*>(name,obj) );
}
Просто, я предполагал, что получив тип, я могу обращаться к объекту как к мешу, но, оказалось, это ни так. Но, получается совсем здорово, мне не нужно писать getData(), мне нужно писать виртуальную функцию создания объекта сразу на месте. Это будет круто.

Вот это неверное решение:

Код
int BlenderScene::addObjectToPovray(std::string name){
    BlenderObject *bobject = objects.find(name) -> second;
    if (!bobject)
        return 0;
    int obj_type = bobject -> getType();
    switch (obj_type) {
        case 2: {
            Mesh *mesh = new Mesh();  // create Povray Mesh
            mesh -> vertex_vectors = bobject -> vertex_vectors;
            break;
        }
        case 1: {}
        default: {}
    }
    return 1;
}

Надеюсь, что это верное:

Код
void BlenderScene::addObjectToPovray(std::string name){
    BlenderObject *bobject = objects.find(name) -> second;
    bobject -> createPovrayObject();
}

Виртуальная функция createPovrayObject() будет написана и в BlenderObject.h, и для BlenderMesh.h, и для BlenderBlob.h, и для BlenderBoolean.h, но тело функции в соответствующих файлах .cpp будет индивидуальным.
« Последнее редактирование: 01 Ноябрь 2016, 17:33:26 от LanuHum »

Оффлайн Samovar

  • Житель
Re: си плюс плюс
« Ответ #34 : 01 Ноябрь 2016, 17:43:19 »
Писдец... я вобще не понимаю, как можно что-то серьёзное программировать без знания того, как организована память в компутере... и почему есть целые переменные, а есть вещественные... и т.д., и т.п... Ланухумыч, ты уникален! :)

Оффлайн LanuHum

  • Житель
Re: си плюс плюс
« Ответ #35 : 01 Ноябрь 2016, 18:23:16 »
Писдец... я вобще не понимаю
Ты тупой. :)  В C++ не нужно управлять памятью вручную, это тебе не С. Памятью управляют вручную, когда создают указатели.
Object *samovar = new Object();
delete samovar;
delete освобождает память занятую объектом samovar, который мы создали для определённых целей и достигли этих целей.
Сколько тебе показать подобных картинок, чтоб ты не выдавал желаемое за действительное?


Оффлайн Samovar

  • Житель
Re: си плюс плюс
« Ответ #36 : 01 Ноябрь 2016, 18:25:04 »
Цитировать
Ты тупой. :)
Нет, Ланухумыч... это ты тупой, потому, что не врубаешься в суть :)

Оффлайн LanuHum

  • Житель
Re: си плюс плюс
« Ответ #37 : 01 Ноябрь 2016, 18:32:38 »
Цитировать
Ты тупой. :)
Нет, Ланухумыч... это ты тупой, потому, что не врубаешься в суть :)
Суть проста: мне нужна программа, и, я её напишу независимо от твоего мнения ;D
Программа будет работать корректно. :)

Оффлайн Samovar

  • Житель
Re: си плюс плюс
« Ответ #38 : 01 Ноябрь 2016, 18:37:14 »
Цитировать
Ты тупой. :)
Нет, Ланухумыч... это ты тупой, потому, что не врубаешься в суть :)
Суть проста: мне нужна программа, и, я её напишу независимо от твоего мнения ;D
Программа будет работать корректно. :)
да я буду рад этому :) но ещё раз тебе напишу: пока ты не  врубишься в машинный код и ассемблер во взаимосвязи с СИ++, твои проги будут работать, но иногда тупить и тормозить...

Оффлайн LanuHum

  • Житель
Re: си плюс плюс
« Ответ #39 : 01 Ноябрь 2016, 18:52:43 »
да я буду рад этому :) но ещё раз тебе напишу: пока ты не  врубишься в машинный код и ассемблер во взаимосвязи с СИ++, твои проги будут работать, но иногда тупить и тормозить...
Точно тупой ты. :) А, ты не скажешь, сколько мне будет лет, когда я с успехом закончу освоение машинного кода и ассемблера?
Да, социалистическая идеология у тебя в генах, и, ты не догоняешь, как можно вразрез с политикой парии и правительства что-то делать...
Тот у тебя картинки не по твоему рисует, этот программирует не по твоему. Но, есть мнения, отличные от твоих, и, эти мнения есть у матёрых программистов, обучающих людей тем манерам, которые приемлемы здесь и сейчас. Не знаю я, почему у тебя ни DOS, и, почему ты сообщение мне пишешь ни на ассемблере, хотя и хорошо с ним знаком.

Оффлайн Samovar

  • Житель
Re: си плюс плюс
« Ответ #40 : 01 Ноябрь 2016, 18:58:12 »

Цитировать
Точно тупой ты. :) А, ты не скажешь, сколько мне будет лет, когда я с успехом закончу освоение машинного кода и ассемблера?
LanuHum, ты извини, но ты дурень великовозрастный... этому в конце 80-х и начале 90-х школьников в средней школе учили... ты книжки открой, врубись  что такое бит, байт, слово, двойное слово... мантисса и порядок...

Оффлайн LanuHum

  • Житель
Re: си плюс плюс
« Ответ #41 : 01 Ноябрь 2016, 19:21:53 »

Цитировать
Точно тупой ты. :) А, ты не скажешь, сколько мне будет лет, когда я с успехом закончу освоение машинного кода и ассемблера?
LanuHum, ты извини, но ты дурень великовозрастный... этому в конце 80-х и начале 90-х школьников в средней школе учили... ты книжки открой, врубись  что такое бит, байт, слово, двойное слово... мантисса и порядок...

Хорошо, допустим, я выучил наизусть эту страницу:
https://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82
Эту:
https://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B9%D1%82
Как знание об этом поможет мне заставить рендерер брать данные не из файла, а из интерпретатора Python? Не будем забывать, что рендерер и интерпретатор уже написаны профессионалами. Объясняй, я ж тупой, но, хочу понять. Только не нужно деклараций, доходчиво, по теме. Вообще, давай от печки. Я начну за тебя.
- Ланухумыч, ты хочешь заставить рендерер брать данные не из файла, а из интерпретатора Python? Без знания о логических состояниях в триггерах никак этого не достичь...
Продолжай. Я просто хочу понять: ты хочешь мне мозг вынести, или, действительно, знаешь, о чём звиздишь, или, тупо, пытаешься стебаться...
или не хочешь, чтобы я делал то, что делаю, так как когда-то мне про конкуренцию пел арию Лазаря...

Оффлайн Samovar

  • Житель
Re: си плюс плюс
« Ответ #42 : 01 Ноябрь 2016, 19:27:15 »
Цитировать
Продолжай. Я просто хочу понять: ты хочешь мне мозг вынести, или, действительно, знаешь, о чём звиздишь, или, тупо, пытаешься стебаться...
Если честно, то и то, и другое:)  если действительно хочешь разобраться, то у парней , которые тебе советы пишут спроси, они в курсе :) ...

Оффлайн LanuHum

  • Житель
Re: си плюс плюс
« Ответ #43 : 01 Ноябрь 2016, 19:41:06 »
Цитировать
Продолжай. Я просто хочу понять: ты хочешь мне мозг вынести, или, действительно, знаешь, о чём звиздишь, или, тупо, пытаешься стебаться...
Если честно, то и то, и другое:)  если действительно хочешь разобраться, то у парней , которые тебе советы пишут спроси, они в курсе :) ...
Действительно, я хочу, чтоб мне помогали, когда я спрашиваю...ну, или хотя бы молчали, если нет желания помочь. :)
Никто из тех программистов, кто мне советы пишет, не советует мне начинать с изучения ассемблера. Просто, есть программисты, которые мне совсем ничем не обязаны. К таким я обращаюсь в самом крайнем случае по электронной почте. Здесь мне тоже никто ничем не обязан, но, здесь мои вопросы не противоречат идеям форума.

Оффлайн Samovar

  • Житель
Re: си плюс плюс
« Ответ #44 : 01 Ноябрь 2016, 19:43:38 »
ладно... давай так...
Чем является "указатель" в языке Си?


 


Яметрика

* По форуму

* Рекламный блок

* Последние вложения

1 (1).png
Скачано: 67
Автор: LEXA ANЭGROWND
blender.png
Скачано: 77
Автор: ipv2007
4.png
Скачано: 99
Автор: hiroyukiss
2.png
Скачано: 121
Автор: hiroyukiss

Скачано: 111
Автор: Dilifa12