Exemple #1
0
/*************************************************************************
	Get a ColorRectangle from the specified Region
*************************************************************************/
ColorRect ColorRect::getSubRectangle( float left, float right, float top, float bottom ) const
{
    return ColorRect(
               getColorAtPoint(left, top),
               getColorAtPoint(right, top),
               getColorAtPoint(left, bottom),
               getColorAtPoint(right, bottom)
           );
}
void DrawStreamlinesImplementation::drawStreamline(
    Vec2D<float> point, float dir, const Grid<Vec2D<float>>& vector_field,
    const Grid<float>& scalar_field, float z) {
  Vec2D<float> gridpoint{point.x * (vector_field.x() - 1),
                         point.y * (vector_field.y() - 1)};

  vector<float> vertices;
  vector<float> colors;

  Vec2D<float> v1 = interpolate(vector_field, point);

  v1 *= dir;
  addVertices(vertices, colors, gridpoint, v1,
              getColorAtPoint(vector_field, scalar_field, point), z);

  Vec2D<float> last_point = gridpoint;

  bool early_exit = false;
  for (size_t i = 0; i < vector_field.x() * 3 && early_exit == false; i++) {
    Vec2D<float> v1 =
        interpolate(vector_field, {gridpoint.x / (vector_field.x() - 1),
                                   gridpoint.y / (vector_field.y() - 1)});
    v1 *= dir;

    // Calculate the predictor point and get the direction at that point.
    Vec2D<float> predictor = step(gridpoint, v1);
    Vec2D<float> v2 =
        interpolate(vector_field, {predictor.x / (vector_field.x() - 1),
                                   predictor.y / (vector_field.y() - 1)});

    v2 *= dir;

    v1 = (v1 + v2) / 2.0;
    if (v1.x * v1.x + v1.y * v1.y < 0.0000001) early_exit = true;

    gridpoint = step(gridpoint, v1);

    if (gridpoint.x < BORDER_PADDING) {
      gridpoint.x = BORDER_PADDING;
      early_exit = true;
    }
    if (gridpoint.x > vector_field.x() - BORDER_PADDING) {
      gridpoint.x = vector_field.x() - BORDER_PADDING;
      early_exit = true;
    }
    if (gridpoint.y < BORDER_PADDING ||
        gridpoint.y > vector_field.y() - BORDER_PADDING)
      early_exit = true;

    auto point = Vec2D<float>{gridpoint.x / (vector_field.x() - 1),
                              gridpoint.y / (vector_field.y() - 1)};

    v1 = interpolate(vector_field, point);
    v1 = v1.normalize();
    v1 *= dir;
    if (early_exit || (gridpoint - last_point).normalize() * v1 < 0.99999999) {
      addVertices(vertices, colors, gridpoint, v1,
                  getColorAtPoint(vector_field, scalar_field, point), z);
      last_point = gridpoint;
    }
  }

  glEnableClientState(GL_COLOR_ARRAY);
  glEnableClientState(GL_VERTEX_ARRAY);

  glVertexPointer(3, GL_FLOAT, 0, (float*)vertices.data());
  glColorPointer(4, GL_FLOAT, 0, (float*)colors.data());

  glDrawArrays(GL_TRIANGLE_STRIP, 0, vertices.size() / 3);

  glDisableClientState(GL_VERTEX_ARRAY);
  glDisableClientState(GL_COLOR_ARRAY);
}