<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DFdou&#039;s Blog &#187; Avoid</title>
	<atom:link href="http://nwhy.org/tag/avoid/feed" rel="self" type="application/rss+xml" />
	<link>http://nwhy.org</link>
	<description>Life is short,Be yourself.</description>
	<lastBuildDate>Wed, 25 Aug 2010 05:26:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>AS3-SteeredVehicle.avoid()回避行为分析</title>
		<link>http://nwhy.org/as3-steeredvehicle-avoid.html</link>
		<comments>http://nwhy.org/as3-steeredvehicle-avoid.html#comments</comments>
		<pubDate>Wed, 16 Sep 2009 14:09:14 +0000</pubDate>
		<dc:creator>DFdou</dc:creator>
				<category><![CDATA[AIR+FB+AS3]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[Avoid]]></category>

		<guid isPermaLink="false">http://nwhy.org/?p=4852</guid>
		<description><![CDATA[Demo: 今天的内容是回避行为avoid()，先引用书中的文字来说明下回避行为： 对象回避主题的完整意义是指，在机车行走的路线中存在一些障碍物，机车必须绕开、防止触碰到它们。听上去和碰撞... ]]></description>
			<content:encoded><![CDATA[<p>Demo:<br />
<object id="AvoidTest" width="600" height="400" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"><param value="sameDomain" name="allowScriptAccess"/><param value="http://nwhy.org/nwhy/exp/AvoidTest.swf" name="AvoidTest"/><param value="high" name="quality"/><embed width="600" height="400" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" allowscriptaccess="sameDomain" name="AvoidTest" bgcolor="#ffffff" quality="high" src="http://nwhy.org/nwhy/exp/AvoidTest.swf"/><br />
</object><br />
今天的内容是回避行为avoid()，先引用书中的文字来说明下回避行为：</p>
<blockquote><p>对象回避主题的完整意义是指，在机车行走的路线中存在一些障碍物，机车必须绕开、防止触碰到它们。听上去和碰撞检测有关，然而这仅仅是发生在预测阶段，也就是：“以我当前的速度行驶下去，可能就会撞到它了。”</p></blockquote>
<p>“回避行为”和“避开行为”、“躲避行为”都有所区别，“避开”和“躲避”都是针对单个目标的，而且机能方面“回避行为”更为复杂。<br />
<span id="more-4852"></span><br />
既然是“回避行为”，那么就需要障碍物咯，这里的障碍物是Circle对象。Circle.as如下：</p>
<pre class="brush: js">
package {
	import flash.display.Sprite;
	public class Circle extends Sprite {
		private var _radius:Number;
		private var _color:uint;
		public function Circle (radius:Number, color:uint = 0x000000) {
			_radius = radius;
			_color = color;
			graphics.lineStyle (0, _color);
			graphics.drawCircle (0, 0, _radius);
		}
		public function get radius ():Number {
			return _radius;
		}
		public function get position ():Vector2D {
			return new Vector2D(x, y);
		}
	}
}
</pre>
<p>很简单明了的一个类，有两个只读属性，半径和位置。由于是在向量环境中计算，所以位置返回一个2D向量。<br />
具体的算法比较复杂，其中预测碰撞的代码是基于David M.Bourg和Glenn Seemann所著的《游戏开发中的人工智能》。<br />
下边图示：<br />
<img src="http://nwhy.org/nwhy/exp/SteeredVehicle-avoid.gif" alt="SteeredVehicle-avoid" /><br />
回避的实现代码如下：</p>
<pre class="brush: js">
//回避行为
public function avoid (circles: Array):void {
	for (var i: int=0; i &lt; circles.length; i++) {
		var circle:Circle=circles[i] as Circle;
		var heading:Vector2D=_velocity.clone().normalize();
		// 障碍物和机车间的位移向量
		var difference:Vector2D=circle.position.subtract(_position);
		var dotProd:Number=difference.dotProd(heading);
		// 如果障碍物在机车前方
		if (dotProd&gt;0) {
			// 机车的“触角”
			var feeler:Vector2D=heading.multiply(_avoidDistance);
			// 位移在触角上的映射
			var projection:Vector2D=heading.multiply(dotProd);
			// 障碍物离触角的距离
			var dist:Number=projection.subtract(difference).length;
			// 如果触角（在算上缓冲后）和障碍物相交
			// 并且位移的映射的长度小于触角的长度
			// 我们就说碰撞将要发生，需改变转向
			if (dist &lt; circle.radius + _avoidBuffer &amp;&amp; projection.length &lt; feeler.length) {
				// 计算出一个转90度的力
				var force:Vector2D=heading.multiply(_maxSpeed);
				force.angle+=difference.sign(_velocity)*Math.PI/2;
				// 通过离障碍物的距离，调整力度大小，使之足够小但又能避开
				force=force.multiply(1.0-projection.length/feeler.length);
				// 叠加于转向力上
				_steeringForce=_steeringForce.add(force);
				// 刹车——转弯的时候要放慢机车速度，离障碍物越接近，刹车越狠。
				_velocity=_velocity.multiply(projection.length/feeler.length);
			}
		}
	}
}
</pre>
<h4  class="related_post_title">Some Random Posts</h4><ul class="related_post"><li>2008/10/29 -- <a  href="http://nwhy.org/php-code-create.html" title="PHP验证码生成和验证">PHP验证码生成和验证</a> (0)</li><li>2009/02/05 -- <a  href="http://nwhy.org/drupal-blogtoit.html" title="http://blog.to.it介绍">http://blog.to.it介绍</a> (0)</li><li>2009/01/09 -- <a  href="http://nwhy.org/wp-archives-output.html" title="Wordpress-日志存档输出为下拉选择框">Wordpress-日志存档输出为下拉选择框</a> (0)</li><li>2008/09/05 -- <a  href="http://nwhy.org/flash-safari-chinese-bug.html" title="Flash在Safari下无法输入中文">Flash在Safari下无法输入中文</a> (2)</li><li>2010/02/08 -- <a  href="http://nwhy.org/jquery-plupload.html" title="jQuery &#8211; Plupload 文件批量上传">jQuery &#8211; Plupload 文件批量上传</a> (0)</li><li>2009/01/15 -- <a  href="http://nwhy.org/flash-load-xml.html" title="Flash-AS2和AS3加载XML">Flash-AS2和AS3加载XML</a> (0)</li><li>2010/05/13 -- <a  href="http://nwhy.org/as3-lightout.html" title="AS3-LightOut">AS3-LightOut</a> (8)</li><li>2009/03/26 -- <a  href="http://nwhy.org/php-web-client-snoopy.html" title="PHP-Web Client Class Snoopy">PHP-Web Client Class Snoopy</a> (1)</li><li>2009/06/24 -- <a  href="http://nwhy.org/flash-ship-on-android-phone.html" title="Flash-Adobe&#8217;s Flash to ship on new Android phone">Flash-Adobe&#8217;s Flash to ship on new Android phone</a> (0)</li><li>2008/12/26 -- <a  href="http://nwhy.org/wp28-votes.html" title="WordPress2.8功能需求投票中">WordPress2.8功能需求投票中</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://nwhy.org/as3-steeredvehicle-avoid.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
