亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vrmi.java

?? JavaGPS enables access to GPS devices from any Java application. Provides Java API, NMEA0183 parser,
?? JAVA
字號:
/***********************************************************************
 *  J a v a G P S - GPS access library and Java API                    *
 *  Copyright (C) 2001 Ulrich Walther                                  *
 *                                                                     *
 *  This program is free software; you can redistribute it and/or      *
 *  modify it under the terms of the GNU General Public License as     *
 *  published by the Free Software Foundation; either version 2 of     *
 *  the License, or (at your option) any later version.                *
 *                                                                     *
 *  This program 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   *
 *  General Public License for more details.                           *
 *                                                                     *
 *  You should have received a copy of the GNU General Public          *
 *  License along with this program; if not, write to the Free         *
 *  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,     *
 *  MA 02111-1307 USA                                                  *
 ***********************************************************************/
package org.iu.gps;

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;

//import org.eml.deepmap.objects.*;
//import com.objectspace.voyager.*;
//import com.objectspace.voyager.space.*;
//import org.eml.JAMFrame.*;

/**
 *  VRMI is the next higher layer above the GPSDriver and allows for different
 *  kinds of triggers: - periodic reporting - distance-based reporting -
 *  region-based reporting
 *
 *@author     U.Walther
 *@created    3. April 2002
 *@started    0.01 (Jun 3, 2000)
 *@version    0.91 (Feb 12, 2002)
 */

class VRMITriggerInfo {
	final static int PERIODIC = 1, DISTANCE = 2, REGION = 3;
	int type;
	int id;
	GPSInfo gpsInfo;
}

/**
 *  The VRMI class encapsulates all "higher" GPS funcionality. Mainly, VRMI
 *  deals with the various kinds of triggers: - time-based triggers (periodical
 *  reporting) - distance-based triggers - region-based triggers (if the user
 *  enters/exits a given polygonal area)
 *
 *@author     walther
 *@created    3. April 2002
 */
public class VRMI implements GPSListener, Runnable {
	protected static int triggerid = 1;
	protected GPSDriver gpsDriver = null;
	protected Vector triggers = null;
	protected boolean die = false;
	protected GPSInfo gpsInfo = null;
	protected Thread thread = null;
	protected boolean threadStop = false;

	/**
	 *  Main constructor
	 *
	 *@param  _gpsDriver     Parameter
	 *@exception  Exception  Exception
	 */
	public VRMI( GPSDriver _gpsDriver )
			 throws Exception
	{
		gpsDriver = _gpsDriver;

		// initialize triggers list
		triggers = new Vector();

		// attach ourselves to the GPS
		gpsDriver.addGPSListener( this );

		// wait for the first GPSInfo to arrive
/*		while ( gpsInfo == null )
		{
			try
			{
				Thread.sleep( 100 );
			}
			catch ( InterruptedException ie )
			{
			}
		}
*/

		// instead of waiting for the 1st update, we read out the
		// current GPSInfo from the driver
		gpsInfo = gpsDriver.getGPSInfo();

		// start timeout thread
		thread = new Thread( this );
		thread.start();
	}

	public void destroy()
	{
		gpsDriver.removeGPSListener( this );
		threadStop = true;
	}


	/**
	 *  Test if the given point is within a polygon. Beam intersection algorithm,
	 *  runtime is O(n) (n=edges). Works for simple polygons, even for polys with
	 *  holes IFF the hole is connected with a vertical edge (both y equal).
	 *
	 *@param  poly  The 2D-polygon to use.
	 *@param  p     The 2D-point to test for inclusion.
	 *@return       Returned Value
	 */
	public static boolean pointInPoly( double[][] poly, double[] p )
	{
		// 18 Dec 2000, U.Walther

		int n = poly.length;
		int i;
		int k;

		// bounding box check
		double max[] = new double[]{0.0, 0.0};

		// bounding box check
		double min[] = new double[]{1e99, 1e99};

		for ( i = 0; i < n; i++ )
		{
			for ( k = 0; k < 2; k++ )
			{
				if ( poly[i][k] > max[k] )
				{
					max[k] = poly[i][k];
				}
				else if ( poly[i][k] < min[k] )
				{
					min[k] = poly[i][k];
				}
			}
		}

		// point outside bounding box?
		if ( p[0] < min[0] || p[1] < min[1] || p[0] > max[0] || p[1] > max[1] )
		{
			return false;
		}

		// calculate # of intersections btw. poly edges & beam from p towards +x
		int count = 0;
		for ( i = 0; i < n; i++ )
		{
			k = ( i + 1 ) % n;
			double x1 = poly[i][0];
			double y1 = poly[i][1];
			double x2 = poly[k][0];
			double y2 = poly[k][1];
			if ( Math.min( y1, y2 ) > p[1] || Math.max( y1, y2 ) < p[1] )
			{
				continue;
			}

			double dx = x2 - x1;

			double dy = y2 - y1;

			// calculate x-coord of intersection
			// y1+t*dy == p[1]

			double t = ( p[1] - y1 ) / dy;
			double x = x1 + t * dx;

			// only count intersections on the right (> p[0])
			if ( x > p[0] )
			{
				count++;
			}
		}

		// p is inside poly if count is odd
		return ( count & 1 ) > 0;
	}


