int minTotalDistance(vector<vector<int>>& grid) { int m = grid.size(); if (m == 0) { return 0; } int n =grid[0].size(); vector<int> rows; vector<int> cols; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (grid[i][j] == 1) { rows.push_back(i); } } } for (int j = 0; j < n; ++j) { for (int i = 0; i < m; ++i) { if (grid[i][j] == 1) { cols.push_back(j); } } } return totalDistance(rows) + totalDistance(cols); }
int totalDistance(RST* root){ int distance = root->pathLength; for(int i=0; i<root->indegree; i++){ distance += totalDistance(root->child[i]); } return distance; }
/* ================ idSplineList::initPosition ================ */ void idSplineList::initPosition(long bt, long totalTime) { if (dirty) { buildSpline(); } if (splinePoints.Num() == 0) { return; } baseTime = bt; time = totalTime; // calc distance to travel ( this will soon be broken into time segments ) splineTime.Clear(); splineTime.Append(bt); double dist = totalDistance(); double distSoFar = 0.0; idVec3 temp; int count = splinePoints.Num(); //for(int i = 2; i < count - 1; i++) { for(int i = 1; i < count; i++) { temp = *splinePoints[i-1]; temp -= *splinePoints[i]; distSoFar += temp.Length(); double percent = distSoFar / dist; percent *= totalTime; splineTime.Append(percent + bt); } assert(splineTime.Num() == splinePoints.Num()); activeSegment = 0; }
qreal suggestedRange(qreal t) const { Q_ASSERT( m_mode == Linear || m_mode == Jump); Q_ASSERT( 0 <= t && t <= 1.0 ); if (m_mode == Linear) { qreal in = m_source.range(); qreal out = m_target.range(); return in + t * (out-in); } else if (m_mode == Jump) { qreal jumpDuration = m_timeline.duration(); // Purely cinematic approach to calculate the jump path qreal g = qMin(m_source.range(), m_target.range()); // Min altitude qreal k = qMax(m_source.range(), m_target.range()); // Base altitude qreal d = t > 0.5 ? m_source.range() - g : m_target.range() - g; // Base difference qreal c = d * 2 * qAbs(t - 0.5); // Correction factor qreal h = qMin(1000*3000.0, totalDistance() / 2.0); // Jump height // Parameters for the parabolic function that has the maximum at // the point H ( 0.5 * m_jumpDuration, g + h ) qreal a = - h / ( (qreal)( 0.25 * jumpDuration * jumpDuration ) ); qreal b = 2.0 * h / (qreal)( 0.5 * jumpDuration ); qreal x = jumpDuration * t; qreal y = ( a * x + b ) * x + k - c; // Parabolic function return y; } else { qWarning("Unhandled FlyTo mode, no camera distance interpolation."); return m_target.range(); } }