2016-07-18 12 views
0

私は360度イメージローテーターを構築しており、特定の順序で画像をロードする必要があります。理由は、多くの画像がある可能性があり、できるだけ多くの画像をロードする必要がありますが、ローテーションがあまりにもぎこちなくならず、できるだけ多くのオブジェクトのビューを提供します。360度に基づいて配列を並べ替え

1度の角度差でオブジェクトをキャプチャする360画像がある場合、画像の配列を1-360から順番に並べ替えて並べ替えると、インデックス180、次に90に画像が読み込まれます度、次に45度などです。

画像の配列:

var images = [image_001.jpg, image_002.jpg, ...image_475.jpg]; 

は、例えば、私は、シーケンス内の次の配列のインデックスを確認する必要があります。 1、180,360,90,135,225,315,45などの順番でインデックスをロードする必要があります。

これが表すアルゴリズムの名前を知っている人は、例だけでなく、

読んでいただきありがとうございます。

+0

特定のシーケンスのインデックスにアクセスするには、配列を並べ替える必要があるのはなぜですか? –

+0

PS:@誰でも投票すると投票しました。この質問は、「本、ツール、ソフトウェアライブラリ、チュートリアル、その他のオフサイトリソース」を求めているわけではありません。実際にあなたが選択している理由をお読みください。 –

+0

私はイメージが一言で再配置される必要はないと思いますが、正しい順序で並べ替えてロードすることができれば理想的です。 – ZiggidyCreative

答えて

3

、あなたはちょうどあなたがそれらにアクセスする方法を変更、それらを再配置する必要はありません。

var images = [], numImages = 360; 
for (var i = numImages; i > 0; i = Math.floor(i/2)) { // or i >>= 1 
    // get image at i 
} 

編集360 180 90 45 22 11 5 2 1

を通じてこれがループ:

function asyncAddToArray(arr, index, val) { 
    return function() { 
     arr[index] = val; 
    } 
} 

var images = [], loadedImages = [], numImages = 360; 
for (var j = numImages; j > 0; j >>= 1) { 
    for (var i = 0; i < numImages; i += j) { 
     if (!images[i]) { 
      var img = images[i] = new Image(); 
      img.onload = asyncAddToArray(loadedImages, i, true); 
      img.src = "images_" + (i < 100 ? i < 10 ? "00" + i : "0" + i : i) + ".jpg"; 
     } 
    } 
} 
:それは異なる間隔でループするように、このループを改善するために

は、次のようにループすることができます

これにより、より散発的な順番で読み込むことができるので、ユーザは、「より淡い」という3D画像を引き続き見ることができますすべての画像がロードされている間、彼はその間に。

番号がこのパターンになります。0 180 90 270 45 135 225 315 22 44 66 88 110 132 ... 359
this JSFiddleを参照し、全配列を参照するには。)

:あなたがいることを「最も近い」画像を識別するためにloadedImagesを使用する必要がありますファイル名が0ではなく1から始まる場合、iは1でオフセットされる可能性があります。

+0

これは私が必要とするものに近いですが、画像は既にその程度でソートされていません。 – ZiggidyCreative

+0

@ZiggidyCreativeだから、どのような順序でそれらが属しているのか分かりますか?ファイル名にはその情報が含まれていますか? – 4castle

+0

各画像の名前は「image_00n.jpg」です。 1から数えて本当に。私はffmpegを使ってビデオから各フレームを抽出しました。各フレームには番号が付けられています。すべての輸出が同じ量のイメージを持っているわけではありません。 – ZiggidyCreative

1

アルゴリズム?してくださいああ、これは3年生から数学であり、配列はすでに彼らの「度」でソートされている場合)

// this is an array.. with n images.. 
var images = [....]; 

// this is the angle, which is a value between 0 and 359 
var angle = 0...359; 

// this is a mathematical expression 
var currentImageIdx = Math.round((360/(images.length - 1)) * angle) 
+0

これはJavaScriptですか? '1 ... 360'が配列の略語であると仮定すると、配列全体をどのように数で掛けることができますか?また、359で360を分けるのは何ですか? –

+0

これは並べ替えを正確には説明しません。これは配列のインデックスを取得するために動作しますが、次の 'angle'を計算する必要があります。 – ZiggidyCreative

+0

@AsadSaeeduddin編集内容をお読みください – webdeb

関連する問題