	/**
	 *  Return current GPS info as retrieved latest from GPS driver.
	 *
	 *@return    The currentGPSInfo value
	 */
	public GPSInfo getCurrentGPSInfo()
	{
		return gpsInfo;
	}


	/**
	 *  Adds a trigger that periodically reports the current location.
	 *
	 *@param  recv        The VRMICallback that receives the trigger.
	 *@param  persistant  Specifies if trigger is one-shot (false) or
	 *      persistant(true)
	 *@param  dt          Period of time in milliseconds.
	 *@return             Returns an integer that identifies the trigger.
	 */
	public int addPeriodicTrigger( VRMITriggerListener recv, boolean persistant,
			long dt )
	{
		TimeTriggerInfo tti = new TimeTriggerInfo();
		tti.persistant = persistant;
		tti.receiver = recv;
		tti.t = System.currentTimeMillis();
		tti.dt = dt;
		return addTrigger( tti );
	}


	/**
	 *  Adds a trigger that reports the new location if the current location
	 *  changes more than a given distance, or if the user did not move for longer
	 *  than a given period of time.
	 *
	 *@param  recv        The VRMICallback that receives the trigger.
	 *@param  persistant  Specifies if trigger is one-shot (false) or
	 *      persistant(true)
	 *@param  ds          Distance in meters.
	 *@param  dt          Period of time in milliseconds.
	 *@return             Returns an integer that identifies the trigger.
	 */
	public int addDistanceTrigger( VRMITriggerListener recv, boolean persistant,
			double ds, long dt )
	{
		TimeTriggerInfo tti = new TimeTriggerInfo();
		tti.persistant = persistant;
		tti.receiver = recv;
		tti.t = System.currentTimeMillis();
		tti.dt = dt;
		tti.distance = ds;
		tti.fromx = gpsInfo.X;
		tti.fromy = gpsInfo.Y;
		return addTrigger( tti );
	}


	/**
	 *  Adds a trigger that reports if the user enters or exits a given region.
	 *
	 *@param  recv        The VRMICallback that receives the trigger.
	 *@param  persistant  Specifies if trigger is one-shot (false) or
	 *      persistant(true)
	 *@param  region      2D-polygon that specifies the region.
	 *@param  enter       Specifies if entering the region should be reported.
	 *@param  exit        Specifies if exiting the region should be reported.
	 *@return             Returns an integer that identifies the trigger.
	 */
	public int addRegionTrigger( VRMITriggerListener recv, boolean persistant,
			double[][] region, boolean enter, boolean exit )
	{
		RegionTriggerInfo rti = new RegionTriggerInfo();
		rti.persistant = persistant;
		rti.receiver = recv;
		rti.region = region;
		rti.enter = enter;
		rti.exit = exit;
		rti.inside = pointInPoly( region, new double[]{gpsInfo.X, gpsInfo.Y} );
		return addTrigger( rti );
	}


	/**
	 *  Remove the trigger given in
	 *
	 *@param  id  Parameter
	 */
	public void removeTrigger( int id )
	{
		synchronized ( triggers )
		{
			for ( int i = 0; i < triggers.size(); i++ )
			{
				// look if we have a trigger with the given ID
				if ( ( ( TriggerInfo ) triggers.get( i ) ).id == id )
				{
					// yes, remove it.
					triggers.remove( i );
					return;
				}
			}
		}

		System.err.println( "Warn: trigger not in list" );
	}


	/**
	 *  GPS callback. Retrieves latest GPSInfo from GPS driver.
	 *
	 *@param  _gpsInfo  Parameter
	 */
	public void gpsEvent( GPSInfo _gpsInfo )
	{
		// update local copy of GPSInfo structure
		gpsInfo = _gpsInfo;
		// check pending triggers
		checkTriggers();
	}


	/**
	 *  In this thread, we call checkTriggers every second to be sure that time
	 *  triggers are send even if the GPS driver does not deliver events.
	 */
	public void run()
	{
		// In case the GPS drive does not deliver new GPS data (e.g.
		// if disconnected, or hardware failure), ensure that at least
		// every second the triggers are checked.
		for ( ; ;  )
		{
			if (threadStop==true)
				break;

			try
			{
				Thread.currentThread().sleep( 1000 );
			}
			catch ( InterruptedException iex )
			{
			}

			checkTriggers();
		}
	}


