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