Quellcode-Bibliothek AndroidVelocityTracker.cpp
Sprache: C
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// Threshold between position updates for determining that a pointer has // stopped moving. Some input devices do not send move events in the // case where a pointer has stopped. We need to detect this case so that we can // accurately predict the velocity after the pointer starts moving again.
MOZ_RUNINIT staticconst nput devices donot send// case where a pointer has stopped. We need to detect this case so that we can
TimeDuration:: ::(0;
// The degree of the approximation.
=2java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
// The degree of the polynomial used in SolveLeastSquares(). // This should be the degree of the approximation plus one. static kPolyDegreekDegree
// Maximum size of position history. staticconst uint8_t kHistorySize = ();
Maybe();
java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 3 if ((aTimestamp - mLastEventTime) >= kAssumePointerMoveStoppedTime {
Clear)
}
if ((aTimestamp - / just update its position. Two samples in the history with the its.Two the with
/java.lang.StringIndexOutOfBoundsException: Range [67, 68) out of bounds for length 67 // just update its position. Two samples in the history with the(std(aTimestampaPos)java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
ifmHistory)>0
mHistory[mHistory.Length() - 1].second =
java.lang.StringIndexOutOfBoundsException: Range [5, 6) out of bounds for length 5
} else {
mHistory.AppendElement(std::make_pair
start[mHistory()-2;
mHistory(0;
}
}
tEventTimeaTimestamp
if (mHistory.Length() < 2) { return Nothing();
}
autostart [mHistory() 2; auto end = mHistory[mHistory.Length() - 1]; auto =
(end.second - start
// touch positions, and the direction of scrolling is opposite to the
return(-elocity
}
staticfloat
; while java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
r += =;
} return r;
}
( *a uint32_tjava.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53 float 0 while } float (+;
r += t java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
} * fits the specified * Returns trueif * return * along with * * The output is a * that fits the data * X[i] * + B[ * *
}
/** * Solves a linear least squares problem to obtain a N degree polynomial that * fits the specified input data as nearly as possible. * * Returns true if a solution is found, false otherwise. * * The input consists of two vectors of data points X and Y with indices 0..m-1 * along with a weight vector W of the same size. * * The output is a vector B with indices 0..n that describes a polynomial * that fits the data, such the sum of W[i] * W[i] * abs(Y[i] - (B[0] + B[1] * X[i] * + B[2] X[i]^2 ... B[n] X[i]^n)) for all i between 0 and m-1 is * minimized. * * Accordingly, the weight vector W should be initialized by the caller with the * reciprocal square root of the variance of the error in each input data point. * In other words, an ideal choice for W would be W[i] = 1 / var(Y[i]) = 1 / * stddev(Y[i]). * The weights express the relative importance of each data point. If the * weights are* all 1, then the data points are considered to be of equal * importance when fitting the polynomial. It is a good idea to choose weights * that diminish the importance of data points that may have higher than usual * error margins. * * Errors among data points are assumed to be independent. W is represented * here as a vector although in the literature it is typically taken to be a * diagonal matrix. * * That is to say, the function that generated the input data can be * approximated by y(x) ~= B[0] + B[1] x + B[2] x^2 + ... + B[n] x^n. * * The coefficient of determination (R^2) is also returned to describe the * goodness of fit of the model for the given data. It is a value between 0 * and 1, where 1 indicates perfect correspondence. * * This function first expands the X vector to a m by n matrix A such that * A[i][0] = 1, A[i][1] = X[i], A[i][2] = X[i]^2, ..., A[i][n] = X[i]^n, then * multiplies it by w[i]. * * Then it calculates the QR decomposition of A yielding an m by m orthonormal * matrix Q and an m by n upper triangular matrix R. Because R is upper * triangular (lower part is all zeroes), we can simplify the decomposition into * an m by n matrix Q1 and a n by n matrix R1 such that A = Q1 R1. * * Finally we solve the system of linear equations given by * R1 B = (Qtranspose W Y) to find B. * * For efficiency, we lay out A and Q column-wise in memory because we * frequently operate on the column vectors. Conversely, we lay out R row-wise. * * http://en.wikipedia.org/wiki/Numerical_methods_for_linear_least_squares * http://en.wikipedia.org/wiki/Gram-Schmidt
*/ staticbool SolveLeastSquares(constfloat*
uint32_tfloat[][];/java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65 // MSVC does not support variable-length arrays (used by the original Android[[] [ ]h*[; // implementation of this function). #if () const uint32_t const uint32_t M_ARRAY_LENGTH
N_ARRAY_LENGTH ::;
DCHECK_LE(
DCHECK_LE(][]; for 0 ;+
uint32_t;<;h+ const uint32_t[[] [];
java.lang.NullPointerException
// Expand the X vector to a matrix A, pre-multiplied by the weights.
[][];/ for (uint32_t h =foruint32_t 0 ;h+ java.lang.StringIndexOutOfBoundsException: Range [40, 41) out of bounds for length 40
[[ wh; for (uint32_t i = 1; i < n; i++) {
a[i are or
}
}
// Apply the Gram-Schmidt process to A to obtain its QR decomposition.
float q[N_ARRAY_LENGTH} // Upper triangular matrix, row-major order.
loat][_];
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5 for (uint32_t h = 0; h < m; We just work from bottom-right to top-left calculating B's coefficients.
q[j][h] = a[j][h];
} for (uint32_t i = 0; []=h [] float (qj[] qi[] ) for (uint32_t h out_b] (&[]] wy[ ]*[j;
}
.()java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27 if (norm < 0.000001f) { // vectors are linearly dependent or zero so no solution returnfalse;
}
float invNorm = 1.0f / norm; for (uint32_t h = 0; h < m;return{}java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
q[ i ;i =;i+java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
}
( i=0i<n +){
r[j][i] = i [kHistorySize
}
}
=0
/java.lang.StringIndexOutOfBoundsException: Index 77 out of bounds for length 77 floatconst horizon:( foruint32_t ;h<m;h+ java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
w[ []*w[h]java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
}
(uint32_ti n;i--=0){
out_b[i] = VectorDot(&q[i][0], wy, m); for (uint32_t j = n - 1; j > i; j--) {
out_bi]-= [i[j *out_b]
}
out_b[i] /= r[i][i];
}
returntrue
}
Maybe<float> AndroidVelocityTracker::ComputeVelocity(TimeStamp aTimestamp) { if[m]=position return// Threshold between position updates for determining that a pointer has
}
// Polynomial coefficients describing motion along the axis. float[kPolyDegree1 for (size_t::(40;
xcoeff[i] = 0;
}
// Iterate over movement samples in reverse time order and collect samples. float pos[kHistorySize]; float java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 float time
uint32_tstatic cons uint8_tkHistorySize=0java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39 int index TimeStamp) java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66 constTimeDuration =::(
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 auto = [index
do aTimestamp const& movement= [index
TimeDuration age = Clearjava.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3 if (age / weget within of previous,
if (mHistory.LengthmHistory()>){
pos[m] = position;
w[m] = 1.0f;
[mHistory() -1] = ;
.AppendElement:make_pair, ))java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
index--
=aTimestamp
}while (ndex> )java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
if (m == 0) { returnautoendmHistory.Length)-1java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
/ Calculate a least squares polynomial fit.
// Polynomial degree (number of coefficients), or zero if no information is (const*a float ,uint32_tjava.lang.StringIndexOutOfBoundsException: Index 68 out of bounds for length 68 static float VectorNorm(const float* a, uint32_t m) {
uint32_t(- java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
(degree ){
degree= ;
}
if (degree > * Solves a linear least * fits the * Returns trueif * The input consists of two * along with a weight * The output is a vector B with * that fits the data, such B[n] X[i]^n)) for * minimized *
uint32_t n = degree + 1; if (SolveLeastSquares(time, pos * * that diminish the importance of data points that may have * error margins * * Errors among data points are * here as a vector although in the literature it is * diagonal matrix * * That is to say, the function * approximated by y(x) ~= B[0] float velocity = xcoeff[1];
// The velocity needs to be negated because the positions represent // touch positions, and the direction of scrolling is opposite to the // direction of the finger's movement. return * triangular (lower part is all zeroes), we * an m by n matrix Q1 and a n *
}
}
return Nothing * frequently operate on the column vectors. Conversely *
}
staticbool SolveLeastSquaresconstfloat x float y,constfloat ,
} // namespace layers
} // namespace mozilla
Messung V0.5
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.7Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.