관련
: 줄-기준-블럭식-사진-배치준비를-하기-위해
: 사진배치] OTL... 찾지 못해 결국 전부체크라...

지난번에 블럭식 사진배치를 위한 나열(?)를 했다면,
이번에는 나열하는 리스트 내에 유사한 크기의 순서를 잡아내어,
나름의 순서를 가지도록 만들어봤다.

...


<div id=v101026_1>ColNRows 출력부분</div>

<script>
var wRate101026_1=[1.5, 1.5, 1.5], wgab101026=2, wwidth101026=540;

function ColNRows101026(wr) { // wr : cells' Array

var count=wr.length; // count : total count of cells
var xn=80; // of overflow, break by "return"
var mLim=-2; // po's minus limit (-2 : able v, -1 : no v, other : = =;...)

var po=[], pq=[], pr=[];
// total position, other position, merged position,
var wr1=[], wr2=[];
// log wr / log_1.2's parseInt for check (h & only v)

var cpo, cpq, qcount;
// total loof, other loof, other count

// inner Function --

function fp2(v) { return parseInt(v*100)/100; }

function showArray(v, wv) { // ready sum
  var hsum=[], vsum=[], hcount=[], vcount=[], pv, hcv=-1, vcv=-1, vsum1, vsum2, hsum1, hsum2, h0;

  var ov='', i;

//
  for (i=0; i<v.length; i++) { hsum[i]=vsum[i]=hcount[i]=vcount[i]=0; }

ov+='<td>';
ov+=v;
  for (i=0; i<v.length; i++) {
//    ov+=v[i]+'.';

    if (v[i]<0) { pv=-v[i]-1; vsum[pv]+=1/wv[i]; vcount[pv]++; if (pv>vcv) vcv=pv; } // set about value v
    else { pv=v[i]; hsum[pv]+=wv[i]; hcount[pv]++; if (pv>hcv) hcv=pv; } // set about value h
    }
  hcv++; vcv++; // minimum pointer+1 = count

//  ov+='\r\n';
ov+='</td><td>';

  for (i=0; i<vcv; i++) ov+='v'+fp2(vsum[i])+' ('+vcount[i]+') &nbsp; ';
  for (i=0; i<hcv; i++) ov+='h'+fp2(hsum[i])+' ('+hcount[i]+') &nbsp; ';

//  ov+='\r\n';
ov+='</td><td>';

if (hcv) {
  hsum1=0; for (i=0; i<hcv; i++) hsum1+=hsum[0]/hsum[i];
  hsum2=0; for (i=0; i<hcv; i++) hsum2+=hcount[i]/hsum[i];
  vsum1=0; for (i=0; i<vcv; i++) vsum1+=1/vsum[i];

  h0=(wwidth101026-wgab101026*(vsum1*((hsum1-hsum2)+hcv-vcount[0]+vsum[0])+hcount[0]+vcv-1))/(hsum1*vsum1+hsum[0]);

//ov+='('+h0+')\r\n';
ov+='('+h0+')</td>';
}
else // no hcv
{
  vsum1=0; for (i=0; i<vcv; i++) vsum1+=1/vsum[i];
  vsum2=0; for (i=0; i<vcv; i++) vsum2+=vcount[i]/vsum[i];

  v0=(wwidth101026-wgab101026*(vcount[0]*vsum1-vsum2+vcv-1))/(vsum[0]*vsum1);

//  ov+='|'+v0+'|\r\n';
  ov+='|'+v0+'|</td>';
}

  return ov;
  }

  function setChecklist(wsv) {

return function (count, vv) {
  var i, p=[], lp, sv, n, ov, nv, k, xx;

function hless(v1, v2) { var p1=p[v1], p2=p[v2];
  if (wsv[p1]>wsv[p2]) return v2;
  if (wsv[p1]<wsv[p2]) return v1;
  if (vv[p1]>vv[p2]) return v2;
  if (vv[p1]<vv[p2]) return v1;
  if (p1>p2) return v2;
  if (p1<p2) return v1;
  return v1;
  }

  for (i=0; i<count; i++) p[i]=i;

// heap initialize

  for (i=parseInt((count+1)/2)*2-1; i>0; i-=2) {
    k=i; while (k<count) {
      lp=parseInt((k+1)/2)-1;
      if ((k+1)<count) k=hless(k, k+1);
      if (hless(k, lp)!=k) break;

      sv=p[k]; p[k]=p[lp]; p[lp]=sv;
      k=k*2+1;
      }
    }

// get heap

  n=count; ov=-1;
  while (n) {

if (vv[p[0]]>=0) ov=p[0];

    p[0]=p[n-1]; n--;

    k=1; while (k<n) {
      lp=parseInt((k+1)/2)-1;
      if ((k+1)<n) k=hless(k, k+1);
      if (hless(k, lp)!=k) break;

      sv=p[k]; p[k]=p[lp]; p[lp]=sv;
      k=k*2+1;
      }

if (ov>=0) if (vv[p[0]]>=0) {
    nv=p[0]; if (wsv[ov]!=wsv[nv]) continue;
    if (ov>nv) break;
    }

    }

 if (n) return ov; // found error
return -1;

  }

  } // end of setChecklist

// inner Function //

var checklist1=setChecklist(wr1), checklist2=setChecklist(wr2);

var i, j, cmax; // for loofs
var log1_2=Math.log(1.2);

for (i=0; i<count; i++) wr1[i]=parseInt(Math.log(wr[i])/log1_2);

  for (i=0; i<count; i++) po[i]=mLim;

  cpo=0;

var ccv;

var ov=''; // show result

ov+='<table border=1 cellpadding=2 cellspacing=0>';

  while (cpo<count) {
    if (cpo>=0) {
cmax=0;
for (i=0; i<count; i++) {
  if (po[i]>=cmax) cmax=po[i]+1;
  if (po[i]==mLim) po[i]=cmax++;
  } //end of for
        } // end of cpo>=0

ccv=checklist1(count, po);
if (ccv>=0) { po[ccv]=-1; cmax=0; for (i=0; i<ccv; i++) if (po[i]>=cmax) cmax=po[i]+1; for(ccv++;ccv<count;ccv++) po[ccv]=cmax++; }
// init with -1

  for (i=0, qcount=0; i<count; i++) if (po[i]==-1) { wr2[qcount]=wr[i]; pq[qcount++]=-1 };

if (!qcount) { // if no -1,
/// print of with -1

for (i=0; i<count; i++) pr[i]=po[i];

ov+='<tr><td>+</td>';
ov+=showArray(pr, wr); // sum of arrays
ov+='</tr>';

if (!xn--) return ov; // break overflow point

  }

cpq=0;
while (cpq<qcount) {
  if (cpq>=0) {
cmax=0;
for (i=cpq; i<qcount; i++) {
  if (pq[i]>=cmax) cmax=pq[i]+1;
  if (pq[i]==-1) pq[i]=cmax++;
  } // end of for
    } // end of cpq>=0

ccv=checklist1(qcount, pq);
if (ccv>=0) for (;ccv<qcount; ccv++) pq[ccv]=0;
// init other all

else {

ov+='<tr><td>*</td>';
for (i=0, j=0; i<count; i++) { if (po[i]==-1)  pr[i]=(-pq[j++]-1); else pr[i]=po[i]; }
ov+=showArray(pr, wr); // sum of arrays
ov+='</tr>';

  if (!xn--) return ov; // break overflow point

}

/// ready of next other

    cpq=qcount-1;
    while (cpq<qcount) {
pq[cpq]--;
if (pq[cpq]==-1) { cpq--; if (cpq<0) break; }
else break;
    } // end of smalll cpq
  if (cpq<0) break;
  } // end of while big cpq

/// ready of next total

    cpo=count-1;
    while (cpo<count) {
po[cpo]--;
if (po[cpo]==mLim) { cpo--; if (cpo<0) break; }
else break;
      } // end of small cpo
    if (cpo<0) break;
    } // end of while big cpo

ov+='</table>';

  return ov;
  }

