おいしいAS3 -24ページ目

box2D用に多角形を分解(続2)



反時計周りの多角形を
時計回りに修正する処理と
辺と辺の交差点があったら
そこで分割する処理を加えました

これでどんな複雑な多角形にも
対応できる…

と思ったのだけどまだ
なにか対応しきれてないケースがあるみたいで
だけどそれがどういう形状で起きるのか
いまいちよくつかみきれてません

再現しようとしてもうまくいかない
(ちゃんと処理できてしまう)ので
もしかしたら処理が追いついてなかったり
するだけなのかもしれませんが

ちょっといろいろいじくり回して検証します


アップロードさせてもらいました

二つの線の交点を求める

おいしいAS3

こんな関数、絶対にbox2Dのなかにあるよな
とか思いつつまた自作する…

複雑な多角形の辺が交差する所がある時に
そこで多角形をぶった切る処理制作の前哨戦





public static function isCrs(lineA:Array,lineB:Array):Boolean{
var rtn:Boolean=true
if((getAng(lineA[0],lineB[0],lineA[1])>0)==(getAng(lineA[0],lineB[1],lineA[1])>0))rtn=false
if((getAng(lineB[0],lineA[0],lineB[1])>0)==(getAng(lineB[0],lineA[1],lineB[1])>0))rtn=false
return rtn
}
public static function getCrs(lineA:Array,lineB:Array):Point{
var rtn:Point
if(isCrs(lineA,lineB)){
var vecA=lineA[1].subtract(lineA[0])
var vecB=lineB[1].subtract(lineB[0])
var f
if(lineB[0].x==lineB[1].x){
f=(lineB[0].x-lineA[0].x)/(lineA[1].x-lineA[0].x)
}else{
var dst1=Point.interpolate(lineB[1],lineB[0],(lineA[0].x-lineB[0].x)/(lineB[1].x-lineB[0].x)).subtract(lineA[0]).length
var dst2=Point.interpolate(lineB[1],lineB[0],(lineA[1].x-lineB[0].x)/(lineB[1].x-lineB[0].x)).subtract(lineA[1]).length
f=dst1/(dst1+dst2)
}
rtn=Point.interpolate(lineA[1],lineA[0],f)
}
return rtn
}


外角の和を求める処理はもう作っちゃいました
動作テストはしてないですがまあ大丈夫でしょう

box2D用に多角形を分解(続)

実はいまの複雑な多角形をbox2D用に
分解するコードにはちょっと欠陥があって
左回りだったり、辺と辺が交わるところが
あったりするとループに陥ってフリーズします

それで、これをどうするか考え中

左回りなら配列を逆転させて
右回りにすればいいだけで
これは外角の和を求めてやればわかるはずで
多分そんなに重くはならないです

が、問題は辺と辺が交わってたときに
多角形をその交点で分解する処理の方

多分これはざっと見積もって
分解処理の約2倍の処理をしなくちゃいけなくて
処理が現状の三倍の重さにふくれてしまう
ってことが予想されます

いまでも頂点が30ぐらいになると
ちょっとタイムラグが気になってくるぐらいなので
そんな処理をはさんだら…

でもこれを挿むと多分
どんな複雑な多角形にも対応できるようになるはず

辺が交わるところがあったらエラー返すだけにするか
それとも分解処理を挿んでやるか…