forked from: forked from: flash on 2012-5-25
forked from forked from: flash on 2012-5-25 (diff: 37)
ドローラインに含まれるノードの数を節約する
ActionScript3 source code
/**
* Copyright tepe ( http://wonderfl.net/user/tepe )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/o1Ow
*/
// forked from tepe's forked from: flash on 2012-5-25
// forked from tepe's flash on 2012-5-25
package {
/*
ドローラインに含まれるノードの数を節約する
*/
import flash.display.Sprite;
import flash.geom.*;
import flash.events.*;
import flash.text.*;
public class FlashTest extends Sprite {
private var line:Array = new Array();
private var lineList:Array = new Array();
private var tf:TextField =new TextField();
private var g:Sprite = new Sprite();
public function FlashTest() {
// write as3 code here..
addChild(tf);
addChild(g);
addChild(tf2);
tf2.x=200;
tf.selectable=false;
tf2.selectable=false;
//ライン上から特徴点を探す
//タイトコーナー
//交差点
//端点
graphics.beginFill(0xffffff);
graphics.drawRect(0,0,466,466);
graphics.endFill();
stage.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
//tf.appendText("\n"+n3.toString());
}
//描画開始
private function onDown(e:MouseEvent):void{
tf.text="onDown";
//描画
stage.addEventListener(MouseEvent.MOUSE_MOVE,addNode);
//描画終了
stage.addEventListener(MouseEvent.MOUSE_UP,onUp);
}
private function onUp(e:MouseEvent):void{
stage.removeEventListener(MouseEvent.MOUSE_MOVE,addNode);
stage.removeEventListener(MouseEvent.MOUSE_UP,onUp);
lineList.push(line);
line = new Array();
}
//n1 元角度 n2先角度
private var tf2:TextField = new TextField();
private function subAngle(n1:Number,n2:Number,r:Boolean=false):Number{
var n3:Number;
var r1:Number;
if(r==false)r1=180;
else r1=Math.PI;
n3 = n1 - n2;
n3+=r1*2;
n3%=r1*2;
if(n3>r1)n3-=r1*2;
return -n3;
}
//ノード追加
private var prevPos:Point=new Point(0,0);
private function addNode(e:MouseEvent):void{
var pos:Point = new Point(mouseX,mouseY);
if(Point.distance(prevPos,pos)<20)return;
prevPos = pos;
line.push(pos);
tf.text=line.length.toString();
drawLine(0x000000);
//var nodeList:Array = aaa(line);
var line2:Array = wayline2(line);
tf.appendText("\n"+line2.length);
tf.appendText("\nlist:"+lineList.length);
g.graphics.lineStyle(0,0xff0000,0.2);
for(var i:int=0;i<line2.length;i++){
g.graphics.beginFill(0xff0000,0.2);
g.graphics.drawCircle(line2[i].x,line2[i].y,2);
g.graphics.endFill();
}
g.graphics.moveTo(line2[0].x,line2[0].y);
for(i=1;i<line2.length;i++){
g.graphics.lineTo(line2[i].x,line2[i].y);
}
}
private function drawLine(col:uint=0x000000,alpha:Number=1):void{
g.graphics.clear();
g.graphics.lineStyle(0,col,alpha);
var i:int;
//lineListを描画
for(i=0;i<lineList.length;i++){
var line2:Array = lineList[i];
g.graphics.moveTo(line2[0].x,line2[0].y);
for(var j:int=1;j<line2.length;j++){
g.graphics.lineTo(line2[j].x,line2[j].y);
}
}
g.graphics.moveTo(line[0].x,line[0].y);
for(i=1;i<line.length;i++){
g.graphics.lineTo(line[i].x,line[i].y);
}
}
//特徴点を探す
private function wayline2(line:Array):Array{
var a:Point;
var b:Point;
var v:Point;
var angle:Number=0;
var result:Array = new Array();
//タイトコーナーを探す
var n:Number=20;//閾値角度
var prev:Number = 0;
result.push(line[0]);
for(var i:int=1;i<line.length;i++){
a= new Point(line[i-1].x,line[i-1].y);
b= new Point(line[i].x,line[i].y);
v = a.subtract(b);
angle = Math.atan2(v.y,v.x) *180/ Math.PI;//角度
if(angle<0)angle+=360//Math.PI*2
var n3:Number = subAngle(prev,angle);
if (n < Math.abs(n3)) {
result.push(line[i-1]);
prev = angle;
}
}
result.push(line[line.length - 1]);
return result;
}
/*
特徴点
端点:線の最後
交差点:線が交差している点
角:ベクトルの向きが大きく変化する開始点
角をどのように抽出するか?
→ベクトルの向き×ラインの幅 ラインの幅を外れる位置を抽出する
*/
//特徴点を探す
private function aaa(line:Array):Array{
var a:Point;
var b:Point;
var v:Point;
var angle:Number=0;
var result:Array = new Array();
//タイトコーナーを探す
var n:Number=20;//閾値角度
var prev:Number=0;
for(var i:int=1;i<line.length;i++){
a= new Point(line[i-1].x,line[i-1].y);
b= new Point(line[i].x,line[i].y);
v = a.subtract(b);
angle = Math.atan2(v.y,v.x) *180/ Math.PI;//角度
if(angle<0)angle+=360//Math.PI*2
var n3:Number = subAngle(prev,angle);
if(n < Math.abs(n3)){
result.push(i-1);
prev = angle;
}
}
return result;
}
}
}