GeometryMath.java revision eb75699bcd5762a9ffd7ee0d4d14a4e5eb2e2389
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 19a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunkimport android.graphics.RectF; 20a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk 210f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunkpublic class GeometryMath { 22a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk 23a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk // Math operations for 2d vectors 24a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float clamp(float i, float low, float high) { 250f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk return Math.max(Math.min(i, high), low); 260f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk } 270f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk 280f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk protected static float[] shortestVectorFromPointToLine(float[] point, float[] l1, float[] l2) { 290f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float x1 = l1[0]; 300f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float x2 = l2[0]; 310f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float y1 = l1[1]; 320f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float y2 = l2[1]; 330f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float xdelt = x2 - x1; 340f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float ydelt = y2 - y1; 350f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk if (xdelt == 0 && ydelt == 0) 360f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk return null; 370f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float u = ((point[0] - x1) * xdelt + (point[1] - y1) * ydelt) 380f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk / (xdelt * xdelt + ydelt * ydelt); 390f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float[] ret = { 400f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk (x1 + u * (x2 - x1)), (y1 + u * (y2 - y1)) 410f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk }; 42a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk float [] vec = {ret[0] - point[0], ret[1] - point[1] }; 43a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk return vec; 440f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk } 450f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk 46a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk // A . B 47a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float dotProduct(float[] a, float[] b){ 480f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk return a[0] * b[0] + a[1] * b[1]; 490f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk } 500f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk 51a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float[] normalize(float[] a){ 520f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float length = (float) Math.sqrt(a[0] * a[0] + a[1] * a[1]); 530f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float[] b = { a[0] / length, a[1] / length }; 540f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk return b; 550f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk } 560f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk 57a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk // A onto B 58a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float scalarProjection(float[] a, float[] b){ 590f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float length = (float) Math.sqrt(b[0] * b[0] + b[1] * b[1]); 600f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk return dotProduct(a, b) / length; 610f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk } 620f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk 63a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float[] getVectorFromPoints(float [] point1, float [] point2){ 640f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float [] p = { point2[0] - point1[0], point2[1] - point1[1] }; 650f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk return p; 660f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk } 670f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk 68a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float[] getUnitVectorFromPoints(float [] point1, float [] point2){ 690f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float [] p = { point2[0] - point1[0], point2[1] - point1[1] }; 700f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk float length = (float) Math.sqrt(p[0] * p[0] + p[1] * p[1]); 710f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk p[0] = p[0] / length; 720f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk p[1] = p[1] / length; 730f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk return p; 740f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk } 75a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk 76a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static RectF scaleRect(RectF r, float scale){ 77a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk return new RectF(r.left * scale, r.top * scale, r.right * scale, r.bottom * scale); 78a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk } 79a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk 80a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk // A - B 81a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float[] vectorSubtract(float [] a, float [] b){ 82a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk int len = a.length; 83a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk if (len != b.length) 84a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk return null; 85a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk float [] ret = new float[len]; 86a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk for (int i = 0; i < len; i++){ 87a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk ret[i] = a[i] - b[i]; 88a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk } 89a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk return ret; 90a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk } 91a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk 92a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk public static float vectorLength(float [] a){ 93a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk return (float) Math.sqrt(a[0] * a[0] + a[1] * a[1]); 94a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk } 95a41224997ef9be9c0d04534f7b6b9c6b933bfe05Ruben Brunk 96eb75699bcd5762a9ffd7ee0d4d14a4e5eb2e2389Ruben Brunk public static float scale(float oldWidth, float oldHeight, float newWidth, float newHeight) { 97eb75699bcd5762a9ffd7ee0d4d14a4e5eb2e2389Ruben Brunk if (oldHeight == 0 || oldWidth == 0) 98eb75699bcd5762a9ffd7ee0d4d14a4e5eb2e2389Ruben Brunk return 1; 99eb75699bcd5762a9ffd7ee0d4d14a4e5eb2e2389Ruben Brunk return Math.min(newWidth / oldWidth , newHeight / oldHeight); 100eb75699bcd5762a9ffd7ee0d4d14a4e5eb2e2389Ruben Brunk } 101eb75699bcd5762a9ffd7ee0d4d14a4e5eb2e2389Ruben Brunk 1020f7dc6ef6e736c0993240450b50b91721c79c43eRuben Brunk} 103