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