Fireworks 上から順番につめていくコマンド

2009/02/14

こんにちは。きんくまです。

今回は、整列に関係するコマンドです。


こんな状態に間隔がひらいていた場合に、上から順番につめていきます。

今回のクイックソートのアルゴリズムを古籏せんせいのところから使わせていただきました。
ありがとうございます。書籍何冊かもっていますよ!
→配列内のデータをソートする(クイックソート)

※注意。完全に同じyの値をもったものをソートする場合はエラーになってしまいます。
これを回避する方法がわからんかった。すみません。

var sel = fw.selection;
init();

function init(){
  var i;
  var selArr = new Array(sel.length);
  for(i = 0; i < sel.length; i++){
    var _target = sel[i];
    selArr[i] = { target:_target, y:_target.top };
  }
  selArr = sortDataOn(selArr, "y");
  var current;
  var prev;
  for(i = 0; i < selArr.length; i++){
    if(i == 0){ continue; }
    current = selArr[i].target;
    prev = selArr[i - 1].target;
    current.top = prev.top + prev.height;
  }
}

function sortDataOn(arr, property){
  var i;
  var j;
  var sortArr = new Array(arr.length);
  for(i = 0; i < arr.length; i++){
    sortArr[i] = arr[i][property];
  }

  sortArr = sortData(sortArr, 0, sortArr.length - 1);
  var sortedArr = new Array(arr.length);
  for(i = 0; i < sortArr.length; i++){
    for(j = 0; j < arr.length; j++){
      if(arr[j][property] == sortArr[i]){
        sortedArr[i] = arr[j];
        arr.splice(j);
        break;
      }
    }
  }
  return sortedArr;
}

function sortData(arr, start, end) {
  var x = arr[Math.floor((start + end) / 2)];
  var i = start;
  var j = end;
  var n;
  while (true) {
    while (arr[i] < x) i++;
    while (x < arr[j]) j--;
    if (i >= j) break;
      n = arr[i];
      arr[i] = arr[j];
      arr[j] = n;
      i++;
      j--;
  }
  if (start < i-1) sortData(arr, start,i-1);
  if (j+1 < end) sortData(arr, j+1,end);
  return arr;
}


自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る