package org.solovyev.android.views.dragbutton; import android.graphics.PointF; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.View; public final class Drag { private Drag() { } public static float distance(@NonNull PointF start, @NonNull PointF end) { return norm(end.x - start.x, end.y - start.y); } @NonNull public static PointF subtract(@NonNull PointF p1, @NonNull PointF p2) { return new PointF(p1.x - p2.x, p1.y - p2.y); } public static boolean hasDirectionText(@NonNull View view, @NonNull DragDirection direction) { if (view instanceof DirectionDragView) { return ((DirectionDragView) view).getText(direction).hasValue(); } return false; } @NonNull public static PointF sum(@NonNull PointF p1, @NonNull PointF p2) { return new PointF(p1.x + p2.x, p1.y + p2.y); } public static float norm(@NonNull PointF point) { return norm(point.x, point.y); } private static float norm(float x, float y) { //noinspection SuspiciousNameCombination return (float) Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); } public static float getAngle(@NonNull PointF start, @NonNull PointF axisEnd, @NonNull PointF end, @Nullable boolean[] right) { final PointF axisVector = subtract(axisEnd, start); final PointF vector = subtract(end, start); double a_2 = Math.pow(distance(vector, axisVector), 2); double b = norm(vector); double b_2 = Math.pow(b, 2); double c = norm(axisVector); double c_2 = Math.pow(c, 2); if (right != null) { right[0] = axisVector.x * vector.y - axisVector.y * vector.x < 0; } return (float) Math.acos((-a_2 + b_2 + c_2) / (2 * b * c)); } }