/**
* Copyright mutantleg ( http://wonderfl.net/user/mutantleg )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/ikjx
*/
package {
import flash.text.TextField;
import flash.events.Event;
import flash.display.Sprite;
public class FlashTest extends Sprite {
public function FlashTest() {
deb = new TextField(); deb.width=320;deb.height=240;deb.mouseEnabled=false; addChild(deb);
stage.quality = "LOW";
vecNode = new Vector.<xNode>(0,false);
var a:xNode; var b:xNode;
var i:int; var num:int;
var k:int; var e:int;
graphics.clear();
graphics.lineStyle(2, 0);
num = vecFace.length;
for (i=0;i<num;i+=3)
{
a = new xNode(); vecNode.push(a);
k = vecFace[i]*3; a.x0 = vecVert[ k ]; a.y0 = vecVert[k+2];
k = vecFace[i+1]*3; a.x1 = vecVert[ k ]; a.y1 = vecVert[k+2];
k = vecFace[i+2]*3; a.x2 = vecVert[ k ]; a.y2 = vecVert[k+2];
a.cx = (a.x0+a.x1+a.x2)/3;
a.cy = (a.y0+a.y1+a.y2)/3;
a.v0 = vecFace[i]; a.v1 = vecFace[i+1]; a.v2 = vecFace[i+2];
graphics.drawCircle(a.cx,a.cy, 4);
graphics.moveTo(a.x0, a.y0);
graphics.lineTo(a.x1, a.y1);
graphics.lineTo(a.x2, a.y2);
graphics.lineTo(a.x0, a.y0);
}//nexti
graphics.lineStyle(2, 0);
num = vecNode.length;
for (i=0; i <num; i+=1)
{
a = vecNode[i];
for (k=i+1;k<num;k+=1)
{
b = vecNode[k];
e = 0;
if (a.v0 == b.v0 || a.v0 == b.v1 || a.v0 == b.v2) { e+=1; }
if (a.v1 == b.v0 || a.v1 == b.v1 || a.v1 == b.v2) { e+=1; }
if (a.v2 == b.v0 || a.v2 == b.v1 || a.v2 == b.v2) { e+=1; }
if (e != 2) { continue; }
a.vecNext.push(b);
b.vecNext.push(a);
graphics.moveTo(a.cx,a.cy);
graphics.lineTo(b.cx,b.cy);
}//nextk
}//nexti
genGroup(vecNode);
vecCol = new Vector.<uint>(0,false);
for (i=0;i<256;i++) { vecCol[i] = 0xFFffFFff*Math.random(); }
stage.addEventListener(Event.ENTER_FRAME, onEnter);
}//ctor
public var deb:TextField;
public function onEnter(e:Event):void
{
var mx:Number; var my:Number;
mx = stage.mouseX; my = stage.mouseY;
graphics.clear();
graphics.lineStyle(2, 0);
var num:int; var i:int; var a:xNode;
num = vecNode.length;
for (i=0; i <num; i+=1)
{
a = vecNode[i];
if (a.group < 0) { continue; }
graphics.beginFill(vecCol[a.group], 1);
graphics.moveTo(a.x0, a.y0);
graphics.lineTo(a.x1, a.y1);
graphics.lineTo(a.x2, a.y2);
graphics.lineTo(a.x0, a.y0);
graphics.endFill();
graphics.drawCircle(a.cx,a.cy, 4);
}//nexti
graphics.lineStyle(4,0);
a = getNode(mx, my, vecNode);
if (a != null)
{
graphics.beginFill(0xff, 0.5);
graphics.moveTo(a.x0, a.y0);
graphics.lineTo(a.x1, a.y1);
graphics.lineTo(a.x2, a.y2);
graphics.lineTo(a.x0, a.y0);
graphics.endFill();
}//endif
deb.text = ""+a;
}//onenter
public var vecNode:Vector.<xNode>;
public var vecCol:Vector.<uint>;
public function genGroup(vec:Vector.<xNode>):void
{
var group:int; var it:int; var num:int;
var temp:Vector.<xNode>;
var i:int; var a:xNode; var b:xNode;
var k:int; var numk:int;
var vn:Vector.<xNode>;
group = 1;
num = vec.length;
temp = new Vector.<xNode>(num*2,false);
for (i =0; i<num;i++)
{
a = vec[i];
if (a.group > 0) { continue; }
group += 1;
temp[0] = a;
it = 1;
while (it > 0)
{
a = temp[it - 1];
it -= 1;
a.group = group;
vn = a.vecNext;
numk = vn.length;
for (k=0;k<numk;k+=1)
{
b = vn[k];
if (b.group > 0) { continue; }
temp[it] = b; it += 1;
}//nextk
}//wend
}//nexti
}//gengroup
public function getNode(ax:Number, ay:Number, vec:Vector.<xNode>):xNode
{
var i:int; var num:int; var a:xNode; num = vec.length;
for (i=0;i<num;i+=1) { a = vec[i]; if (isOverNode(ax,ay, a)) { return a; } }
return null;
}//getnode
public function isOverNode(px:Number, py:Number, a:xNode):Boolean
{
var w:int; var wz:Number;
var ax:Number; var ay:Number;
var bx:Number; var by:Number;
w = 0;
if (((py < a.y0 && py < a.y1) || (py >a.y0 && py >a.y1)) == false)
{ ax = px - a.x0; ay = py - a.y0; bx = a.x0 - a.x1; by = a.y0 - a.y1;
wz = (ax*by)-(ay*bx); if (wz != 0) {w += wz > 0 ? 1 : -1; } }
if (((py < a.y1 && py < a.y2) || (py >a.y1 && py >a.y2)) == false)
{ ax = px - a.x1; ay = py - a.y1; bx = a.x1 - a.x2; by = a.y1 - a.y2;
wz = (ax*by)-(ay*bx); if (wz != 0) { w += wz > 0 ? 1 : -1; } }
if (((py < a.y0 && py < a.y2) || (py >a.y0 && py >a.y2)) == false)
{ ax = px - a.x2; ay = py - a.y2; bx = a.x2 - a.x0; by = a.y2 - a.y0;
wz = (ax*by)-(ay*bx); if (wz != 0) { w += wz > 0 ? 1 : -1; } }
return w < 0;
}//isover
public static var vecFace:Vector.<int> = Vector.<int>([0,1,2,1,3,4,4,2,1,3,5,6,6,4,3,5,
7,8,8,6,5,8,7,9,7,10,9,4,6,11,11,12,4,13,12,14,14,15,13,12,11,16,16,14,12,11,17,18,
18,16,11,18,17,19,20,15,21,15,14,22,22,21,15,16,18,23,23,24,16,19,25,26,23,26,27,27,28,23,29,30,
31,31,32,29,30,33,31,34,28,35,28,27,36,36,35,28]);
public static var vecVert:Vector.<Number> = Vector.<Number>([5.1,0.0,404.8,0.2,0.0,450.5,77.7,0.0,386.9,155.2,0.0,464.4,
140.5,0.0,386.9,232.7,0.0,464.4,245.2,0.0,417.5,387.7,0.0,464.4,310.2,0.0,386.9,465.2,0.0,356.0,465.2,0.0,429.9,238.4,0.0,309.4,
156.5,0.0,309.4,24.4,0.0,339.0,176.9,0.0,211.6,0.2,0.0,231.9,232.7,0.0,231.9,378.3,0.0,327.6,310.2,0.0,231.9,378.3,0.0,231.8,
0.2,0.0,154.4,65.4,0.0,132.0,155.2,0.0,154.4,288.4,0.0,138.5,232.7,0.0,154.4,455.8,0.0,231.8,451.2,0.0,154.4,447.7,0.0,76.9,
310.2,0.0,76.9,0.2,0.0,55.5,77.7,0.0,76.9,155.2,0.0,-0.6,0.2,0.0,-0.6,155.2,0.0,47.5,232.7,0.0,60.0,232.7,0.0,-0.6,
465.2,0.0,-0.6]);
}//classend
}
internal class xNode
{
public var cx:Number = 0; public var cy:Number = 0;
public var group:int = -1;
public var test:int =-1;
public var vecNext:Vector.<xNode> = new Vector.<xNode>(0,false);
public var v0:int = 0;
public var v1:int = 0;
public var v2:int = 0;
public var x0:Number = 0; public var y0:Number = 0;
public var x1:Number = 0; public var y1:Number = 0;
public var x2:Number = 0; public var y2:Number = 0;
}//xnode