box2D用に多角形を分解(続2)
反時計周りの多角形を
時計回りに修正する処理と
辺と辺の交差点があったら
そこで分割する処理を加えました
これでどんな複雑な多角形にも
対応できる…
と思ったのだけどまだ
なにか対応しきれてないケースがあるみたいで
だけどそれがどういう形状で起きるのか
いまいちよくつかみきれてません
再現しようとしてもうまくいかない
(ちゃんと処理できてしまう)ので
もしかしたら処理が追いついてなかったり
するだけなのかもしれませんが
ちょっといろいろいじくり回して検証します
アップロードさせてもらいました
二つの線の交点を求める

こんな関数、絶対に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ぐらいになると
ちょっとタイムラグが気になってくるぐらいなので
そんな処理をはさんだら…
でもこれを挿むと多分
どんな複雑な多角形にも対応できるようになるはず
辺が交わるところがあったらエラー返すだけにするか
それとも分解処理を挿んでやるか…
分解するコードにはちょっと欠陥があって
左回りだったり、辺と辺が交わるところが
あったりするとループに陥ってフリーズします
それで、これをどうするか考え中
左回りなら配列を逆転させて
右回りにすればいいだけで
これは外角の和を求めてやればわかるはずで
多分そんなに重くはならないです
が、問題は辺と辺が交わってたときに
多角形をその交点で分解する処理の方
多分これはざっと見積もって
分解処理の約2倍の処理をしなくちゃいけなくて
処理が現状の三倍の重さにふくれてしまう
ってことが予想されます
いまでも頂点が30ぐらいになると
ちょっとタイムラグが気になってくるぐらいなので
そんな処理をはさんだら…
でもこれを挿むと多分
どんな複雑な多角形にも対応できるようになるはず
辺が交わるところがあったらエラー返すだけにするか
それとも分解処理を挿んでやるか…