관련
: 줄-기준-블럭식-사진-배치준비를-하기-위해
: 사진배치] 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]+') ';
for (i=0; i<hcv; i++) ov+='h'+fp2(hsum[i])+' ('+hcount[i]+') ';
// 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>
...
...
기존에 있던 나열식에
heap 의 최소값찾기를 이용해서 유사한(?) 비율의 사진을 찾고,
유사한 비율의 사진들의 위치가 거꾸로 배치된 경우 ( 1번줄 넣은 다음에 0번줄에 넣는다든지...)
해당 사진을 skip 하기위한 값을 다음 연산(?)시에 적용하도록 배치했다.
가로나열식에서는 -1을 skip 값에 넣고, 이전 "최대값"을 찾아서 skip 다음값부터 넣었고, (초기화라고할지...)
세로나열식에서는 그냥 0 으로 채워넣었다. (이 역시 초기화...)
...
함수선언이 특이(?)한 것이 하나가 있기는 한데,
뭐랄까... parameter 로 넣기가 애매해서 함수선언을 하는 방법으로 했다... (setChecklist)
...
그 외에... 이 블로그의 특성(?)상, 변수명이 겹칠 수도 있어서...
대표명 이외에는 모두(?) 대표함수(?) 안에 몰아넣었다.
...
음... 위의 표 우측값에
수식 하나를 더 만들어서 하고싶었지만, (현재는 좌우세로나열형태에 대해서만 계산...)
만들다가 느낀(?) 점 때문에...
...
대량의 이미지(대략 50개정도?)를 여기에 가둔(?) 경우,
같은 크기의 이미지들이라고 해도 최소 2^49 회 정도의 계산을 해야한다는 것이었다.
(대충 2^50 계산한다고 하면 1000^5 = 1000조...)
이정도 느린(?) 계산이라면 진행하는 것이 무의미(?)해져서...
만들었다는 것에만 만족(?)을 해야했다... OTL...
...
NowMark killofki@.
'image area' 카테고리의 다른 글
position:relative] 원위치를 찾아서... (0) | 2011.03.19 |
---|---|
scroll] 따라오려는(?) 사진... (0) | 2011.02.18 |
줄 기준 블럭식 사진 배치준비]...를 하기 위해... (0) | 2010.10.16 |
div] 협소한(?) 공간 깜짝(?) 크게만들기... (0) | 2010.05.05 |
div minimum height...? (0) | 2010.03.20 |