document.getElementById('v101026_1').innerHTML=ColNRows101026(wRate101026_1);
</script>


...


ColNRows 출력부분



...

기존에 있던 나열식에

heap 의 최소값찾기를 이용해서 유사한(?) 비율의 사진을 찾고,

유사한 비율의 사진들의 위치가 거꾸로 배치된 경우 ( 1번줄 넣은 다음에 0번줄에 넣는다든지...)
해당 사진을 skip 하기위한 값을 다음 연산(?)시에 적용하도록 배치했다.

가로나열식에서는 -1을 skip 값에 넣고, 이전 "최대값"을 찾아서 skip 다음값부터 넣었고, (초기화라고할지...)
세로나열식에서는 그냥 0 으로 채워넣었다. (이 역시 초기화...)

...

함수선언이 특이(?)한 것이 하나가 있기는 한데,
뭐랄까... parameter 로 넣기가 애매해서 함수선언을 하는 방법으로 했다... (setChecklist)

...

그 외에... 이 블로그의 특성(?)상, 변수명이 겹칠 수도 있어서...
대표명 이외에는 모두(?) 대표함수(?) 안에 몰아넣었다.

...

음... 위의 표 우측값에
수식 하나를 더 만들어서 하고싶었지만, (현재는 좌우세로나열형태에 대해서만 계산...)

만들다가 느낀(?) 점 때문에...

...

대량의 이미지(대략 50개정도?)를 여기에 가둔(?) 경우,
같은 크기의 이미지들이라고 해도 최소 2^49 회 정도의 계산을 해야한다는 것이었다.
(대충 2^50 계산한다고 하면 1000^5 = 1000조...)

이정도 느린(?) 계산이라면 진행하는 것이 무의미(?)해져서...
만들었다는 것에만 만족(?)을 해야했다... OTL...

...

NowMark killofki@.


Posted by killofki
,