FC2ブログ
月別アーカイブ  [ 2019年11月 ] 

JavaScript いぢり 

線と四角形の当たり判定をまとめてみた。
と言っても基本phina.jsので使う前提。

基本・AB線とCD線の当たり判定。
tg=[Ax,Ay,Bx,By,Cx,Cy,Dx,Dy];//tgの中身。
var Chclossline = function(tg){
var ta = (tg[4] - tg[6]) * (tg[1] - tg[5]) + (tg[5] - tg[7]) * (tg[4] - tg[0]);
var tb = (tg[4] - tg[6]) * (tg[3] - tg[5]) + (tg[5] - tg[7]) * (tg[4] - tg[2]);
var tc = (tg[0] - tg[2]) * (tg[5] - tg[1]) + (tg[1] - tg[3]) * (tg[0] - tg[4]);
var td = (tg[0] - tg[2]) * (tg[7] - tg[1]) + (tg[1] - tg[3]) * (tg[0] - tg[6]);
return tc * td <= 0 && ta * tb <= 0;
};

応用。四角形RectとAB線の当たり判定。
var ClossRectline=function(rect,line){
let hitA=(Rect.left<line[0] && line[0]<Rect.right)&&(Rect.top<line[1]&& line[1]<Rect.bottom);
if(hitA)return true;
let hitB=(Rect.left<line[2] && line[2]<Rect.right)&&(Rect.top<line[3]&& line[3]<Rect.bottom);
if(hitB)return true;
//両端がRectに接触しているかどうか
let lineK=(line[0]<line[2])==(line[1]<line[3]);
let tai=[rect.left,rect[((!lineK)?"top":"bottom")],rect.right,rect[((lineK)?"top":"bottom")];
//判定に使用する対角線を選ぶ

let ChL=Chclossline(tai.concat(line));
if(!ChL)return false;
return true;
};

まだ試してないもの。
立方体cubeと三次元直線AB。
line=[Ax,Ay,Az,Bx,By,Bz]
天井と底はそれぞれ「ue」「sita」で表記。
var CbCloss = function(cube,line){
let ueline=[];// 01[2]34[5]
let yokoline=[];//0[1]23[4]5
for(var i=0;i<6;i++){
let n=line[i];
if(i%3!=2)ueline.push(n);
if(i%3!=1)yokoline.push(n);
}
let ueV=ClossRectline(cube,ueline);
if(!ueV)return false;
let yokoRec={left:cube.left,top:cube.ue,rihght:cube.right,bottom:cube.sita};
let yokoV=ClossRectline(yokoRec,yokoline);
if(!yokoV)return false;
return true;
};
スポンサーサイト



[ 2019/11/24 12:25 ] ゲームいぢり | TB(0) | CM(0)
ぶつくさ


ブログ内検索
カレンダー
10 | 2019/11 | 12
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
カウンター
ブロとも申請フォーム