1a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard/* 2a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Copyright (C) 2012 The Android Open Source Project 3a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * 4a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Licensed under the Apache License, Version 2.0 (the "License"); 5a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * you may not use this file except in compliance with the License. 6a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * You may obtain a copy of the License at 7a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * 8a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * http://www.apache.org/licenses/LICENSE-2.0 9a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * 10a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Unless required by applicable law or agreed to in writing, software 11a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * distributed under the License is distributed on an "AS IS" BASIS, 12a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * See the License for the specific language governing permissions and 14a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * limitations under the License. 15a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard */ 16a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard 170f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunkpackage com.android.gallery3d.filtershow.imageshow; 180f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk 196a94446de01e8b6b034cc537ee3e65d507d47a47Ruben Brunkimport android.graphics.Rect; 20a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunkimport android.graphics.RectF; 21a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk 220f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunkpublic class GeometryMath { 23a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk 24a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk // Math operations for 2d vectors 25a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float clamp(float i, float low, float high) { 260f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk return Math.max(Math.min(i, high), low); 270f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk } 280f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk 290f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk protected static float[] shortestVectorFromPointToLine(float[] point, float[] l1, float[] l2) { 300f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float x1 = l1[0]; 310f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float x2 = l2[0]; 320f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float y1 = l1[1]; 330f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float y2 = l2[1]; 340f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float xdelt = x2 - x1; 350f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float ydelt = y2 - y1; 360f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk if (xdelt == 0 && ydelt == 0) 370f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk return null; 380f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float u = ((point[0] - x1) * xdelt + (point[1] - y1) * ydelt) 390f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk / (xdelt * xdelt + ydelt * ydelt); 400f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float[] ret = { 410f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk (x1 + u * (x2 - x1)), (y1 + u * (y2 - y1)) 420f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk }; 43a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk float [] vec = {ret[0] - point[0], ret[1] - point[1] }; 44a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk return vec; 450f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk } 460f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk 47a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk // A . B 48a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float dotProduct(float[] a, float[] b){ 490f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk return a[0] * b[0] + a[1] * b[1]; 500f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk } 510f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk 52a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float[] normalize(float[] a){ 530f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float length = (float) Math.sqrt(a[0] * a[0] + a[1] * a[1]); 540f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float[] b = { a[0] / length, a[1] / length }; 550f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk return b; 560f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk } 570f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk 58a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk // A onto B 59a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float scalarProjection(float[] a, float[] b){ 600f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float length = (float) Math.sqrt(b[0] * b[0] + b[1] * b[1]); 610f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk return dotProduct(a, b) / length; 620f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk } 630f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk 64a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float[] getVectorFromPoints(float [] point1, float [] point2){ 650f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float [] p = { point2[0] - point1[0], point2[1] - point1[1] }; 660f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk return p; 670f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk } 680f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk 69a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float[] getUnitVectorFromPoints(float [] point1, float [] point2){ 700f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float [] p = { point2[0] - point1[0], point2[1] - point1[1] }; 710f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float length = (float) Math.sqrt(p[0] * p[0] + p[1] * p[1]); 720f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk p[0] = p[0] / length; 730f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk p[1] = p[1] / length; 740f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk return p; 750f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk } 76a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk 77a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static RectF scaleRect(RectF r, float scale){ 78a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk return new RectF(r.left * scale, r.top * scale, r.right * scale, r.bottom * scale); 79a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk } 80a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk 81a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk // A - B 82a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float[] vectorSubtract(float [] a, float [] b){ 83a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk int len = a.length; 84a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk if (len != b.length) 85a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk return null; 86a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk float [] ret = new float[len]; 87a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk for (int i = 0; i < len; i++){ 88a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk ret[i] = a[i] - b[i]; 89a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk } 90a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk return ret; 91a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk } 92a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk 93a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float vectorLength(float [] a){ 94a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk return (float) Math.sqrt(a[0] * a[0] + a[1] * a[1]); 95a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk } 96a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk 97eb75699bcd5762a9ffd7ee0d4d14a4e5eb2e2389Ruben Brunk public static float scale(float oldWidth, float oldHeight, float newWidth, float newHeight) { 98eb75699bcd5762a9ffd7ee0d4d14a4e5eb2e2389Ruben Brunk if (oldHeight == 0 || oldWidth == 0) 99eb75699bcd5762a9ffd7ee0d4d14a4e5eb2e2389Ruben Brunk return 1; 100eb75699bcd5762a9ffd7ee0d4d14a4e5eb2e2389Ruben Brunk return Math.min(newWidth / oldWidth , newHeight / oldHeight); 101eb75699bcd5762a9ffd7ee0d4d14a4e5eb2e2389Ruben Brunk } 102eb75699bcd5762a9ffd7ee0d4d14a4e5eb2e2389Ruben Brunk 1036a94446de01e8b6b034cc537ee3e65d507d47a47Ruben Brunk public static Rect roundNearest(RectF r){ 1046a94446de01e8b6b034cc537ee3e65d507d47a47Ruben Brunk Rect q = new Rect(Math.round(r.left), Math.round(r.top), Math.round(r.right), 1056a94446de01e8b6b034cc537ee3e65d507d47a47Ruben Brunk Math.round(r.bottom)); 1066a94446de01e8b6b034cc537ee3e65d507d47a47Ruben Brunk return q; 1076a94446de01e8b6b034cc537ee3e65d507d47a47Ruben Brunk } 1086a94446de01e8b6b034cc537ee3e65d507d47a47Ruben Brunk 1090f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk} 110