Android Open Source - nadia Collision Polygon






From Project

Back to project page nadia.

License

The source code is released under:

GNU Lesser General Public License

If you think the Android project nadia listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * CollisionPolygon.java//  ww  w  .  jav  a2s  .  c o  m
 * 
 * Copyright (c) 2013, Emmanuel Arana Corzo. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301  USA
 */

package com.redarctic.nadia.collision;

import java.util.ArrayList;

import android.graphics.Point;

public class CollisionPolygon {
  private ArrayList<Point> lVertex;
  
  public enum PolygonType {
    NOT_HANDLED,
    CONVEX,
    CONCAVE
  }
  
  public CollisionPolygon() {
    this.lVertex = new ArrayList<Point>();
  }
  
  public CollisionPolygon(ArrayList<Point> lVertex) throws NullPointerException, ConvexPolygonException {
    if (lVertex != null) {
      if ( PolygonType.CONVEX == CollisionPolygon.isConvex(lVertex) ) {
        this.lVertex = lVertex;
      }
      else {
        throw new ConvexPolygonException("A concave vertex cannot be added in a collisionable polygon");
      }
    }
    else {
      this.lVertex = new ArrayList<Point>();
      
      throw new NullPointerException();
    }
  }
  
  public void append(Point oPt) throws ConvexPolygonException {
    if (this.lVertex == null) {
      this.lVertex = new ArrayList<Point>();
    }
    
    if (this.lVertex.size() < 3) {
      this.lVertex.add(oPt);
    }
    else {
      ArrayList<Point> lCopyVertex = new ArrayList<Point>();
      lCopyVertex.addAll(lVertex);
      lCopyVertex.add(oPt);
      
      if ( PolygonType.CONVEX == CollisionPolygon.isConvex(lCopyVertex) ) {
        lVertex.add(oPt);
        lCopyVertex.clear();
        lCopyVertex = null;
      }
      else {
        throw new ConvexPolygonException("A concave vertex cannot be added in a collisionable polygon");
      }
    }
  }
  
  public int getNumberVertex() {
    return this.lVertex.size();
  }
  
  public boolean isPolygon() {
    return this.lVertex.size() > 2;
  }
  
  public Point getVertex(int n) throws NullPointerException {
    Point p = new Point();
    
    if (n < this.lVertex.size()) {
      if (this.lVertex.get(n) != null) {
        p.x = this.lVertex.get(n).x;
        p.y = this.lVertex.get(n).y;
      }
      else {
        throw new NullPointerException();
      }
    }
    
    return p;
  }
  
  public static PolygonType isConvex(ArrayList<Point> lVertex) {
    int i, j, k;
    int flag = 0;
    double z;
    int n = lVertex.size();
    
    if (n < 3) {
      return PolygonType.NOT_HANDLED;
    }    
    
    for (i = 0; i < n; i++) {
      j = (i + 1) % n;
      k = (i + 2) % n;
      z = (lVertex.get(j).x - lVertex.get(i).x) * (lVertex.get(k).y - lVertex.get(j).y);
      z -= (lVertex.get(j).y - lVertex.get(i).y) * (lVertex.get(k).x -lVertex.get(j).x);
      
      if (z < 0)
        flag |= 1;
      else if (z > 0)
        flag |= 2;
      if (flag == 3)
        return PolygonType.CONCAVE;
    }
    
    if (flag != 0)
      return PolygonType.CONVEX;
    else
      return PolygonType.NOT_HANDLED;
  }
  
  public static int zCrossProduct(Point p1, Point p2, Point p3) 
  throws NullPointerException {
    int iZCrossProduct = 0;
    
    if (p1 != null && p2 != null && p3 != null) {
      int idx1 = p2.x - p1.x;
      int idy1 = p2.y - p2.y;
      int idx2 = p3.x - p2.x;
      int idy2 = p3.y - p2.y;
      
      iZCrossProduct = idx1 * idy2 - idy1 * idx2;
    }
    else {
      throw new NullPointerException("The 3 points must be set different of null");
    }
    
    return iZCrossProduct;
  } 
}




Java Source Code List

