/******************************************************************************* * Copyright (c) 2011, Daniel Murphy * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 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. * * Neither the name of the <organization> nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 DANIEL MURPHY 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. ******************************************************************************/ package org.jbox2d.structs.collision.distance; import org.jbox2d.collision.shapes.CircleShape; import org.jbox2d.collision.shapes.PolygonShape; import org.jbox2d.collision.shapes.Shape; import org.jbox2d.common.Settings; import org.jbox2d.common.Vec2; /** * A distance proxy is used by the GJK algorithm. * It encapsulates any shape. * * @author daniel */ public class DistanceProxy { public final Vec2[] m_vertices; public int m_count; public float m_radius; public DistanceProxy(){ m_vertices = new Vec2[Settings.maxPolygonVertices]; for(int i=0; i<m_vertices.length; i++){ m_vertices[i] = new Vec2(); } m_count = 0; m_radius = 0f; } /** * Initialize the proxy using the given shape. The shape * must remain in scope while the proxy is in use. */ public final void set(final Shape shape){ switch(shape.getType()){ case CIRCLE: final CircleShape circle = (CircleShape) shape; m_vertices[0].set(circle.m_p); m_count = 1; m_radius = circle.m_radius; break; case POLYGON: final PolygonShape poly = (PolygonShape) shape; m_count = poly.m_vertexCount; m_radius = poly.m_radius; for(int i=0; i<m_count; i++){ m_vertices[i].set(poly.m_vertices[i]); } break; default: assert(false); } } /** * Get the supporting vertex index in the given direction. * @param d * @return */ public final int getSupport(final Vec2 d){ int bestIndex = 0; float bestValue = Vec2.dot(m_vertices[0], d); for( int i=1; i<m_count; i++){ float value = Vec2.dot(m_vertices[i], d); if(value > bestValue){ bestIndex = i; bestValue = value; } } return bestIndex; } /** * Get the supporting vertex in the given direction. * @param d * @return */ public final Vec2 getSupportVertex(final Vec2 d){ int bestIndex = 0; float bestValue = Vec2.dot(m_vertices[0], d); for( int i=1; i<m_count; i++){ float value = Vec2.dot(m_vertices[i], d); if(value > bestValue){ bestIndex = i; bestValue = value; } } return m_vertices[bestIndex]; } /** * Get the vertex count. * @return */ public final int getVertexCount(){ return m_count; } /** * Get a vertex by index. Used by b2Distance. * @param index * @return */ public final Vec2 getVertex(int index){ assert(0 <= index && index < m_count); return m_vertices[index]; } }