	/**
	 *  Method
	 */
	protected void finalize()
	{
		gpsDriver.removeGPSListener( this );
	}


	/**
	 *  Checks in list of triggers if a trigger has to be sent. Note: this method
	 *  uses the instance variable gpsInfo which has to be set to the current
	 *  gpsInfo from the GPS driver.
	 */
	protected void checkTriggers()
	{
		if ( triggers != null )
		{
			synchronized ( triggers )
			{
				long t = System.currentTimeMillis();

				for ( int i = 0; i < triggers.size(); i++ )
				{
					TriggerInfo _t = ( TriggerInfo ) triggers.get( i );
					if ( _t instanceof RegionTriggerInfo )
					{
						RegionTriggerInfo ti = ( RegionTriggerInfo ) _t;

						// check if we entered or left the region
						boolean insideNow = pointInPoly( ti.region,
								new double[]{gpsInfo.X, gpsInfo.Y} );
						if ( ti.inside != insideNow )
						{
							if ( ( insideNow && ti.enter ) || ( !insideNow && ti.exit ) )
							{
								ti.inside = insideNow;
								ti.trigger( gpsInfo );

								if ( !ti.persistant )
								{
									// one-shot trigger: remove from list
									removeTrigger( ti.id );
								}
							}
						}
					}
					else if ( _t instanceof TimeTriggerInfo )
					{
						TimeTriggerInfo ti = ( TimeTriggerInfo ) _t;

						double dx = ti.fromx - gpsInfo.X;

						double
								dy = ti.fromy - gpsInfo.Y;

						if ( ti.distance > 0.0 && dx * dx + dy * dy >= ti.distance * ti.distance )
						{
							ti.t = t;
							ti.fromx = gpsInfo.X;
							ti.fromy = gpsInfo.Y;
							ti.trigger( gpsInfo );

							if ( !ti.persistant )
							{
								// one-shot trigger: remove from list
								removeTrigger( ti.id );
							}
						}
						else
								if ( t - ti.t > ti.dt )
						{
							ti.t = t;
							ti.trigger( gpsInfo );

							if ( !ti.persistant )
							{
								// one-shot trigger: remove from list
								removeTrigger( ti.id );
							}
						}
					}
				}
			}
		}
	}


	/**
	 *  Private method to add a trigger to the triggers vector.
	 *
	 *@param  ti  The feature to be added to the Trigger attribute
	 *@return     Returned Value
	 */
	protected int addTrigger( TriggerInfo ti )
	{
		synchronized ( triggers )
		{
			ti.id = triggerid++;
			triggers.add( ti );
			return ti.id;
		}
	}


