2014年11月26日水曜日

頂点群と頂点群の配列を合わせる

頂点から頂点に渡す情報が正しくないといけないと思ったので考えて見ました。
はじめは座標を比べていたので他のMELを参考にベクトルで距離を取得することにした。
距離取得が球になったし、なにより凄く早くなったのがいい。
次は頂点の繋っている4頂点の座標を比べてみた。
これで間違って取得してきた頂点もある程度除外されるようになった。
全頂点を検索するので多少遅くなるけど、
最短距離の頂点から関連頂点の処理をすることで
しきい値指定が必要なくなった。
まだミスがあるので、もう一段階、関連する頂点を比較するといいのかもしれない。

//yjp_pMatchVtxArray(Aメッシュの頂点配列,Bメッシュ頂点配列)
//Aメッシュの頂点リストとBメッシュの頂点リストを比べて
//Aメッシュの頂点リストと同じ座標の頂点をBメッシュから探して
//Aメッシュの頂点配列と同じ順にする

global proc string[] yjp_pMatchVtxArray(string $sourcevtx[], string $targetvtx[])
{
int $n,$m,$c;
float $Credible;
int $amount = 0;
string $vtx[];
string $vtxlink_u[],$vtxlink_l[],$vtxlink_r[],$vtxlink_d[];
vector $xyzA,$xyzB;
vector $posAlink[4],$posBlink[4];
float $posA[],$posB[];
float $posAlink_u[3],$posAlink_l[3],$posAlink_r[3],$posAlink_d[3];
float $posBlink_u[3],$posBlink_l[3],$posBlink_r[3],$posBlink_d[3];
float $dis[2];
float $Length[];
float $Lengthsort[];

float $startTime = `timerX`;
progressWindow
-t "Compare vertex ..."
-pr $amount
-st "Search: ..."
-ii 0;

for ($n=0;$n<size($targetvtx);$n++)
{
$posA   = `pointPosition $targetvtx[$n]`;
$xyzA = <<$posA[0],$posA[1],$posA[2]>>;
//隣接する頂点
$vtxlink_u = `pickWalk -d up $targetvtx[$n]`;
$vtxlink_l = `pickWalk -d left $targetvtx[$n]`;
$vtxlink_r = `pickWalk -d right $targetvtx[$n]`;
$vtxlink_d = `pickWalk -d down $targetvtx[$n]`;

$posA   = `pointPosition $targetvtx[$n]`;
$xyzA = <<$posA[0],$posA[1],$posA[2]>>;

$posAlink_u = `pointPosition $vtxlink_u[0]`;
$posAlink_l = `pointPosition $vtxlink_l[0]`;
$posAlink_r = `pointPosition $vtxlink_r[0]`;
$posAlink_d = `pointPosition $vtxlink_d[0]`;

//隣接する頂点の座標配列
$posAlink[0] = << $posAlink_u[0],$posAlink_u[1],$posAlink_u[2]>>;
$posAlink[1] = << $posAlink_l[0],$posAlink_l[1],$posAlink_l[2]>>;
$posAlink[2] = << $posAlink_r[0],$posAlink_r[1],$posAlink_r[2]>>;
$posAlink[3] = << $posAlink_d[0],$posAlink_d[1],$posAlink_d[2]>>;

//print ("targetvtx " + $targetvtx[$n] +"\n");
int $che = 0;
for ($m=0;$m<size($sourcevtx);$m++)
{
$posB = `pointPosition $sourcevtx[$m]`;
$xyzB = <<$posB[0],$posB[1],$posB[2]>>;
$dis[0] = abs(mag($xyzA-$xyzB));
$Length[$m] = $dis[0];

//print ($sourcevtx[$m] + " dis "+$dis[0] +"\n");
}
//$sourcevtxの最小距離でソート
$Lengthsort = `sort $Length`;

int  $s ;
float $maxlink[];
string $Finalvtx[];
for ($m=0;$m<size($Lengthsort)/4;$m++)
{
$s = `floatArrayFind $Lengthsort[$m] 0 $Length`;

//print ("Length_s" + $Length[$s] + "\n") ;
//print ("Length_s" + $sourcevtx[$s] + "\n") ;

if ($sourcevtx[$s] == ""){break;}

$vtxlink_u = `pickWalk -d up $sourcevtx[$s]`;
$vtxlink_l = `pickWalk -d left $sourcevtx[$s]`;
$vtxlink_r = `pickWalk -d right $sourcevtx[$s]`;
$vtxlink_d = `pickWalk -d down $sourcevtx[$s]`;

//隣接する頂点

$posBlink_u = `pointPosition $vtxlink_u[0]`;
$posBlink_l = `pointPosition $vtxlink_l[0]`;
$posBlink_r = `pointPosition $vtxlink_r[0]`;
$posBlink_d = `pointPosition $vtxlink_d[0]`;

//隣接する頂点の座標配列
$posBlink[0] = << $posBlink_u[0],$posBlink_u[1],$posBlink_u[2]>>;
$posBlink[1] = << $posBlink_l[0],$posBlink_l[1],$posBlink_l[2]>>;
$posBlink[2] = << $posBlink_r[0],$posBlink_r[1],$posBlink_r[2]>>;
$posBlink[3] = << $posBlink_d[0],$posBlink_d[1],$posBlink_d[2]>>;
//頂点の隣接する頂点座標の近似チェック

$Credible = 0;
for ($c=0;$c<size($posBlink);$c++)
{
$dis[0] = abs(mag($posAlink[$c]-$posBlink[$c]));
$Credible += $dis[0];
}

$maxlink[$m] = $Credible / size($posBlink);
print ($sourcevtx[$s] + " " + $maxlink[$m] +"\n");
$Finalvtx[$m] = $sourcevtx[$s];
}
float $Finallink[] = `sort $maxlink`;
$s = `floatArrayFind $Finallink[0] 0 $maxlink`;

$vtx[size($vtx)] = $Finalvtx[$s];
//print ("sourcevtx " + $Finalvtx[$s] +"\n");
stringArrayRemoveAtIndex($s, $Finalvtx);

$amount += 1;
progressWindow -edit -max (size($targetvtx)) -pr $amount -st ("Compare vertex: " + $targetvtx[$n]);
}

progressWindow -ep;
float $totalTime = `timerX -startTime $startTime`;
print("Execution time: " + $totalTime + " seconds.\n");
return ($vtx);
}

0 件のコメント:

コメントを投稿