float f(Mat m, int n) { float z = -1.0f; for (float r = 0.0f; r < 0.8f; r += 0.02f) { Vec v = { 0.0f, r, 0.0f, 1.0f }; transformPosition(&v, m, v); z = opUnion(z, sphere(v, transformLength(m, 0.05f * (0.95f - r)))); } if (n > 0) { Mat ry, rz, s, t, m2, m3; rotateZ(&rz, 1.8f); for (int p = 0; p < 6; p++) { rotateY(&ry, p * (2 * PI / 6)); mul(&m2, ry, rz); float ss = 0.45f; for (float r = 0.2f; r < 0.8f; r += 0.1f) { scale(&s, ss); translate(&t, 0.0f, r, 0.0f); mul(&m3, s, m2); mul(&m3, t, m3); mul(&m3, m, m3); z = opUnion(z, f(m3, n - 1)); ss *= 0.8f; } } } return z; }
double ConstraintTypes::PlaylistLength::satisfaction( const Meta::TrackList& tl ) const { quint32 l = static_cast<quint32>( tl.size() ); if ( m_comparison == CompareNumEquals ) { if ( l > m_length ) return ( l == m_length ) ? 1.0 : transformLength( l - m_length ); else return ( l == m_length ) ? 1.0 : transformLength( m_length - l ); } else if ( m_comparison == CompareNumGreaterThan ) { return ( l > m_length ) ? 1.0 : transformLength( m_length - l ); } else if ( m_comparison == CompareNumLessThan ) { return ( l < m_length ) ? 1.0 : transformLength( l - m_length ); } else { return 0.0; } }