void GfRGB::GetHSV(float *h, float *s, float *v) const { const GfRGB &rgb = *this; float max = GfMax(rgb[0], GfMax(rgb[1], rgb[2])); float min = GfMin(rgb[0], GfMin(rgb[1], rgb[2])); float diff = max - min; // The value is the maximum component. *v = max; // Saturation *s = (max != 0.0 ? diff / max : 0.0); // Hue if (*s != 0.0) { if (rgb[0] == max) *h = (rgb[1] - rgb[2]) / diff; else if (rgb[1] == max) *h = 2.0 + (rgb[2] - rgb[0]) / diff; else *h = 4.0 + (rgb[0] - rgb[1]) / diff; if (*h < 0.0) *h += 6.0; *h /= 6.0; } else *h = 0.0; }
GfRange3f GfRange3f::GetOctant(size_t i) const { if (i > 7) { TF_CODING_ERROR("Invalid octant %zu > 7.", i); return GfRange3f(); } GfVec3f a = GetCorner(i); GfVec3f b = .5 * (_min + _max); return GfRange3f( GfVec3f(GfMin(a[0], b[0]), GfMin(a[1], b[1]), GfMin(a[2], b[2])), GfVec3f(GfMax(a[0], b[0]), GfMax(a[1], b[1]), GfMax(a[2], b[2]))); }
GfRange2d GfRange2d::GetQuadrant(size_t i) const { if (i > 3) { TF_CODING_ERROR("Invalid quadrant %zu > 3.", i); return GfRange2d(); } GfVec2d a = GetCorner(i); GfVec2d b = .5 * (_min + _max); return GfRange2d( GfVec2d(GfMin(a[0], b[0]), GfMin(a[1], b[1])), GfVec2d(GfMax(a[0], b[0]), GfMax(a[1], b[1]))); }