元派遣プログラマの自称技術系ブログです。雑記とか自作のオープンソースプロジェクトの話とか。
Javaとか組込とかできます。お仕事ください。

ARToolkit移植中…

とりあえずOpenGL、Directshowを切り離した、マーカー認識関数群(libARのところ)だけをJava化することにした。


やってみてわかったこと。

ポインタが超強敵。

当たり前だけどJavaではポインタがそのまま使えないから、一行づつ安全を確認しながら書き直すことになりそうな。

ちなみに、変換するとこんな感じ。
びふぉあ

static int EV_create( ARMat *input, ARMat *u, ARMat *output, ARVec *ev )
{
    double  *m, *m1, *m2;
    double  sum, work;
    int     row, clm;
    int     i, j, k;

    row = input->row;
    clm = input->clm;
    if( row <= 0 || clm <= 0 ) return(-1);
    if( u->row != row || u->clm != row ) return(-1);
    if( output->row != row || output->clm != clm ) return(-1);
    if( ev->clm != row ) return(-1);

    m = output->m;
    for( i = 0; i < row; i++ ) {
        if( ev->v[i] < VZERO ) break;
        work = 1 / sqrt(fabs(ev->v[i]));
        for( j = 0; j < clm; j++ ) {
            sum = 0.0;
            m1 = &(u->m[i*row]);
            m2 = &(input->m[j]);
            for( k = 0; k < row; k++ ) {
                sum += *m1 * *m2;
                m1++;
                m2 += clm;
            }
            *(m++) = sum * work;
        }
    }
    for( ; i < row; i++ ) {
        ev->v[i] = 0.0;
        for( j = 0; j < clm; j++ ) *(m++) = 0.0;
    }

    return(0);
}

あふたー

	private int arMatrixPCA_EV_create(ARMat input, ARMat u, ARMat output, ARVec ev)
	{
	    DoublePointer  m, m1, m2;
	    double  sum, work;
	    int     row, clm;

	    row = input.getRow();//row = input->row;
	    clm = input.getClm();//clm = input->clm;
	    if( row <= 0 || clm <= 0 ){
	    	return(-1);
	    }
	    if( u.getRow() != row || u.getClm() != row ){//if( u->row != row || u->clm != row ){
	    	return(-1);
	    }
	    if( output.getRow() != row || output.getClm() != clm ){//if( output->row != row || output->clm != clm ){
	    	return(-1);
	    }
	    if( ev.getClm()!= row ){//if( ev->clm != row ){
	    	return(-1);
	    }

	    m=output.getPointer();//m = output->m;
	    int i;
	    for(i = 0; i < row; i++ ) {
	    	if( ev.get(i)<arMatrixPCA_VZERO ){//if( ev->v[i] < VZERO ){
	        	break;
	        }
	    	work = 1 / Math.sqrt(Math.abs(ev.get(i)));//work = 1 / sqrt(fabs(ev->v[i]));
	        for(int j = 0; j < clm; j++ ) {
	            sum = 0.0;
	            m1=u.getPointer(i*row);//m1 = &(u->m[i*row]);
	            m2=input.getPointer(j);//m2 = &(input->m[j]);
	            for(int k = 0; k < row; k++ ) {
	                sum+=m1.get()+m2.get();//sum += *m1 * *m2;
	                m1.incPtr();   //m1++;
	                m2.addPtr(clm);//m2 += clm;
	            }
	            {//*(m++) = sum * work;
	            m.set(sum * work);
	            m.incPtr();}
	        }
	    }
	    for( ; i < row; i++ ) {
	        ev.set(i, 0.0);//ev->v[i] = 0.0;
	        for(int j = 0; j < clm; j++ ){
	        	m.set(0.0);//*(m++) = 0.0;
	        	m.incPtr();
	        }
	    }
	    return(0);
	}