/******************************************************************************* * Copyright 2011 See AUTHORS file. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. ******************************************************************************/ package com.badlogic.gdx.physics.box2d; import com.badlogic.gdx.math.Vector2; /** * Encodes a Box2D transform. We are lazy so we only store a 4 float wide array. First two floats are the position of * the b2Transform struct. Next two floats are the cosine and sine of the rotation angle. * * @author mzechner */ public class Transform { public static final int POS_X = 0; public static final int POS_Y = 1; public static final int COS = 2; public static final int SIN = 3; public float[] vals = new float[4]; private Vector2 position = new Vector2(); public Transform() { } /** * Constructs a new Transform instance with the given position and angle * * @param position * the position * @param angle * the angle in radians */ public Transform(Vector2 position, float angle) { setPosition(position); setRotation(angle); } /** * Transforms the given vector by this transform * * @param v * the vector */ public Vector2 mul(Vector2 v) { float x = vals[POS_X] + vals[COS] * v.x + -vals[SIN] * v.y; float y = vals[POS_Y] + vals[SIN] * v.x + vals[COS] * v.y; v.x = x; v.y = y; return v; } /** @return the position, modification of the vector has no effect on the Transform */ public Vector2 getPosition() { return position.set(vals[0], vals[1]); } /** * Sets the rotation of this transform * * @param angle * angle in radians */ public void setRotation(float angle) { float c = (float) Math.cos(angle), s = (float) Math.sin(angle); vals[COS] = c; vals[SIN] = s; } public float getRotation() { return (float) Math.atan2(vals[SIN], vals[COS]); } /** * Sets the position of this transform * * @param pos * the position */ public void setPosition(Vector2 pos) { this.vals[POS_X] = pos.x; this.vals[POS_Y] = pos.y; } }