flash on 2012-9-4
♥0 |
Line 115 |
Modified 2012-09-04 09:58:42 |
MIT License
archived:2017-03-30 02:52:20
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/6WvL
*/
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 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;
//ライン上から特徴点を探す
//タイトコーナー
//交差点
//端点
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,function():void{
stage.removeEventListener(MouseEvent.MOUSE_MOVE,addNode);
});
}
//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();
//var nodeList:Array = aaa(line);
var line2:Array = wayline2(line);
tf.appendText("\n"+line2.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():void{
g.graphics.clear();
g.graphics.lineStyle(0x000000);
g.graphics.moveTo(line[0].x,line[0].y);
for(var i:int=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;
}
}
}