/************************************************************************* 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); }