/**
* Copyright hacker_cobulht0 ( http://wonderfl.net/user/hacker_cobulht0 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/gj8B
*/
//追記@一部なおしてみました
//今年もよろしくお願い致します
//適当な線で延長線を描く・hitTestを使わず内包判定
package {
import flash.display.Sprite;
import flash.events.*;
import flash.geom.*;
[SWF(width = "465", height = "465", backgroundColor = 0xffffff, frameRate = "60")]
public class Main extends Sprite{
private static const fourCorners:Array=[new Point(0,0),new Point(465,0),new Point(465,465),new Point(0,465)];//左上 右上 右下 左下
private var _List:Vector.<_SPRITE_>=new Vector.<_SPRITE_>();
private var canvas:Sprite=new Sprite();
private var waq:Sprite=new Sprite();
private var tkk:Sprite=new Sprite();//多角形A描写
private var tkkA:Array=new Array();//多角形Aの点情報
private var pS:Point=new Point();
private var pE:Point=new Point();
private var pS2:Point=new Point();
private var pE2:Point=new Point();
public function Main(){if (stage) init();else addEventListener(Event.ADDED_TO_STAGE,init );}
public function init(ev:Event = null){
removeEventListener( Event.ADDED_TO_STAGE, init ) ;
stage.addChild(waq);
stage.addChild(canvas);
stage.addChild(tkk);
waq.graphics.lineStyle(1,0xDBD7D2);
waq.graphics.drawRect(0,0,465,465);
waq.graphics.endFill();
for (var q:int=0; q < 100; q++) {
var mr:_SPRITE_=new _SPRITE_();
addChild(mr);
mr.x=q % 10*20+125;
mr.y=Math.floor(q / 10)*20+125;
_List.push(mr);
}
stage.addEventListener(MouseEvent.MOUSE_DOWN, mdw);
}
//マウス操作----------------------------------------------------------------------------------------------------
private function mdw(ev){
func_mr_reset();
tkkA=new Array();
canvas.graphics.clear();
tkk.graphics.clear();
stage.addEventListener(MouseEvent.MOUSE_UP, mup);
stage.addEventListener(MouseEvent.MOUSE_MOVE, mmv);
pS.x=mouseX;
pS.y=mouseY;
}
private function mmv(ev){
canvas.graphics.clear();
canvas.graphics.lineStyle(5,0x9FE2BF);
canvas.graphics.moveTo(pS.x,pS.y);
canvas.graphics.lineTo(mouseX,mouseY);
canvas.graphics.endFill();
}
private function mup(ev){
stage.removeEventListener(MouseEvent.MOUSE_UP, mup);
stage.removeEventListener(MouseEvent.MOUSE_MOVE, mmv);
//canvas.graphics.clear();
pE.x=mouseX;
pE.y=mouseY;
//pSの続き
pS2=searchOverLine(pS,pE);
//pEの続き
pE2=searchOverLine(pE,pS);
if(ckError(pS2,pE2)==true){
canvas.graphics.lineStyle(10,0xC5E384);
canvas.graphics.moveTo(pS.x,pS.y);
canvas.graphics.lineTo(pS2.x,pS2.y);
canvas.graphics.endFill();
canvas.graphics.lineStyle(10,0x30BA8F);
canvas.graphics.moveTo(pE.x,pE.y);
canvas.graphics.lineTo(pE2.x,pE2.y);
canvas.graphics.endFill();
//二分割判定へ →tkkAに値が入る
graphicDivision();
if(tkkA.length>0){_ComprehensionJudgment(tkkA)}
}else{canvas.graphics.clear();};
}
//エラーチェック
private function ckError(arg1,arg2):Boolean{
var _b:Boolean=true;
if(arg1==null||arg2==null){_b=false;}
else if(arg1.x==0&&arg1.y==0){_b=false;}
else if(arg2.x==0&&arg2.y==0){_b=false;}
else if(isNaN(arg1.x)==true&&isNaN(arg1.y)==true){_b=false;}
else if(isNaN(arg2.x)==true&&isNaN(arg2.y)==true){_b=false;}
return _b;
}
//延長線検索----------------------------------------------------------------------------------------------------
private function searchOverLine(arg1,arg2):Point{//点の先を探す方 補助でいる点情報
var rP:Point=new Point();
//全体:左上がりか 右上がりか
var kataagari:String;//右上がり線か 左上がり線か
var ss:String;//arg1の立ち位置
//Yが上の方と下の方
var yu:Number;
var ys:Number;
if(arg1.x<arg2.x){ss="hd";}else{ss="mg";};
if(arg1.y<arg2.y){ss+="ue";yu=arg1.x;ys=arg2.x;}else{ss+="st";yu=arg2.x;ys=arg1.x;};
if(yu<ys){kataagari="hd";}else{kataagari="mg";};
//移動量
var mvx=Math.max(arg1.x,arg2.x)-Math.min(arg1.x,arg2.x);
var mvy=Math.max(arg1.y,arg2.y)-Math.min(arg1.y,arg2.y);if(mvy==0){return null;};
var endP:Point=new Point();
endP.x=arg1.x;
endP.y=arg1.y;
if(kataagari=="hd"){
if(ss=="hdue"){
while (endP.y > 0) {
endP.x-=mvx;
endP.y-=mvy;
}
rP= getIntersectionPoint(new Point(-10000,0),new Point(10000,0),arg1,endP);
}else if(ss=="mgst"){
while (endP.y < 465) {
endP.x+=mvx;
endP.y+=mvy;
}
rP= getIntersectionPoint(new Point(-10000,465),new Point(10000,465),arg1,endP);
}
}else if(kataagari=="mg"){
if(ss=="mgue"){
while (endP.y > 0) {
endP.x+=mvx;
endP.y-=mvy;
}
rP= getIntersectionPoint(new Point(-10000,0),new Point(10000,0),arg1,endP);
}else if(ss=="hdst"){
while (endP.y < 465) {
endP.x-=mvx;
endP.y+=mvy;
}
rP= getIntersectionPoint(new Point(-10000,465),new Point(10000,465),arg1,endP);
}
}
return rP;
}
//交差点検索
private function getIntersectionPoint(P1,P2,P3,P4):Point{
var cPt:Point=new Point();
//交差してるかしてないか
var ta=(P3.x - P4.x) * (P1.y - P3.y) + (P3.y - P4.y) * (P3.x - P1.x);
var tb=(P3.x - P4.x) * (P2.y - P3.y) + (P3.y - P4.y) * (P3.x - P2.x);
var tc=(P1.x - P2.x) * (P3.y - P1.y) + (P1.y - P2.y) * (P1.x - P3.x);
var td=(P1.x - P2.x) * (P4.y - P1.y) + (P1.y - P2.y) * (P1.x - P4.x);
if(ta * tb < 0 && tc * td < 0){
//2線の交点を求める
var v1a = (P1.y - P2.y) / (P1.x - P2.x);
var v1b = (P1.x*P2.y - P1.y*P2.x) / (P1.x - P2.x);
var v2a = (P3.y - P4.y) / (P3.x - P4.x);
var v2b = (P3.x*P4.y - P3.y*P4.x) / (P3.x - P4.x);
cPt.x = Math.floor((v2b-v1b) / (v1a-v2a));
cPt.y = Math.floor(v1a * cPt.x + v1b);
return cPt;
}else{return null;}
}
//二分割作成----------------------------------------------------------------------------------------------------
private function graphicDivision(){
//型と中点2つ objの集合を配列で返す
var ar:Array=new Array();
ar.push(search_pcob(pS2),search_pcob(pE2));
//arの順番をただす
if(ar[1].hen<ar[0].hen){
var tmp:Array=new Array();
tmp[0]=ar[1];
tmp[1]=ar[0];
ar=tmp;
}
var str:String=String(ar[0].hen)+String(ar[1].hen);
//多角形A描写
if(str=="02"||str=="13"){takaku4(ar);}else{takaku3(ar);}
}
//objを返す
private function search_pcob(arg):Object{
var obj:Object=new Object();
if(arg.y==465&&arg.x>0&&arg.x<465){
obj={hen:2,poi:arg};
}else if(arg.y==0||arg.y==465){
if(arg.x>0&&arg.x<465){
obj={hen:0,poi:arg};
}else if(arg.x>465){
obj={hen:1,poi:arg};
}else if(arg.x<0){
obj={hen:3,poi:arg};
}
}
return obj;
}
//多角形A描写
private function takaku3(arg){
var str:String=String(arg[0].hen)+String(arg[1].hen);
tkk.graphics.beginFill(0x1FCECB,0.5);
if(str=="01"){
tkk.graphics.moveTo(arg[0].poi.x,arg[0].poi.y);
tkk.graphics.lineTo(arg[1].poi.x,arg[1].poi.y);
tkk.graphics.lineTo(fourCorners[1].x,fourCorners[1].y);
tkk.graphics.lineTo(arg[0].poi.x,arg[0].poi.y);
tkkA[0]= new Point(arg[0].poi.x,arg[0].poi.y);
tkkA[1]= new Point(arg[1].poi.x,arg[1].poi.y);
tkkA[2]= new Point(fourCorners[1].x,fourCorners[1].y);
}else if(str=="03"){
tkk.graphics.moveTo(fourCorners[0].x,fourCorners[0].y);
tkk.graphics.lineTo(arg[0].poi.x,arg[0].poi.y);
tkk.graphics.lineTo(arg[1].poi.x,arg[1].poi.y);
tkk.graphics.lineTo(fourCorners[0].x,fourCorners[0].y);
tkkA[0]= new Point(fourCorners[0].x,fourCorners[0].y);
tkkA[1]= new Point(arg[0].poi.x,arg[0].poi.y);
tkkA[2]= new Point(arg[1].poi.x,arg[1].poi.y);
}else if(str=="12"){
tkk.graphics.moveTo(arg[0].poi.x,arg[0].poi.y);
tkk.graphics.lineTo(fourCorners[2].x,fourCorners[2].y);
tkk.graphics.lineTo(arg[1].poi.x,arg[1].poi.y);
tkk.graphics.lineTo(arg[0].poi.x,arg[0].poi.y);
tkkA[0]= new Point(arg[0].poi.x,arg[0].poi.y);
tkkA[1]= new Point(fourCorners[2].x,fourCorners[2].y);
tkkA[2]= new Point(arg[1].poi.x,arg[1].poi.y);
}else if(str=="23"){
tkk.graphics.moveTo(arg[0].poi.x,arg[0].poi.y);
tkk.graphics.lineTo(fourCorners[3].x,fourCorners[3].y);
tkk.graphics.lineTo(arg[1].poi.x,arg[1].poi.y);
tkk.graphics.lineTo(arg[0].poi.x,arg[0].poi.y);
tkkA[0]= new Point(arg[0].poi.x,arg[0].poi.y);
tkkA[1]= new Point(fourCorners[3].x,fourCorners[3].y);
tkkA[2]= new Point(arg[1].poi.x,arg[1].poi.y);
}
tkk.graphics.endFill();
}
private function takaku4(arg){
var str:String=String(arg[0].hen)+String(arg[1].hen);
tkk.graphics.beginFill(0x1FCECB,0.5);
if(str=="02"){
tkk.graphics.moveTo(arg[0].poi.x,arg[0].poi.y);
tkk.graphics.lineTo(fourCorners[1].x,fourCorners[1].y);
tkk.graphics.lineTo(fourCorners[2].x,fourCorners[2].y);
tkk.graphics.lineTo(arg[1].poi.x,arg[1].poi.y);
tkk.graphics.lineTo(arg[0].poi.x,arg[0].poi.y);
tkkA[0]= new Point(arg[0].poi.x,arg[0].poi.y);
tkkA[1]= new Point(fourCorners[1].x,fourCorners[1].y);
tkkA[2]= new Point(fourCorners[2].x,fourCorners[2].y);
tkkA[3]= new Point(arg[1].poi.x,arg[1].poi.y);
}else if(str=="13"){
tkk.graphics.moveTo(arg[0].poi.x,arg[0].poi.y);
tkk.graphics.lineTo(fourCorners[2].x,fourCorners[2].y);
tkk.graphics.lineTo(fourCorners[3].x,fourCorners[3].y);
tkk.graphics.lineTo(arg[1].poi.x,arg[1].poi.y);
tkk.graphics.lineTo(arg[0].poi.x,arg[0].poi.y);
tkkA[0]= new Point(arg[0].poi.x,arg[0].poi.y);
tkkA[1]= new Point(fourCorners[2].x,fourCorners[2].y);
tkkA[2]= new Point(fourCorners[3].x,fourCorners[3].y);
tkkA[3]= new Point(arg[1].poi.x,arg[1].poi.y);
}tkk.graphics.endFill();
}
//各_SPRITE_は多角形Aに内包さえているか
private function _ComprehensionJudgment(arg){
//多角形の中点を求める
var _G:Point=_getG(arg);
for (var k:int=0; k < _List.length; k++) {
var mr=_List[k];
var mp:Point=_getG(arg);
mp.x=mr.x;
mp.y=mr.y
var ck:Boolean=true;
//多角形の辺の数だけチェック
for (var q:int=0; q < arg.length; q++) {
if(q==arg.length-1){
if(getIntersectionPoint(arg[q],arg[0],_G,mp)!=null){ck=false};
}else{
if(getIntersectionPoint(arg[q],arg[q+1],_G,mp)!=null){ck=false};
}
}
if(ck==false){mr.alpha=0.2;}else{mr.scaleX=mr.scaleY=1.5;}
}
}
//多角形の中点を求める
private function _getG(arg):Point{
var _p:Point=new Point();
var xx:Number=0;
var yy:Number=0;
for (var q:int=0; q < arg.length; q++) {
xx+=arg[q].x;
yy+=arg[q].y;
}
_p.x=(xx/arg.length);
_p.y=(yy/arg.length);
return _p;
}
private function func_mr_reset(){
for (var q:int=0; q < _List.length; q++) {
var mr=_List[q];
mr.alpha=mr.scaleX=mr.scaleY=1;
}
}
//---------------------------------------------------------------- ------------------------------------
}
}
import flash.display.Sprite;
import flash.geom.Point;
class _SPRITE_ extends Sprite{
public function _SPRITE_ (){
this.graphics.beginFill(0x1DACD6);
this.graphics.drawCircle(0,0,5);
this.graphics.endFill();
}
}