Java examples for java.lang:Math Vector
Check if a vertex is in triangle using barycentric coordinates computation.
/**/*from ww w. j a v a 2 s . c om*/ * Copyright 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ //package com.java2s; public class Main { /** * Check if a vertex is in triangle using * barycentric coordinates computation. * @param a first triangle vertex * @param b second triangle vertex * @param c third triangle vertex * @param p the vertex in question * @return true if p is in triangle (a, b, c), false otherwise. */ public static boolean isInTriangleVec3(final float[] a, final float[] b, final float[] c, final float[] p, final float[] ac, final float[] ab, final float[] ap) { // Compute vectors subVec3(ac, c, a); //v0 subVec3(ab, b, a); //v1 subVec3(ap, p, a); //v2 // Compute dot products final float dotAC_AC = dotVec3(ac, ac); final float dotAC_AB = dotVec3(ac, ab); final float dotAB_AB = dotVec3(ab, ab); final float dotAC_AP = dotVec3(ac, ap); final float dotAB_AP = dotVec3(ab, ap); // Compute barycentric coordinates final float invDenom = 1 / (dotAC_AC * dotAB_AB - dotAC_AB * dotAC_AB); final float u = (dotAB_AB * dotAC_AP - dotAC_AB * dotAB_AP) * invDenom; final float v = (dotAC_AC * dotAB_AP - dotAC_AB * dotAC_AP) * invDenom; // Check if point is in triangle return (u >= 0) && (v >= 0) && (u + v < 1); } /** * Subtracts two vectors, result = v1 - v2 * @param result float[3] result vector, may be either v1 or v2 (in-place) * @param v1 vector 1 * @param v2 vector 2 * @return result vector for chaining */ public static float[] subVec3(final float[] result, final float[] v1, final float[] v2) { result[0] = v1[0] - v2[0]; result[1] = v1[1] - v2[1]; result[2] = v1[2] - v2[2]; return result; } /** * Return the dot product of two points * @param vec1 vector 1 * @param vec2 vector 2 * @return the dot product as float */ public static float dotVec3(final float[] vec1, final float[] vec2) { return vec1[0] * vec2[0] + vec1[1] * vec2[1] + vec1[2] * vec2[2]; } }