Android Open Source - Gamework Multi Point Area






From Project

Back to project page Gamework.

License

The source code is released under:

Apache License

If you think the Android project Gamework 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

package cz.robyer.gamework.scenario.area;
/*w  ww  .j av  a 2 s. c o  m*/
import java.util.ArrayList;
import java.util.List;

import android.util.Log;

import cz.robyer.gamework.utils.GPoint;

/**
 * This represents polygonal game area based on 3 or more points.
 * @author Robert P?sel
 */
public class MultiPointArea extends Area {
  protected List<GPoint> points;
  protected double minLat;
  protected double maxLat;
  protected double minLon;
  protected double maxLon;

  /**
   * Class constructor.
   * @param id - identificator of area.
   */
  public MultiPointArea(String id) {
    super(id);
  }

  /**
   * Add point of Area.
   * There is no need to "close-circle" (add also "first point" as the end point again)
   * @param point
   */
  public void addPoint(GPoint point) {
    if (point == null)
      return;
    
    if (points == null)
      points = new ArrayList<GPoint>();
      
    points.add(point);
    calcBoundaries(point.latitude, point.longitude);
  }

  /**
   * Return list of all points of this area.
   * @return list of points or null, if no points.
   */
  public List<GPoint> getPoints() {
    return points;
  }

  /**
   * Calculate min/max latitude/longitude for new point for optimalization.
   * @param lat - latitude of newly added point
   * @param lon - longitude of newly added point
   */
  private void calcBoundaries(double lat, double lon) {
    if (minLat > lat) minLat = lat;    
    if (maxLat < lat) maxLat = lat;    
    if (minLon > lon) minLon = lon;    
    if (maxLon < lon) maxLon = lon;
  }
  
  /* (non-Javadoc)
   * @see cz.robyer.gamework.scenario.area.Area#isPointInArea(double, double)
   */
  @Override
  protected boolean isPointInArea(double lat, double lon) {
    if (points.size() < 3) {
      Log.e(TAG, "MultiPointArea must contain at least 3 points");
      return false;
    }
    
    // little optimalization - check min-max rectangle first  
    if (lat < minLat || lat > maxLat || lon < minLon || lon > maxLon)
      return false;
    
    boolean c = false;
    // algorithm from http://www.faqs.org/faqs/graphics/algorithms-faq/
    for (int i = 0, j = points.size()-1; i < points.size(); j = i++) {
      if ((((points.get(i).latitude <= lat) && (lat < points.get(j).latitude)) ||
        ((points.get(j).latitude <= lat) && (lat < points.get(i).latitude))) &&
        (lon < (points.get(j).longitude - points.get(i).longitude) * (lat - points.get(i).latitude) / (points.get(j).latitude - points.get(i).latitude) + points.get(i).longitude))
        c = !c;
    }
    
    // algorithm from http://en.wikipedia.org/wiki/Even-odd_rule
    /*for (int i = 0, j = points.size()-1; i < points.size(); j = i++) {
      if (((points.get(i).latitude > lat) != (points.get(j).latitude > lat)) &&
        (lon < (points.get(j).longitude - points.get(i).longitude) *
        (lat - points.get(i).latitude) / (points.get(j).latitude - points.get(i).latitude) + points.get(i).longitude))  
        c = !c;
    }*/
    
    return c;
  }

}




Java Source Code List

cz.robyer.gamework.app.activity.BaseActivity.java
cz.robyer.gamework.app.activity.BaseGameActivity.java
cz.robyer.gamework.app.activity.GameInventoryActivity.java
cz.robyer.gamework.app.activity.GameMapActivity.java
cz.robyer.gamework.app.activity.GameMessagesActivity.java
cz.robyer.gamework.app.activity.GameObjectivesActivity.java
cz.robyer.gamework.app.activity.GameToolsActivity.java
cz.robyer.gamework.app.activity.HelpActivity.java
cz.robyer.gamework.app.activity.MainActivity.java
cz.robyer.gamework.app.activity.MessageActivity.java
cz.robyer.gamework.app.game.GameService.java
cz.robyer.gamework.app.service.JavaScriptHandler.java
cz.robyer.gamework.app.service.MessageAdapter.java
cz.robyer.gamework.constants.Constants.java
cz.robyer.gamework.game.GameEventBroadcaster.java
cz.robyer.gamework.game.GameEventListener.java
cz.robyer.gamework.game.GameEvent.java
cz.robyer.gamework.game.GameHandler.java
cz.robyer.gamework.game.GameService.java
cz.robyer.gamework.game.GameStatus.java
cz.robyer.gamework.scenario.BaseObject.java
cz.robyer.gamework.scenario.HookableObject.java
cz.robyer.gamework.scenario.IdentificableObject.java
cz.robyer.gamework.scenario.ScenarioInfo.java
cz.robyer.gamework.scenario.Scenario.java
cz.robyer.gamework.scenario.area.Area.java
cz.robyer.gamework.scenario.area.MultiPointArea.java
cz.robyer.gamework.scenario.area.PointArea.java
cz.robyer.gamework.scenario.area.SoundArea.java
cz.robyer.gamework.scenario.helper.EventHookable.java
cz.robyer.gamework.scenario.helper.ScannerHookable.java
cz.robyer.gamework.scenario.helper.TimeHookable.java
cz.robyer.gamework.scenario.hook.Condition.java
cz.robyer.gamework.scenario.hook.Hook.java
cz.robyer.gamework.scenario.message.Message.java
cz.robyer.gamework.scenario.parser.XmlScenarioParser.java
cz.robyer.gamework.scenario.reaction.ActivityReaction.java
cz.robyer.gamework.scenario.reaction.EventReaction.java
cz.robyer.gamework.scenario.reaction.MessageReaction.java
cz.robyer.gamework.scenario.reaction.MultiReaction.java
cz.robyer.gamework.scenario.reaction.Reaction.java
cz.robyer.gamework.scenario.reaction.ReferenceReaction.java
cz.robyer.gamework.scenario.reaction.SoundReaction.java
cz.robyer.gamework.scenario.reaction.VariableReaction.java
cz.robyer.gamework.scenario.reaction.VibrateReaction.java
cz.robyer.gamework.scenario.variable.BooleanVariable.java
cz.robyer.gamework.scenario.variable.DecimalVariable.java
cz.robyer.gamework.scenario.variable.Variable.java
cz.robyer.gamework.utils.GPoint.java
cz.robyer.gamework.utils.Log.java
cz.robyer.gamework.utils.Utils.java