Удержание вектора уникального значения, установленного для выбора цвета с использованием C ++ и OpenGL

0

Я часть проекта, где я обрабатываю метод выбора для 3D-рендеринга трубопроводной системы. мое исследование предполагает, что выбор цвета будет лучшим методом (из-за количества труб, выбор луча может быть более сложным).

//define color for pipe
int lowc=0;
int highc=9;
float cB = (rand()%(highc-lowc+1)+lowc)/10.0;
float cG = (rand()%(highc-lowc+1)+lowc)/10.0;
float cR = (rand()%(highc-lowc+1)+lowc)/10.0;
//some way of confirming the complete color combination is unique.

 // Create and insert new pipe in a new branch..
 Pipe* new_p = new Pipe(new_n1, new_n2, d, wf,cB,cG,cR);
 ElementList* new_branch = new ElementList();
 new_branch->branch->Append(new_n1);
 new_branch->branch->Append(new_p);
 new_branch->branch->Append(new_n2); 

В настоящий момент я пытаюсь выяснить наиболее эффективный способ проверить, существует ли уже определенный цвет. Хранение вектора всех 1000 текущих комбинаций цветов кажется слишком трудоемким, как и привязка ко всем другим существующим значениям цветов узлов для каждого. Будет ли лучшее решение для хранения вектора существующих цветов (например, <0.2, 0.6, 0.4>, <0.8, 0.1, 0.1> и т.д.) И сравнения его с любыми другими существующими векторами?

Теги:
opengl
vector
colors
selection

2 ответа

0

Я могу привести пример для выбора треугольников объекта. Вы должны изменить этот пример на индексы индексов рендеринга вместо индексов лица.

PickingModeBegin(); // see below

glBegin(GL_TRIANGLES);
for (FaceIndex fi = 0; fi < GetFacesSize(); fi++) {
    const Face & face = faces[fi];
    glColor3ub((fi >> 16) & 255, (fi >> 8) & 255, (fi & 255)); // color coded index
    glVertex3fv(vertices[face.a].GetPointer());
    glVertex3fv(vertices[face.b].GetPointer());
    glVertex3fv(vertices[face.c].GetPointer());
}
glEnd();

PickingModeEnd(); // see below

glReadBuffer(GL_BACK);                          
GLint viewportInfo[4];
glGetIntegerv(GL_VIEWPORT, viewportInfo);             

GLubyte pixel[3];
// read the color
glReadPixels(mousePosX, viewportInfo[3] - mousePosY, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel);             

// extract face index
int selectedFaceIdx = (pixel[0] << 16) + (pixel[1] << 8) + pixel[2]; 



void PickingModeBegin(void) {
  glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
  glCullFace(GL_BACK);
  glEnable(GL_CULL_FACE);


  // turn off everything
  glDisable(GL_BLEND);
  glDisable(GL_DITHER);
  glDisable(GL_FOG);
  glDisable(GL_LIGHTING);
  glDisable(GL_TEXTURE_1D);
  glDisable(GL_TEXTURE_2D);
  glDisable(GL_TEXTURE_3D);
  glShadeModel(GL_FLAT);
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LESS);

  glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

}

void PickingModeEnd(void) {
  glPopAttrib();
}
  • 0
    Ваш код, кажется, больше сфокусирован на поиске цвета, уже назначенного лицу, хотя я все еще стремлюсь сначала создать этот цвет лица / трубы. Если я не читаю это где-то.
  • 0
    Концепция здесь заключается в том, чтобы визуализировать индексы некоторых объектов (граней, труб и т. Д.). Этот рендеринг никогда не отображается, а только читается в позиции мыши. Вы можете дать идентификационный номер каждому объекту (= трубка в вашем случае) и цветовой код этого значения.
0
struct ColourValue
{
    int red, blue, green;

    ColourValue() : red(0), blue(0), green(0) {}
    ColourValue(int red, int blue, int green) : red(red), blue(blue), green(green) {}

    bool operator < (const ColourValue& other) const
    {
        // magic trick to sort in set
        return pair<int, pair<int, int>>(this->red, pair<int, int>(this->blue, this->green))
        < pair<int, pair<int, int>>(other.red, pair<int, int>(other.blue, other.green));
    }
};

set<ColourValue> all_colours;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню