/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.monkeyrunner.adb; /** * Linear Interpolation class. */ public class LinearInterpolator { private final int steps; /** * Use our own Point class so we don't pull in java.awt.* just for this simple class. */ public static class Point { private final int x; private final int y; public Point(int x, int y) { this.x = x; this.y = y; } @Override public String toString() { return new StringBuilder(). append("("). append(x). append(","). append(y). append(")").toString(); } @Override public boolean equals(Object obj) { if (obj instanceof Point) { Point that = (Point) obj; return this.x == that.x && this.y == that.y; } return false; } @Override public int hashCode() { return 0x43125315 + x + y; } public int getX() { return x; } public int getY() { return y; } } /** * Callback interface to recieve interpolated points. */ public interface Callback { /** * Called once to inform of the start point. */ void start(Point point); /** * Called once to inform of the end point. */ void end(Point point); /** * Called at every step in-between start and end. */ void step(Point point); } /** * Create a new linear Interpolator. * * @param steps How many steps should be in a single run. This counts the intervals * in-between points, so the actual number of points generated will be steps + 1. */ public LinearInterpolator(int steps) { this.steps = steps; } // Copied from android.util.MathUtils since we couldn't link it in on the host. private static float lerp(float start, float stop, float amount) { return start + (stop - start) * amount; } /** * Calculate the interpolated points. * * @param start The starting point * @param end The ending point * @param callback the callback to call with each calculated points. */ public void interpolate(Point start, Point end, Callback callback) { int xDistance = Math.abs(end.getX() - start.getX()); int yDistance = Math.abs(end.getY() - start.getY()); float amount = (float) (1.0 / steps); callback.start(start); for (int i = 1; i < steps; i++) { float newX = lerp(start.getX(), end.getX(), amount * i); float newY = lerp(start.getY(), end.getY(), amount * i); callback.step(new Point(Math.round(newX), Math.round(newY))); } // Generate final point callback.end(end); } }