	void log( String msg )
	{
		System.out.println( msg );
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
综合久久国产九一剧情麻豆| 午夜免费欧美电影| 精品电影一区二区| 欧美激情一区二区三区蜜桃视频 | 久久久亚洲高清| 国产精品麻豆久久久| 久久99国产精品免费网站| 成人伦理片在线| 欧美另类高清zo欧美| 久久久亚洲精品一区二区三区 | 国产最新精品精品你懂的| 福利视频网站一区二区三区| 成人精品高清在线| 6080日韩午夜伦伦午夜伦| 国产精品美女久久久久高潮 | 欧美日韩精品一区二区天天拍小说| 日韩精品一区二区三区视频播放 | 97精品久久久午夜一区二区三区 | 欧美日本在线观看| 中文字幕中文字幕在线一区| 香蕉乱码成人久久天堂爱免费| 国产成人自拍网| 欧美疯狂做受xxxx富婆| 亚洲色图都市小说| 国产精品99久久久久久久vr | 色琪琪一区二区三区亚洲区| 久久麻豆一区二区| 国产乱国产乱300精品| 欧美精品一区二区不卡 | 国产福利精品一区| 国产亚洲精久久久久久| 精东粉嫩av免费一区二区三区| 日韩欧美在线观看一区二区三区| 美女在线观看视频一区二区| 日韩欧美一区二区视频| 国产在线播放一区三区四| 精品欧美乱码久久久久久 | 婷婷中文字幕综合| 欧美日韩中文精品| jvid福利写真一区二区三区| 欧美激情自拍偷拍| 99久久精品情趣| 亚洲九九爱视频| 欧美日韩国产精品自在自线| 午夜伦理一区二区| 日韩欧美中文一区二区| 国产九色sp调教91| 成人欧美一区二区三区黑人麻豆| 色婷婷av一区二区三区软件| 亚洲一线二线三线视频| 欧美日韩一级大片网址| 奇米一区二区三区av| 久久久久国产精品麻豆ai换脸 | 极品瑜伽女神91| 中文字幕免费不卡在线| 99精品久久久久久| 亚洲成a天堂v人片| 欧美精品一区男女天堂| 成人av高清在线| 视频一区在线播放| 国产日韩欧美亚洲| 欧美综合欧美视频| 国产自产高清不卡| 亚洲免费成人av| 日韩视频在线你懂得| 成人国产精品免费网站| 肉色丝袜一区二区| 欧美高清在线一区二区| 7777精品伊人久久久大香线蕉的 | 波多野结衣欧美| 午夜精品一区在线观看| 久久九九久久九九| 欧美日韩国产一级| 成人毛片视频在线观看| 日本不卡视频在线观看| 国产精品久久久久9999吃药| 欧美一区二区女人| 91麻豆.com| 久久精品国产精品亚洲精品| 亚洲欧美视频在线观看视频| 精品国产亚洲一区二区三区在线观看| 色伊人久久综合中文字幕| 精品一区二区在线免费观看| 亚洲一区二三区| 国产精品青草久久| 精品剧情v国产在线观看在线| 色激情天天射综合网| 国产激情91久久精品导航| 日韩电影在线观看一区| 亚洲激情校园春色| 中文字幕人成不卡一区| 久久久久国产免费免费| 欧美日韩成人综合| 欧美视频在线一区| 色婷婷久久综合| proumb性欧美在线观看| 日产欧产美韩系列久久99| 欧美精品一区二区三区高清aⅴ | 久久精品人人爽人人爽| 91蝌蚪国产九色| 99久久精品国产一区二区三区| 国产精品99精品久久免费| 国产高清不卡一区| 国产区在线观看成人精品| 国产欧美1区2区3区| 五月激情综合网| 日韩毛片高清在线播放| 久久久影院官网| 欧美tickling挠脚心丨vk| 欧美日韩亚洲高清一区二区| 99久久综合99久久综合网站| 国产精品一区二区在线看| 久久精品国产99国产精品| 免费观看一级欧美片| 日一区二区三区| 日韩和的一区二区| 免费在线观看一区| 蜜桃av噜噜一区| 久久精品国产第一区二区三区| 久久99国产精品久久99 | 精品欧美一区二区在线观看 | 最新日韩av在线| 国产精品久久久久桃色tv| 国产视频一区二区在线观看| 欧美精品一区视频| 久久免费的精品国产v∧| 国产欧美一区二区三区鸳鸯浴| 久久伊99综合婷婷久久伊| 久久久久国产一区二区三区四区| 国产亚洲精久久久久久| 国产精品久久久久天堂| 亚洲精品免费播放| 亚洲bt欧美bt精品| 另类中文字幕网| 成人免费视频一区| 色一情一伦一子一伦一区| 欧美军同video69gay| 欧美mv和日韩mv的网站| 国产亚洲欧美日韩俺去了| 亚洲欧美色图小说| 日产国产欧美视频一区精品| 国产伦精品一区二区三区视频青涩| 高潮精品一区videoshd| 欧美亚洲综合网| 精品理论电影在线| 亚洲欧美乱综合| 免费人成在线不卡| 99久久er热在这里只有精品15| 欧美日韩综合一区| 国产午夜精品福利| 亚洲最大的成人av| 国产在线视频精品一区| 91在线视频观看| 日韩久久精品一区| 自拍偷拍国产精品| 久久国产尿小便嘘嘘| 99精品视频一区二区三区| 69堂亚洲精品首页| 最新欧美精品一区二区三区| 毛片一区二区三区| 色综合久久综合| 久久综合久久久久88| 亚洲成年人影院| av中文字幕一区| 日韩欧美www| 一区二区三区欧美在线观看| 国产精品自在在线| 久久众筹精品私拍模特| 亚洲色图.com| 国产精品99久久久久久久女警 | 色婷婷av一区二区三区大白胸| 精品日韩99亚洲| 日韩精品91亚洲二区在线观看| 成人av手机在线观看| 精品国产乱码久久久久久图片| 亚洲一区二区欧美激情| 成人av资源在线观看| 欧美www视频| 日本成人在线一区| 欧美日韩一区二区三区视频| 亚洲欧洲99久久| 成人激情小说网站| 久久欧美一区二区| 另类综合日韩欧美亚洲| 欧美精品三级在线观看| 一区二区三区四区亚洲| 97se亚洲国产综合在线| 国产精品伦理在线| 国产精品一区二区黑丝| 精品久久人人做人人爱| 视频在线在亚洲| 欧美一区二区三区四区五区| 午夜精品久久久久久久久久| 91搞黄在线观看| 亚洲一区自拍偷拍| 91福利视频在线| 亚洲电影一区二区| 69堂精品视频| 日本不卡视频在线| 欧美刺激午夜性久久久久久久|