com.ashokgelal.samaya.DateTimeFormatter.java
com.ashokgelal.samaya.DateTimeInterval.java
com.ashokgelal.samaya.DateTimeParser.java
com.ashokgelal.samaya.DateTime.java
com.ashokgelal.samaya.ModelUtil.java
com.ashokgelal.samaya.Samaya.java
com.ashokgelal.samaya.TimeSpan.java
com.ashokgelal.samaya.ToStringUtil.java
com.ashokgelal.samaya.Util.java
com.redarctic.nadia.baseengine.BaseGameState.java
com.redarctic.nadia.baseengine.ColorPallete.java
com.redarctic.nadia.baseengine.DrawableGameComponent.java
com.redarctic.nadia.baseengine.DrawableObject.java
com.redarctic.nadia.baseengine.GameComponent.java
com.redarctic.nadia.baseengine.GameStateManager.java
com.redarctic.nadia.baseengine.GameState.java
com.redarctic.nadia.baseengine.GameSurfaceView.java
com.redarctic.nadia.baseengine.GameSurface.java
com.redarctic.nadia.baseengine.SpriteFont.java
com.redarctic.nadia.baseengine.Sprite.java
com.redarctic.nadia.baseengine.character.BaseModifier.java
com.redarctic.nadia.baseengine.character.Classes.java
com.redarctic.nadia.baseengine.character.FormulaModifierException.java
com.redarctic.nadia.baseengine.character.Player.java
com.redarctic.nadia.baseengine.item.ArmorLocation.java
com.redarctic.nadia.baseengine.item.Armor.java
com.redarctic.nadia.baseengine.item.BaseItem.java
com.redarctic.nadia.baseengine.item.ItemManager.java
com.redarctic.nadia.baseengine.item.ItemType.java
com.redarctic.nadia.baseengine.item.Shield.java
com.redarctic.nadia.baseengine.item.Weapon.java
com.redarctic.nadia.baseengine.item.WeaponsType.java
com.redarctic.nadia.baseengine.sprite.AnimatedSprite.java
com.redarctic.nadia.baseengine.sprite.AnimationException.java
com.redarctic.nadia.baseengine.sprite.AnimationKey.java
com.redarctic.nadia.baseengine.sprite.Animation.java
com.redarctic.nadia.baseengine.tileengine.Camera.java
com.redarctic.nadia.baseengine.tileengine.Engine.java
com.redarctic.nadia.baseengine.tileengine.MapLayer.java
com.redarctic.nadia.baseengine.tileengine.TileException.java
com.redarctic.nadia.baseengine.tileengine.TileMap.java
com.redarctic.nadia.baseengine.tileengine.Tile.java
com.redarctic.nadia.baseengine.tileengine.Tileset.java
com.redarctic.nadia.baseengine.world.Level.java
com.redarctic.nadia.baseengine.world.World.java
com.redarctic.nadia.collision.Circle.java
com.redarctic.nadia.collision.CollisionPolygon.java
com.redarctic.nadia.collision.ConvexPolygonException.java
com.redarctic.nadia.collision.Rectangle.java
com.redarctic.nadia.controls.ButtonPad.java
com.redarctic.nadia.controls.DirectionalPad.java
com.redarctic.nadia.controls.menu.CharacterDialog.java
com.redarctic.nadia.controls.menu.ControlBorder.java
com.redarctic.nadia.controls.menu.ControlManager.java
com.redarctic.nadia.controls.menu.Control.java
com.redarctic.nadia.controls.menu.Label.java
com.redarctic.nadia.controls.menu.LeftRightSelector.java
com.redarctic.nadia.controls.menu.LinkLabel.java
com.redarctic.nadia.controls.menu.Menu.java
com.redarctic.nadia.controls.menu.PictureBox.java
com.redarctic.nadia.controls.menu.SimpleConversation.java
com.redarctic.nadia.ext.MathHelper.java
com.redarctic.nadia.ext.StringHelper.java
com.redarctic.nadia.ext.simplesignalslot.ISignalProvider.java
com.redarctic.nadia.ext.simplesignalslot.ISlotProvider.java
com.redarctic.nadia.ext.simplesignalslot.PrimitiveWrapper.java
com.redarctic.nadia.ext.simplesignalslot.SignalSlotMap.java
com.redarctic.nadia.ext.simplesignalslot.SignalSlotPair.java
com.redarctic.nadia.ext.simplesignalslot.SlotProviderMethodPair.java