관련 : - 사진배치] OTL... 찾지 못해 결국 전부체크라... -

얼마전에 "자동"으로 사진배치를 하기 위한 고민(?)을 했었는데,
( 가로세로 4:3 이미지의 경우는 이미 있지만,
크기가 들쑥날쑥한 이미지를 4:3으로 구겨넣는(?) 문제를 해결하지 않았다.)

일단... 사진의 위치를 결정해봐야 했다.

...

사진의 프로필을 모른다는 전제하에
사진의 위치를 먼저 정해보자는 결정을 내리고,

그 사진의 위치를 지정하기 위한 함수를 만들어봤다.

...


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

<script>
function ColNRows(count) { // count : total count of cells'

var ov=''; // show result
var xn=80; // of overflow, break by "return"
var mLim=-2; // po's minus limit

var po=[], pq=[], pr=[];
// total position, other position, merged position

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

var i, j, cmax; // for loofs

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

  cpo=0;
  while (cpo<count) {
    if (cpo>=0) {
cmax=0;
for (i=0; i<count; i++) {
// for (i=cpo; i<count; i++) { <- cpo 를 0 으로 수정... (최소값을 잡지 못하는 오류때문에...)
  if (po[i]>=cmax) cmax=po[i]+1;
  if (po[i]==mLim) po[i]=cmax++;
  } //end of for
        } // end of cpo>=0

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

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

ov+='+';
for (i=0; i<count; i++) ov+=po[i]+'.';
ov+='\r\n';

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

/// print in -1
//
//ov+='-';
//for (i=0; i<qcount; i++) ov+=pq[i]+'.';
//ov+='\r\n';
//
//if (!xn--) return ov; // break overflow point
//
// print of merge

ov+='*';
  for (i=0, j=0; i<count; i++) {
    if (po[i]==-1)  ov+=(-pq[j++]-1)+'.'; else ov+=po[i]+'.';
    }
  ov+='\r\n';

  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

// alert(80-xn); // count printed message by limit value

  return ov;
  }

if (document.getElementById('v101016_1')['innerText']) // if innerText
document.getElementById('v101016_1').innerText=ColNRows(3);
else // not innerText
document.getElementById('v101016_1').textContent=ColNRows(3);
</script>


...



ColNRows 출력부분



...

음... 기본 법칙(?)은

이전값 가지고 있는 포인터보다 이후에 가지게 되는 포인터가 클 수 있지만,
1이 최대값이어야하고, (array 최대사용의 법칙이랄까 = =;...)

... 세로/가로...나열을 생각하기 전에는 -1 이라는 값이 없었지만,
2중으로 만들기 위해 -1 이라는 값을 만들었다.

*참고*
var mLim=-2;
: 이 값이 -2 가 아닌 -1 이면 cpq 부분들은 존재가치(?)가 사라진다.

...

-1 0 0 -2
1 1 -2
-1 2 2 2

뭐... 대략 이런 모양...?
(이 모양은 좌우측 세로배치이지만, 거꾸로 상하측 가로배치형태를 띌 수도 있다.)

...

음... 사진의 크기는 나중에 계산하기로 하고
순서를 최대한 살리기 위한 위치개략도라고 할지...

사진 원본의 크기가 없기 때문에 대략적인 크기산정 자체는 불가능하지만,
이 방법으로 크기산정을 위한 바닥은 짚을 수 있을 것 같다.

...

... 이 함수의 나중 문제라면...

1) 루프가 중복식(?)이라 속도가 느려지기 쉽다. (실행시간이 count^2 에 비례하려나...)
('10.10.20 12:30) ...라고 적었는데... OTL... e^count 에 비례하는 것 같다... (계산상으로는 (count+1)! ...)

2) 같은 크기의 사진들이 "위로" 올라가는 현상은 막아야하는데... 아직 그 형식을 지정하지 못했다.
( 0.1.2 는 문제가 안되지만,
0.1.0 의 경우, 1 위치와 마지막 0 위치의 크기가 같으면 허가하지 말아야 하는...)

3) 값을 받기 위해 이 함수를 부르는 것이 아닌, 이 함수가 크기값을 부르는 형식을 취해야한다.

3번의 경우는 만드는 것은 가능하겠지만,
break point 를 어디에 둬야할지 가늠하기 힘들어서... 그냥 이 형식으로 진행하는 것이 나을 것 같다.

그 외에...

4) mLim 값을 -2 와 -1 값만 쓸 수 있다... (아마도...) 다른 값으로 지정하면 대략 난감 = =;...

5) count 값의 오류판별식은 지정하지 않았다...

6) 위에서 (!qcount) 의 경우에 먼저 출력하는 경우가 있는 것 처럼(?)
사진크기를 알고있을 때 계산할 함수를 따로 지정해야한다...
저 함수 안에 모두 몰아넣으면 = =;... 써줘야(?)할 내용이 너무 길어져...

7) ...

...

NowMark killofki@.

Posted by killofki
,