// computes the objective function of a direction double CsPCAGrid::CalcObj ( const double dCos, const double dSin // the direction to be examined , double &dScat // (output) the scatter of a matrix cbind (m_vSumLoadThis, m_vSumLoadOthers) projected onto a direction (dCos, dSin) , double &dScatOrth) // (output) the scatter of a matrix cbind (m_vSumLoadThis, m_vSumLoadOthers) projected onto a direction (dSin, dCos) // (-> maybe dSin and dCos are mixed up in this comment) { dScat = CalcProjScat (dCos, dSin) ; if (m_dwCheckOrth) // don't care about the experimental "m_dwCheckOrth" - option so far { // it's always off for sPCAgrid // CalcMaha (dScat) ; dScatOrth = CalcProjScat (-dSin, dCos) ; // CalcMaha (dScatOrth) ; return ngpf (dScat / dScatOrth) + GetPenalty (dCos, dSin); ; //// dCurObj /= ngpf (dScatOrth + dCurScat * 0.001) ; //// dCurObj /= (m_dGloScatter + ngpf (dScatOrth)) ; } return // the objective function's value: ngpf (dScat) // the scatter (or variance) of the data projected onto the current direction // ngpf(x) returns either x, or x^2, depending on the definition of GLOBAL_POWER // NOTE: GLOBAL_POWER is now deprecated, as a "q" and an "s" parameter are available in "GetPenalty", which do provide the same functionality + GetPenalty (dCos, dSin) // + the penalty function for the current direction * m_dGloScatter; // * some normalization factor for the overall variance of the data in the currently considered subspace }
CTextWrap::word CTextWrap::SplitWord(CTextWrap::word& w, float wantedWidth, bool smart) { // returns two pieces 'L'eft and 'R'ight of the split word (returns L, *wi becomes R) word w2; w2.pos = w.pos; const float spaceAdvance = GetGlyph(spaceUTF16).advance; if (w.isLineBreak) { // shouldn't happen w2 = w; w.isSpace = true; } else if (w.isSpace) { const int split = (int)std::floor(wantedWidth / spaceAdvance); w2.isSpace = true; w2.numSpaces = split; w2.width = spaceAdvance * w2.numSpaces; w.numSpaces -= split; w.width = spaceAdvance * w.numSpaces; w.pos += split; } else { if (smart) { if ( (wantedWidth < 8 * spaceAdvance) || (w.text.length() < 1) ) { w2.isSpace = true; return w2; } } float width = 0.0f; int i = 0; float min_penalty = 1e9; unsigned int goodbreak = 0; char32_t c = Utf8GetNextChar(w.text,i); const GlyphInfo* curGlyph = &GetGlyph(c); const GlyphInfo* nextGlyph = curGlyph; do { const int lastCharPos = i; const char32_t co = c; curGlyph = nextGlyph; c = Utf8GetNextChar(w.text,i); nextGlyph = &GetGlyph(c); width += GetKerning(*curGlyph, *nextGlyph); if (width > wantedWidth) { break; } if (smart) { const float penalty = GetPenalty(co, lastCharPos, w.text.length()); if (penalty < min_penalty) { min_penalty = penalty; goodbreak = lastCharPos; } } else { goodbreak = i; } } while(i < w.text.length()); w2.text = toustring(w.text.substr(0,goodbreak)); w2.width = GetTextWidth(w2.text); w.text.erase(0,goodbreak); w.width = GetTextWidth(w.text); w.pos += goodbreak; } return w2; }