//! Called by the engine when the vertex and/or pixel shader constants for an
//! material renderer should be set.
void COpenGLParallaxMapRenderer::OnSetConstants(IMaterialRendererServices* services, s32 userData)
{
	video::IVideoDriver* driver = services->getVideoDriver();

	// set transposed world matrix
	const core::matrix4& tWorld = driver->getTransform(video::ETS_WORLD).getTransposed();
	services->setVertexShaderConstant(tWorld.pointer(), 0, 4);

	// The  viewpoint is at (0., 0., 0.) in eye space.
	// Turning this into a vector [0 0 0 1] and multiply it by
	// the inverse of the view matrix, the resulting vector is the
	// object space location of the camera.

	f32 floats[4] = {0.0f,0.0f,0.0f,1.0f};
	core::matrix4 minv(driver->getTransform(video::ETS_VIEW));
	minv.makeInverse();
	minv.multiplyWith1x4Matrix(floats);
	services->setVertexShaderConstant(floats, 16, 1);

	// set transposed worldViewProj matrix
	core::matrix4 worldViewProj(driver->getTransform(video::ETS_PROJECTION));
	worldViewProj *= driver->getTransform(video::ETS_VIEW);
	worldViewProj *= driver->getTransform(video::ETS_WORLD);
	core::matrix4 tr(worldViewProj.getTransposed());
	services->setVertexShaderConstant(tr.pointer(), 8, 4);

	// here we fetch the fixed function lights from the driver
	// and set them as constants

	u32 cnt = driver->getDynamicLightCount();

	for (u32 i=0; i<2; ++i)
	{
		video::SLight light;

		if (i<cnt)
			light = driver->getDynamicLight(i);
		else
		{
			light.DiffuseColor.set(0,0,0); // make light dark
			light.Radius = 1.0f;
		}

		light.DiffuseColor.a = 1.0f/(light.Radius*light.Radius); // set attenuation

		services->setVertexShaderConstant(
			reinterpret_cast<const f32*>(&light.Position), 12+(i*2), 1);

		services->setVertexShaderConstant(
			reinterpret_cast<const f32*>(&light.DiffuseColor), 13+(i*2), 1);
	}

	// set scale factor
	f32 factor = 0.02f; // default value
	if (CurrentScale != 0.0f)
		factor = CurrentScale;

	f32 c6[] = {factor, factor, factor, factor};
	services->setPixelShaderConstant(c6, 0, 1);
}
Ejemplo n.º 2
1
int main()
{
	ull i,x,s,m;
	ull f41[10];
	f41[0] =1;
	for(i=1;i<=9;i++)
		f41[i] = f41[i-1]*41;
	fact[0] = fact2[0] = 1;
	for(i=1;i<=max;i++)
		fact[i] = ( ( ( fact[i-1] * (4*i-2) ) % mod4 ) * minv(i,mod4) ) % mod4;
	for(i=1;i<=2*max;i++)
	{
		x = i;
		while(!(x%41))
			x/=41;
		fact2[i] = (fact2[i-1]*x)%mod6;
	}
	ncr[0] = 1;
	for(i=1;i<=max;i++)
	{
		s = minv(fact2[i],mod6);
		s = (s*s)%mod6;
		x = (fact2[2*i]*s)%mod6;
		m = pow_fact(2*i) - 2*pow_fact(i);
		x = (x*f41[m])%mod6;
		ncr[i] = crt(fact[i],x);
	}
	return 0;
}
Ejemplo n.º 3
1
// hungarian method : bipartite min-weighted matching
// O(n^3) or O(m*n^2)
// http://e-maxx.ru/algo/assignment_hungary
// mat[1][1] ~ mat[n][m]
// matched[i] : matched column of row i
int hungarian(vector<int>& matched) {
    vector<int> u(n + 1), v(m + 1), p(m + 1), way(m + 1), minv(m + 1);
    vector<char> used(m + 1);
    for (int i = 1; i <= n; ++i) {
        p[0] = i;
        int j0 = 0;
        fill(minv.begin(), minv.end(), INF);
        fill(used.begin(), used.end(), false);
        do {
            used[j0] = true;
            int i0 = p[j0], delta = INF, j1;
            for (int j = 1; j <= m; ++j) {
                if (!used[j]) {
                    int cur = mat[i0][j] - u[i0] - v[j];
                    if (cur < minv[j]) minv[j] = cur, way[j] = j0;
                    if (minv[j] < delta) delta = minv[j], j1 = j;
                }
            }
            for (int j = 0; j <= m; ++j) {
                if (used[j])
                    u[p[j]] += delta, v[j] -= delta;
                else
                    minv[j] -= delta;
            }
            j0 = j1;
        } while (p[j0] != 0);
        do {
            int j1 = way[j0];
            p[j0] = p[j1];
            j0 = j1;
        } while (j0);
    }
    for (int j = 1; j <= m; ++j) matched[p[j]] = j;
    return -v[0];
}
void gen_fact_inv()
{
	ll i;
	fact[0] = 1,inv[0]=1,inv[2]=0;
	for(i=1;i<=max;i++)
	{
		fact[i] = (fact[i-1]*i)%mod;
		inv[i] = minv(fact[i],mod);
		inv2[i] = minv(i,mod);
	}
}
Ejemplo n.º 5
0
// Center mesh around origin.
// Fit mesh in box from (-1, -1, -1) to (1, 1, 1)
void Mesh::Normalize()  
{
	float min[3], max[3], Scale;

	setMinMax(min, max);

	Vec3 minv(min);
	Vec3 maxv(max);

	Vec3 dimv = maxv - minv;
	
	if (dimv.x >= dimv.y && dimv.x >= dimv.z) Scale = 2.0f/dimv.x;
	else if (dimv.y >= dimv.x && dimv.y >= dimv.z) Scale = 2.0f/dimv.y;
	else Scale = 2.0f/dimv.z;

	Vec3 transv = minv + maxv;

	transv *= 0.5f;

	for (unsigned int i = 0; i < _vlist.size(); ++i)
	{
		_vlist[i].getXYZ() -= transv;
		_vlist[i].getXYZ() *= Scale;
	}
}
Ejemplo n.º 6
0
int main()
{
	ull i=0,j;
	a[i] = 1;
	for(i=1;i<=mod;i++)
	{
		ull x = i;
		for(j=0;j<4;j++)
			while(!(x%val[j]))
				x /= val[j];
		a[i] = (a[i-1] * x)%mod;
	}
	int t;
	scanf("%d",&t);
	while(t--)
	{
		ull n,r;
		scanf("%lld%lld",&n,&r);
		int i,s1[4]={0},s2[4]={0},check = 0;
		for(i=0;i<4;i++)
		{
			s1[i] = power(n,val[i]);
			s2[i] = power(r,val[i]) + power(n-r,val[i]);
			if(s1[i]-s2[i] < count[i])
				check = 1;
		}
		if(check)
		{
			ull b[5]={0},c[5]={0};
			ull x = num_to_base(n,b,mod);
			ull x1 = num_to_base(r,c,mod);
			ull ans = 1;
			for(i=0;i<=x;i++)
			{
				ans = ( a[b[i]] * minv(a[c[i]],mod) )%mod;
				ans =  (ans * minv(a[b[i]-c[i]],mod) )%mod;
			}
			for(i=0;i<4;i++)
				ans = ( ans * power2(val[i],s1[i]-s2[i]) )%mod;
			printf("%lld\n",ans);
		}
		else
			printf("0\n");
	}
	return 0;
}
Ejemplo n.º 7
0
//---------------------------------------------------------------------------
TMatrix TMatrix::operator!() const                    // обращение матрицы
{
  if (sizeV != sizeH)
     throw Exception("Попытка обратить неквадратную матрицу!");
  TMatrix Result(*this);
  minv (Result.mat, sizeV);
  return Result;
}
int main()
{
	ull i,t,n,x;
	a[1] = 1;
	for(i=2;i<=max;i++)
		x=i-1,a[i] = (((a[i-1]*(4*x+2))%mod)*minv(x,mod))%mod;
	for(scanf("%lld",&t);t--;scanf("%lld",&n),printf("%lld\n",a[n]));
	return 0;
}
Ejemplo n.º 9
0
Transform Translate(const Vector &delta) {
    Matrix4x4 m(1, 0, 0, delta.x,
                0, 1, 0, delta.y,
                0, 0, 1, delta.z,
                0, 0, 0,       1);
    Matrix4x4 minv(1, 0, 0, -delta.x,
                   0, 1, 0, -delta.y,
                   0, 0, 1, -delta.z,
                   0, 0, 0,        1);
    return Transform(m, minv);
}
Ejemplo n.º 10
0
Transform Scale(float x, float y, float z) {
    Matrix4x4 m(x, 0, 0, 0,
                0, y, 0, 0,
                0, 0, z, 0,
                0, 0, 0, 1);
    Matrix4x4 minv(1.f/x,     0,     0,     0,
                   0,     1.f/y,     0,     0,
                   0,         0,     1.f/z, 0,
                   0,         0,     0,     1);
    return Transform(m, minv);
}
Ejemplo n.º 11
0
Archivo: example.c Proyecto: ombt/ombt
// test driver
main(int , char **)
{
    // output precision
    cout.precision(6);
    cout.setf(ios::showpoint);

    // define matrix and initialize elements
    int nrows = 3;
    int ncols = 3;
    int idata = 0;
    int ir = 0;
    Matrix<double> m(nrows, ncols);
    for ( ; ir < nrows; ir++)
    {
        for (int ic = 0; ic < ncols; ic++)
        {
            m(ir, ic) = data[idata++];
        }
    }
    cout << "TEST MATRIX IS ... " << endl;
    cout << m << endl;
    Matrix<double> msave(m);

    // initialize inhomogeneous part.
    Vector<double> y(nrows);
    for (ir = 0; ir < nrows; ir++)
    {
        y[ir] = data[idata++];
    }
    cout << "TEST Y-VECTOR IS ... " << endl;
    cout << y << endl << endl;

    // get LUP decomposition
    Vector<int> pv(nrows);
    double determinant;
    MustBeTrue(GaussianLUP_Pivot(m, pv, 0.0, determinant) == OK);

    // get solution using LUP results
    Vector<double> x(nrows);
    MustBeTrue(SolveUsingGaussianLUP_Pivot(m, x, y, pv, 0.0) == OK);
    cout << "SOLUTION X IS ... " << x << endl << endl;

    // get inverse using LUP results
    Matrix<double> minv(nrows, ncols);
    MustBeTrue(GetInverseUsingGaussianLUP_Pivot(m, minv, pv, 0.0) == OK)
    cout << "INVERSE OF M IS ... " << endl << endl;
    cout << minv << endl;
    cout << "M*MINV IS ... " << endl;
    cout << msave*minv << endl << endl;

    return(0);
}
Ejemplo n.º 12
0
	Transform Transform::Scale(float p_x, float p_y, float p_z){
		Matrix4x4 m(p_x, 0, 0, 0,
			0, p_y, 0, 0,
			0, 0, p_z, 0,
			0, 0, 0, 1);

		Matrix4x4 minv(1.0f/p_x, 0, 0, 0,
			0, 1.0f/p_y, 0, 0,
			0, 0, 1.0f/p_z, 0,
			0, 0, 0, 1);

		return Transform(m, minv);
	}
Ejemplo n.º 13
0
int main()
{
	ull i,x,s,m;
	ull f41[10];
	f41[0] = 1;
	for(i=1;i<=9;i++)
		f41[i] = f41[i-1]*41;
	fact[0] = fact2[0] = 1;
	for(i=1;i<=max+5;i++)
		fact[i] = ( ( ( fact[i-1] * (4*i-2) ) % mod4 ) * minv(i,mod4) ) % mod4;
	for(i=1;i<=2*max+5;i++)
	{
		x = i;
		while(!(x%41))
			x/=41;
		fact2[i] = (fact2[i-1]*x)%mod6;
	}
	int t,a,b,n=79981;
	for(a=0;a<100;a++)
		for(b=0;b<100;b++)
			{
				s = minv(fact2[n],mod6);
				s = (s*s)%mod6;
				x = (fact2[2*n]*s)%mod6;
				m = pow_fact(2*n) - 2*pow_fact(n);
				x = x*f41[m];
				ull y = crt(fact[n],x%mod6);
				if(n==0)
					y = 1;
				if (y==0)
					y = mod3;
				ull y1 = power(b,y,mod2);
				if(b==0)
					y1 = 0;
				ull z = power(a,y1,mod1);
				printf("%lld\n",z);
			}
	return 0;
}
Ejemplo n.º 14
0
Transform translate(float x, float y, float z) {
	Matrix4x4 m(
		1, 0, 0, x,
		0, 1, 0, y,
		0, 0, 1, z,
		0, 0, 0, 1);
	Matrix4x4 minv(
		1, 0, 0, -x,
		0, 1, 0, -y,
		0, 0, 1, -z,
		0, 0, 0, 1
		);
	return Transform(m, minv);
}
Ejemplo n.º 15
0
function ent_setminmax(ENTITY *ent)
{
	VECTOR pos;
	vec_set(&ent->max_x, vector(-9999999, -9999999, -9999999));
	vec_set(&ent->min_x, vector(9999999, 9999999, 9999999));
	int i;
	CONTACT c;
	for(i = 1; i <= ent_status(ent, 0); i++)
	{
		VECTOR pos;
		ent_getvertex(ent, &c, i);
		pos.x = c.v->x;
		pos.y = c.v->z;
		pos.z = c.v->y;
		//vec_mul(&pos, &ent->scale_x);
		
		ent->max_x = maxv(pos.x, ent->max_x);
		ent->max_y = maxv(pos.y, ent->max_y);
		ent->max_z = maxv(pos.z, ent->max_z);
		ent->min_x = minv(pos.x, ent->min_x);
		ent->min_y = minv(pos.y, ent->min_y);
		ent->min_z = minv(pos.z, ent->min_z);
	}
}
Ejemplo n.º 16
0
	Transform Transform::Translate(const Vector3& p_delta){
		Matrix4x4 m(1, 0, 0, p_delta.x,
			0, 1, 0, p_delta.y,
			0, 0, 1, p_delta.z,
			0, 0, 0, 1
			);

		Matrix4x4 minv(1, 0, 0, -p_delta.x,
			0, 1, 0, -p_delta.y,
			0, 0, 1, -p_delta.z,
			0, 0, 0, 1
			);

		return Transform(m, minv);
	}
Ejemplo n.º 17
0
//! renvoie la transformation associee au changement d'echelle (v, v, v).
Transform Scale( float v )
{
    Matrix4x4 m(
        v, 0, 0, 0,
        0, v, 0, 0,
        0, 0, v, 0,
        0, 0, 0, 1 );
    
    Matrix4x4 minv(
        1.f / v,       0,       0, 0,
              0, 1.f / v,       0, 0,
              0,       0, 1.f / v, 0,
              0,       0,       0, 1 );
    
    return Transform( m, minv );
}
Ejemplo n.º 18
0
autoSound Sound_and_MixingMatrix_unmix (Sound me, MixingMatrix thee) {
	try {
		if (my ny != thy numberOfRows) {
			Melder_throw (U"The MixingMatrix and the Sound must have the same number of channels.");
		}

		autoNUMmatrix<double> minv (1, thy numberOfColumns, 1, thy numberOfRows);
		NUMpseudoInverse (thy data, thy numberOfRows, thy numberOfColumns, minv.peek(), 0);
		autoSound him = Sound_create (thy numberOfColumns, my xmin, my xmax, my nx, my dx, my x1);
		for (long i = 1; i <= thy numberOfColumns; i++) {
			for (long j = 1; j <= my nx; j++) {
				double s = 0;
				for (long k = 1; k <= my ny; k++) {
					s += minv[i][k] * my z[k][j];
				}
				his z[i][j] = s;
			}
		}
		return him;
	} catch (MelderError) {
		Melder_throw (me, U": not unmixed.");
	}
}
Ejemplo n.º 19
0
void OccluderComponent::setVertices(const Vec3* begin, U count, U stride)
{
	ANKI_ASSERT(begin);
	ANKI_ASSERT(count > 0 && (count % 3) == 0);
	ANKI_ASSERT(stride >= sizeof(Vec3));

	m_begin = begin;
	m_count = count;
	m_stride = stride;

	Vec3 minv(MAX_F32), maxv(MIN_F32);
	while(count--)
	{
		const Vec3& v = *reinterpret_cast<const Vec3*>(reinterpret_cast<const U8*>(begin) + stride * count);
		for(U i = 0; i < 3; ++i)
		{
			minv[i] = min(minv[i], v[i]);
			maxv[i] = max(maxv[i], v[i]);
		}
	}

	m_aabb.setMin(minv.xyz0());
	m_aabb.setMax(maxv.xyz0());
}
Ejemplo n.º 20
0
function dialog_say(int dialog)
{
	if(dialogEntries[dialog].initialized == NULL) return;
	proc_kill(4);
	
	var soundID = -1;
	if(dialogEntries[dialog].sound != NULL)
	{
		soundID = snd_play(dialogEntries[dialog].sound, 100, 0);
	}
	set(dialogText, SHOW);
	(dialogText->pstring)[0] = dialogEntries[dialog].text;
	dialogText->alpha = 0;
	var timer = 32;
	while(timer > 0 || snd_playing(soundID))
	{
		dialogText->pos_x = 0.5 * screen_size.x;
		dialogText->pos_y = screen_size.y - 64;
		
		if(timer > 8)
		{
			dialogText->alpha = minv(100, dialogText->alpha + 12 * time_step);
		}
		else
		{
			dialogText->alpha = maxv(0, dialogText->alpha - 12 * time_step);
		}
		
		if(!snd_playing(soundID))
			timer -= time_step;
		
		wait(1);
	}
	reset(dialogText, SHOW);
	dialogText->alpha = 0;
}
Ejemplo n.º 21
0
//---------------------------------------------------------------------------
long double TMatrix::Inverse()
{
  if (sizeV != sizeH)
     throw Exception("Попытка обратить неквадратную матрицу!");
  return minv (mat, sizeV);
}
Ejemplo n.º 22
0
GraphData * ProcWave2Data(QString fname)
{
    SPTK_SETTINGS * sptk_settings = SettingsDialog::getSPTKsettings();

    QFile file(fname);
    file.open(QIODevice::ReadOnly);
    WaveFile * waveFile = waveOpenHFile(file.handle());
    qDebug() << "waveOpenFile" << LOG_DATA;

    int size = littleEndianBytesToUInt32(waveFile->dataChunk->chunkDataSize);
    qDebug() << "chunkDataSize" << LOG_DATA;
    short int bits = littleEndianBytesToUInt16(waveFile->formatChunk->significantBitsPerSample);
    qDebug() << "significantBitsPerSample" << LOG_DATA;

    vector wave = sptk_v2v(waveFile->dataChunk->waveformData, size, bits);
    qDebug() << "wave" << LOG_DATA;

    vector frame = sptk_frame(wave, sptk_settings->frame);
    qDebug() << "frame" << LOG_DATA;

    vector intensive = vector_intensive(frame, sptk_settings->frame->leng, sptk_settings->frame->shift);
    qDebug() << "intensive" << LOG_DATA;

    vector window = sptk_window(frame, sptk_settings->window);
    qDebug() << "window" << LOG_DATA;

    vector lpc = sptk_lpc(frame, sptk_settings->lpc);
    qDebug() << "lpc" << LOG_DATA;

    vector spec = sptk_spec(lpc, sptk_settings->spec);
    qDebug() << "spec " << maxv(spec) << LOG_DATA;

    vector spec_proc;
    if (sptk_settings->spec->proc == 0){
        spec_proc = vector_pow_log(spec, sptk_settings->spec->factor, sptk_settings->spec->min);
        qDebug() << "spec_log" << LOG_DATA;
    } else if (sptk_settings->spec->proc == 1){
        spec_proc = vector_pow_exp(spec, sptk_settings->spec->factor, sptk_settings->spec->min);
        qDebug() << "spec_exp" << LOG_DATA;
    }
    qDebug() << "spec_proc " << maxv(spec_proc) << LOG_DATA;

    vector pitch = processZeros(sptk_pitch_spec(wave, sptk_settings->pitch, intensive.x));
    qDebug() << "pitch" << LOG_DATA;

    vector mask = getFileMask(waveFile, wave, pitch.x);
    qDebug() << "mask" << LOG_DATA;

    vector pitch_cutted = processZeros(vector_cut_by_mask(pitch, mask));
    qDebug() << "pitch_cutted" << LOG_DATA;
    double pitch_min = getv(pitch_cutted, minv(pitch_cutted));
    double pitch_max = getv(pitch_cutted, maxv(pitch_cutted));

    vector intensive_cutted = vector_cut_by_mask(intensive, mask);
    qDebug() << "intensive_cutted" << LOG_DATA;

    vector inverted_mask = vector_invert_mask(mask);
    qDebug() << "inverted_mask" << LOG_DATA;

    vector pitch_interpolate = vector_interpolate_by_mask(
                pitch_cutted,
                inverted_mask,
                0,
                sptk_settings->plotF0->interpolation_type
                );
    qDebug() << "pitch_interpolate" << LOG_DATA;

    vector intensive_interpolate = vector_interpolate_by_mask(
                intensive_cutted,
                inverted_mask,
                0,
                sptk_settings->plotEnergy->interpolation_type
                );
    qDebug() << "intensive_interpolate" << LOG_DATA;

    vector pitch_mid = vector_smooth_mid(pitch_interpolate, sptk_settings->plotF0->frame);
    qDebug() << "pitch_mid" << LOG_DATA;

    vector intensive_mid = vector_smooth_lin(intensive_interpolate, sptk_settings->plotEnergy->frame);
    qDebug() << "intensive_mid" << LOG_DATA;

    vector norm_wave = normalizev(wave, 0.0, 1.0);

    MaskData md_p = getLabelsFromFile(waveFile, MARK_PRE_NUCLEUS);
    MaskData md_n = getLabelsFromFile(waveFile, MARK_NUCLEUS);
    MaskData md_t = getLabelsFromFile(waveFile, MARK_POST_NUCLEUS);

    vector p_mask = readMaskFromFile(waveFile, wave.x, MARK_PRE_NUCLEUS);
    qDebug() << "p_mask" << LOG_DATA;

    vector n_mask = readMaskFromFile(waveFile, wave.x, MARK_NUCLEUS);
    qDebug() << "n_mask" << LOG_DATA;

    vector t_mask = readMaskFromFile(waveFile, wave.x, MARK_POST_NUCLEUS);
    qDebug() << "t_mask" << LOG_DATA;

    vector p_wave = zero_to_nan(vector_cut_by_mask(norm_wave, p_mask));
    qDebug() << "p_mask" << LOG_DATA;

    vector n_wave = zero_to_nan(vector_cut_by_mask(norm_wave, n_mask));
    qDebug() << "n_mask" << LOG_DATA;

    vector t_wave = zero_to_nan(vector_cut_by_mask(norm_wave, t_mask));
    qDebug() << "t_mask" << LOG_DATA;

    vector pnt_mask = onesv(norm_wave.x);
    for (int i=0; i<p_mask.x && i<n_mask.x && i<t_mask.x && i<norm_wave.x; i++) {
        if (getv(p_mask, i) == 1 || getv(n_mask, i) == 1 || getv(t_mask, i) == 1)
        {
            setv(pnt_mask, i, 0);
        } else {
            setv(pnt_mask, i, 1);
        }
    }

    vector display_wave = zero_to_nan(vector_cut_by_mask(norm_wave, pnt_mask));

    freev(frame);
    freev(window);
    freev(lpc);
    freev(pitch_cutted);
    freev(intensive_cutted);
    freev(inverted_mask);
    freev(pitch_interpolate);
    freev(intensive_interpolate);
    freev(wave);
    qDebug() << "freev" << LOG_DATA;

    file.close();
    waveCloseFile(waveFile);
    qDebug() << "waveCloseFile" << LOG_DATA;

    GraphData * data = new GraphData();

    data->d_full_wave = norm_wave;
    data->d_wave = display_wave;
    data->d_p_wave = p_wave;
    data->d_n_wave = n_wave;
    data->d_t_wave = t_wave;
    data->d_pitch_original = pitch;
    data->d_pitch = pitch_mid;
    data->pitch_max = pitch_max;
    data->pitch_min = pitch_min;
    data->d_intensive_original = intensive;
    data->d_intensive = intensive_mid;
    data->d_spec_proc = spec_proc;
    data->d_spec = spec;
    data->d_mask = mask;
    data->p_mask = p_mask;
    data->n_mask = n_mask;
    data->t_mask = t_mask;
    data->pnt_mask = pnt_mask;

    data->md_p = md_p;
    data->md_t = md_t;
    data->md_n = md_n;

    return data;
}
Ejemplo n.º 23
0
// Scale object boundings to [-5,5]
void DXFRenderer::NormalizeEntities()
{
    // calculate current min and max boundings of object
    DXFVector minv(10e20f, 10e20f, 10e20f);
    DXFVector maxv(-10e20f, -10e20f, -10e20f);
    for (DXFEntityList::compatibility_iterator node = m_entities.GetFirst(); node; node = node->GetNext())
    {
        DXFEntity *p = node->GetData();
        if (p->type == DXFEntity::Line)
        {
            DXFLine *line = (DXFLine *)p;
            const DXFVector *v[2] = { &line->v0, &line->v1 };
            for (int i = 0; i < 2; ++i)
            {
                minv.x = mymin(v[i]->x, minv.x);
                minv.y = mymin(v[i]->y, minv.y);
                minv.z = mymin(v[i]->z, minv.z);
                maxv.x = mymax(v[i]->x, maxv.x);
                maxv.y = mymax(v[i]->y, maxv.y);
                maxv.z = mymax(v[i]->z, maxv.z);
            }
        } else if (p->type == DXFEntity::Face)
        {
            DXFFace *face = (DXFFace *)p;
            const DXFVector *v[4] = { &face->v0, &face->v1, &face->v2, &face->v3 };
            for (int i = 0; i < 4; ++i)
            {
                minv.x = mymin(v[i]->x, minv.x);
                minv.y = mymin(v[i]->y, minv.y);
                minv.z = mymin(v[i]->z, minv.z);
                maxv.x = mymax(v[i]->x, maxv.x);
                maxv.y = mymax(v[i]->y, maxv.y);
                maxv.z = mymax(v[i]->z, maxv.z);
            }
       }
    }

    // rescale object down to [-5,5]
    DXFVector span(maxv.x - minv.x, maxv.y - minv.y, maxv.z - minv.z);
    float factor = mymin(mymin(10.0f / span.x, 10.0f / span.y), 10.0f / span.z);
    for (DXFEntityList::compatibility_iterator node2 = m_entities.GetFirst(); node2; node2 = node2->GetNext())
    {
        DXFEntity *p = node2->GetData();
        if (p->type == DXFEntity::Line)
        {
            DXFLine *line = (DXFLine *)p;
            DXFVector *v[2] = { &line->v0, &line->v1 };
            for (int i = 0; i < 2; ++i)
            {
                v[i]->x -= minv.x + span.x/2; v[i]->x *= factor;
                v[i]->y -= minv.y + span.y/2; v[i]->y *= factor;
                v[i]->z -= minv.z + span.z/2; v[i]->z *= factor;
            }
        } else if (p->type == DXFEntity::Face)
        {
            DXFFace *face = (DXFFace *)p;
            DXFVector *v[4] = { &face->v0, &face->v1, &face->v2, &face->v3 };
            for (int i = 0; i < 4; ++i)
            {
                v[i]->x -= minv.x + span.x/2; v[i]->x *= factor;
                v[i]->y -= minv.y + span.y/2; v[i]->y *= factor;
                v[i]->z -= minv.z + span.z/2; v[i]->z *= factor;
            }
       }
    }
}
Ejemplo n.º 24
0
void Cost::minv(uchar* _data,cv::Mat& _minIndex,cv::Mat& _minValue){
    minv((float*)_data, _minIndex, _minValue);
}
Ejemplo n.º 25
0
int longest_palindrome_sub_string(char *str,unsigned int *lps,unsigned int *idx)
{
	if(!lps || !idx) {
		return 1;
	}

	unsigned int _len = strlen(str);
	if(_len == 0) {
		*lps = *idx = 0;
		return 0;
	}

	int len = _len * 2 + 1;

	char *s = (char*)malloc(len);
	if(!s) {
		return 1;
	}

	unsigned int *p = (unsigned int*)malloc(sizeof(unsigned int)*len);
	if(!p) {
		free(s);
		return 1;
	}
	memset(p,0,sizeof(unsigned int)*len);

	int i;
	for(i=0;i<_len;i++) {
		s[2*i] = '#';
		s[2*i+1] = str[i];
	}
	s[len-1] = '#';

	for(i=0;i<len;i++) {
		printf("%c ",s[i]);
	}
	printf("\n");

	unsigned int id = 0;
	unsigned int mx = 0;

	for(i=0;i<len;i++) {

		p[i] = mx>i?minv(p[2*id-i],mx-i):1;
		
		unsigned int lidx = i - p[i];
		unsigned int ridx = i + p[i];

		while(lidx >= 0 && ridx < len && s[lidx] == s[ridx]) {
			p[i]++;
			lidx = i - p[i];
			ridx = i + p[i];
		}

		if(i+p[i] > mx) {
			mx = i + p[i];
			id = i;
		}
	}

	unsigned int _idx = 0;
	unsigned int _lps = 0;

	for(i=0;i<len;i++) {
		if(p[i] > _lps) {
			_lps = p[i];
			_idx = i;
		}
		printf("%d ",p[i]);
	}
	printf("\n");

	*lps = _lps - 1;
	*idx = (_idx-_lps)/2 + 1;

	free(s);
	free(p);

	return 0;
}
Ejemplo n.º 26
0
void max_control ()
{
	maxLimit = maxv ( minLimit, maxLimit );
	nSlider = minv ( maxLimit, nSlider );
}
Ejemplo n.º 27
0
int matrixSelfInv(Mat m) {
	if(minv(m.m, m.row, m.row) == NULL) {
		return 1;
	}
	return 0;
}
Ejemplo n.º 28
0
/**
     \brief Invert (in place) a general real matrix A -> Inv(A).

     \param  a = array containing the input matrix A. This is converted to the inverse matrix.
     \param  n = dimension of the system (i.e. A is n x n )
     \return: 0 -> normal exit, 1 -> singular input matrix
*/
int G_math_minv(double **a,int n)
{
    return minv(a[0], n);
}
Ejemplo n.º 29
0
/*! \brief
 * Function that does the analysis for a single frame.
 *
 * It is called once for each frame.
 */
static int analyze_frame(t_topology *top, t_trxframe *fr, t_pbc *pbc,
              int nr, gmx_ana_selection_t *sel[], void *data)
{
    t_analysisdata      *d = (t_analysisdata *)data;
    t_electrostatics    dat;
    
    /* Print the current frame number to the xvg file */
    if (d->fp) {
        fprintf(d->fp, "%10i ", d->framen);
    }
    
    /* Index the pqr file to the frame number */
    std::string pqrname(d->pqr);
    pqrname = pqrname.substr(0,pqrname.size()-4);
    std::stringstream pqr;
    pqr << pqrname << d->framen << ".pqr";
    FILE *pqrout;
    if ( d->dopqr ) {
        pqrout = ffopen(pqr.str().c_str(), "w");
        if ( pqrout == NULL ) {
            gmx_fatal(FARGS, "\nFailed to open output file, '%s'\n",pqrout);
        }
    }
    
    /* Get the bond vector and bond midpoint */
    rvec bondvector, midpoint;
    rvec_sub(fr->x[d->a2],fr->x[d->a1],bondvector);
    double bondlength = pow( iprod(bondvector,bondvector), 0.5);
    for (int i=0; i<3; i++){
        midpoint[i] = fr->x[d->a1][i] + 0.5 * bondvector[i];
    }
    
    /* 
     * Defined axes based on the nitrile bond vector
     * The z-axis is the bond axis
     * The y-axis is from solving y0 = -(z1*y1+z2*y2)/z0, where (y1,y2)=(z2,-z0), then normalizing
     * The x-axis is the cross product of the y-axis with the z-axis
     */
    double zvec[3] = { bondvector[0] / bondlength, bondvector[1] / bondlength, bondvector[2] / bondlength };
    double yvec[3] = { 1, 1, 1 };
    if (zvec[0] != 0 ) {
        yvec[0] = -(zvec[1]*yvec[1]+zvec[2]*yvec[2]) / zvec[0] ; }
    else if (zvec[1] != 0 ) {
        yvec[1] = -(zvec[0]*yvec[0]+zvec[2]*yvec[2]) / zvec[1] ; }
    else if (zvec[2] != 0 ) {
        yvec[2] = -(zvec[0]*yvec[0]+zvec[1]*yvec[1]) / zvec[2] ; }
    else {
        std::cerr << "\nERROR! Bond length is 0!  This cannoy be correct!\n";
        std::cerr << "BondVEC: " << bondvector[0] << " " << bondvector[1] << " " << bondvector[2] << std::endl;
        std::cerr << "ZVEC: " << zvec[0] << " " << zvec[1] << " " << zvec[2] << std::endl;
    }
    /* Normalize */
    double ylen = pow(dot(yvec,yvec),0.5);
    for (int i=0; i<3;i++) {
        yvec[i] = yvec[i]/ylen;
    }
    double xvec[3];
    cross(yvec,zvec,xvec);
    double xlen = pow(dot(xvec,xvec),0.5);
    for (int i=0; i<3;i++) {
        xvec[i] = xvec[i]/xlen;
    }
    
    /* Find the points that are Cho group-sites for calculating the potential */
    std::vector<std::vector<double> > each_point;
    int nsites = 0;
    if (d->site_ndx.size() > 0) {
        /* 
         * There are 8 sites from -a1, 8 sites from -a2, 1 site along the bond vector
         * and 1 site for each atom in site_ndx
         */
        nsites = d->site_ndx.size() + 17;
        int n = 0;
        each_point = std::vector<std::vector<double> > (nsites, std::vector<double> (3,0));
        //std::vector<std::vector<double> > each_point(nsites,std::vector<double> (3,0));
        /* Assign coordinates for the atoms in site_ndx */
        for (int i=0; i<(int)d->site_ndx.size(); i++) {
            for (int j=0; j<3; j++) {
                each_point[n][j] = fr->x[d->site_ndx[i]][j];
            }
            n++;
        }
        /* Assign coordinate for the site along the bond vector */
        for (int i=0; i<3; i++) {
            each_point[n][i] = fr->x[d->a2][i] + bondvector[i] / bondlength * d->ring_dist;
        }
        n++;
        /* 8 points around -a1 */
        ring_points( fr->x[d->a1], &xvec[0], &yvec[0], &zvec[0], d->ring_dist, each_point,n);
        /* 8 points around -a2 */
        ring_points( fr->x[d->a2], &xvec[0], &yvec[0], &zvec[0], d->ring_dist, each_point,n);
        std::vector<double> minv(3,10);
        std::vector<double> maxv(3,-10);
    }
    
    /* Find the dummy atom points */
    /* midpoint xyz vectors */
    double pzcomp[3], nzcomp[3], pycomp[3], nycomp[3], pxcomp[3], nxcomp[3];
    /* -a1 xyz vectors */
    double pzcomp1[3], nzcomp1[3], pycomp1[3], nycomp1[3], pxcomp1[3], nxcomp1[3];
    /* -a2 xyz vectors */
    double pzcomp2[3], nzcomp2[3], pycomp2[3], nycomp2[3], pxcomp2[3], nxcomp2[3];

    for (int i=0; i<3; i++) {
        /* midpoint xyz vectors */
        pzcomp[i] = midpoint[i] + zvec[i] * d->delta;
        nzcomp[i] = midpoint[i] - zvec[i] * d->delta;
        pycomp[i] = midpoint[i] + yvec[i] * d->delta;
        nycomp[i] = midpoint[i] - yvec[i] * d->delta;
        pxcomp[i] = midpoint[i] + xvec[i] * d->delta;
        nxcomp[i] = midpoint[i] - xvec[i] * d->delta;
        /* -a1 xyz vectors */
        pzcomp1[i] = fr->x[d->a1][i] + zvec[i] * d->delta;
        nzcomp1[i] = fr->x[d->a1][i] - zvec[i] * d->delta;
        pycomp1[i] = fr->x[d->a1][i] + yvec[i] * d->delta;
        nycomp1[i] = fr->x[d->a1][i] - yvec[i] * d->delta;
        pxcomp1[i] = fr->x[d->a1][i] + xvec[i] * d->delta;
        nxcomp1[i] = fr->x[d->a1][i] - xvec[i] * d->delta;
        /* -a2 xyz vectors */
        pzcomp2[i] = fr->x[d->a2][i] + zvec[i] * d->delta;
        nzcomp2[i] = fr->x[d->a2][i] - zvec[i] * d->delta;
        pycomp2[i] = fr->x[d->a2][i] + yvec[i] * d->delta;
        nycomp2[i] = fr->x[d->a2][i] - yvec[i] * d->delta;
        pxcomp2[i] = fr->x[d->a2][i] + xvec[i] * d->delta;
        nxcomp2[i] = fr->x[d->a2][i] - xvec[i] * d->delta;
    }

    /* Write all the dummy atoms to the pqr file */
    if ( d->dopqr ) {
        write_dummy_atom( pqrout, nzcomp, "MIDz" );
        write_dummy_atom( pqrout, pzcomp, "MIDz" );
        write_dummy_atom( pqrout, nycomp, "MIDy" );
        write_dummy_atom( pqrout, pycomp, "MIDy" );
        write_dummy_atom( pqrout, nxcomp, "MIDx" );
        write_dummy_atom( pqrout, pxcomp, "MIDx" );
    
        write_dummy_atom( pqrout, nzcomp1, (std::string)*top->atoms.atomname[d->a1]+"z" );
        write_dummy_atom( pqrout, pzcomp1, (std::string)*top->atoms.atomname[d->a1]+"z" );
        write_dummy_atom( pqrout, nycomp1, (std::string)*top->atoms.atomname[d->a1]+"y" );
        write_dummy_atom( pqrout, pycomp1, (std::string)*top->atoms.atomname[d->a1]+"y" );
        write_dummy_atom( pqrout, nxcomp1, (std::string)*top->atoms.atomname[d->a1]+"x" );
        write_dummy_atom( pqrout, pxcomp1, (std::string)*top->atoms.atomname[d->a1]+"x" );
    
        write_dummy_atom( pqrout, nzcomp2, (std::string)*top->atoms.atomname[d->a2]+"z" );
        write_dummy_atom( pqrout, pzcomp2, (std::string)*top->atoms.atomname[d->a2]+"z" );
        write_dummy_atom( pqrout, nycomp2, (std::string)*top->atoms.atomname[d->a2]+"y" );
        write_dummy_atom( pqrout, pycomp2, (std::string)*top->atoms.atomname[d->a2]+"y" );
        write_dummy_atom( pqrout, nxcomp2, (std::string)*top->atoms.atomname[d->a2]+"x" );
        write_dummy_atom( pqrout, pxcomp2, (std::string)*top->atoms.atomname[d->a2]+"x" );
    
        if (d->site_ndx.size() > 0) {
            for (int i=0; i<nsites; i++) {
                std::stringstream key;
                key << "p" << i;
                write_dummy_atom( pqrout, &each_point[i][0], key.str());
            }
        }
    }
    
    /* Initialize all the electrostatics, since they are the result of summing parts */
    int nexclude = d->exclude_ndx.size();
    dat.field_proj_total = 0.0f;
    dat.field_proj_each_exclude = std::vector<double> (nexclude,0.0f);
    dat.field_each_exclude = std::vector<std::vector<double> > (nexclude, std::vector<double> (3,0));
    dat.field_proj_exclude = 0.0f;
    for (int i=0; i<3; i++){
        dat.field_exclude[i] = 0.0f;
        dat.field_mid[i] = 0.0f;
        dat.field_a1[i] = 0.0f;
        dat.field_a2[i] = 0.0f;
    }
    dat.protein_site = std::vector<double> (nsites, 0.0f);
    dat.water_site = std::vector<double> (nsites, 0.0f);
    
    int g = 0;
    int nresidues = top->atoms.atom[sel[g]->g->index[sel[g]->p.nr]].resind;
    std::vector<float> field_per_residue (nresidues,0.0f);
    
    int nwater=0;
    /* Loop through everything */
    for (int g = 0; g < nr; ++g) { // for each group
        if (g > 1) {
            fprintf(stderr,"\nWarning: More than 1 group was specified.  Cowardly ignoring all additional groups\n");
            break;
        }
        for (int i = 0; i < sel[g]->p.nr; ++i) { // for each atom in the group
            int atom_ndx = sel[g]->g->index[i]; // how we get to the atom index
            /* Get .dat parameters and write the atom to the .pqr file */
            int resid = top->atoms.atom[atom_ndx].resind;
            double charge = top->atoms.atom[atom_ndx].q;
            char *atomname = *top->atoms.atomname[atom_ndx];
            char *resname = *top->atoms.resinfo[resid].name;
            double radius = -1;
            int namber = d->amber.size();
            for (int j=0; j<namber; j++) {
                if (d->bVerbose) {
                    fprintf(stderr, "\nTrying to match: %s %s to %s (%d/%d)", resname, *top->atoms.atomtype[atom_ndx], d->amber[j].ambername, j, namber);
                }
                if ( strncmp(*top->atoms.atomtype[atom_ndx], d->amber[j].ambername, strlen(*top->atoms.atomtype[atom_ndx])+1) == 0 ) {
                    radius = d->amber[j].radius;
                    if (d->bVerbose) {
                        fprintf(stderr,"\nMatched %s on %s to %s! (%d/%d)",resname, *top->atoms.atomtype[atom_ndx], d->amber[j].ambername, j, namber);
                    }
                    break;
                }
            }
            if (radius < 0) {
                fprintf(stderr,"\nError: Frame %d, could not match %s %s %s %i\n",d->framen, atomname, resname, *top->atoms.atomtype[atom_ndx],i+1);
                std::exit(1);
            }
            if ( d->dopqr ) {
                fprintf(pqrout,"ATOM %6i %4s %4s %5i %11.3f %7.3f %7.3f %7.4f %7.3f\n",atom_ndx+1,atomname,resname,resid+1,fr->x[atom_ndx][XX]*10,fr->x[atom_ndx][YY]*10,fr->x[atom_ndx][ZZ]*10,charge,radius);
            }
            /* Do the field calculations now */
            bool keepAtom = true;
            std::vector<double> anatom (3,0.0f);
            calculate_field(midpoint, atom_ndx, *top, *fr, &anatom[0], 1);
            for (int j=0; j<nexclude; j++) {
                if (atom_ndx == d->exclude_ndx[j]) {
                    keepAtom = false;
                    break;
                }
            }
            if (keepAtom) {
                field_per_residue[resid] += d->rpdie * project_field(bondvector,&anatom[0]);
            }
            for (int j=0; j<3; j++) {
                dat.field_mid[j] += anatom[j];
            }
            /* Get the field due to each excluded atom */
            keepAtom = true;
            for (int j=0; j<nexclude ; j++) {
                if (atom_ndx == d->exclude_ndx[j]) {
                    calculate_field(midpoint, d->exclude_ndx[j], *top, *fr, &dat.field_each_exclude[j][0], 1);
                    keepAtom = false;
                    break;
                }
            }
            if (keepAtom) {
                calculate_field(midpoint, atom_ndx, *top, *fr, dat.field_exclude, 1);
                calculate_field(fr->x[d->a1], atom_ndx, *top, *fr, dat.field_a1, 1);
                calculate_field(fr->x[d->a2], atom_ndx, *top, *fr, dat.field_a2, 1);
            }
            //d->field_per_residue[resid] += d->rpdie * project_field(
            /* Do the potential calculations now */
            /* We want to exclude atoms at the sites */
            /* We are also going to exclude atoms in the exclude group */
            if ((int)d->site_ndx.size() > 0) {
                if (keepAtom) {
                    for (int j=0; j<(int)d->site_ndx.size(); j++) {
                        if (atom_ndx == d->site_ndx[j] ) {
                            keepAtom = false;
                            break;
                        }
                    }
                }
                if (keepAtom) {
                    if (strncmp("SOL", resname, sizeof(resname)+1) == 0 ||
                        strncmp("HOH", resname, sizeof(resname)+1) == 0 ) {
                        for (int j=0; j<nsites; j++) {
                            double r = calculate_r( &each_point[j][0], atom_ndx, *top, *fr);
                            dat.water_site[j] += calculate_potential( r, atom_ndx, *top, *fr);
                        }
                        nwater++;
                    }
                    else {
                        for (int j=0; j<nsites; j++) {
                            double r = calculate_r( &each_point[j][0], atom_ndx, *top, *fr);
                            dat.protein_site[j] += calculate_potential( r, atom_ndx, *top, *fr);
                        }
                    }
                }
            }
        }
    }
    
    /* Write all output to xvg file */
    if (d->fp) {
        fprintf(d->fp, "%.6e ", d->rpdie * project_field(bondvector, dat.field_mid));
        for (int i=0; i<nexclude; i++) {
            fprintf(d->fp, "%.6e ", d->rpdie * project_field(bondvector, &dat.field_each_exclude[i][0]));
        }
        fprintf(d->fp, "%.6e ", d->rpdie * project_field(bondvector, dat.field_exclude));

        fprintf(d->fp, "%.6e ", d->rpdie * project_field(xvec,dat.field_exclude));
        fprintf(d->fp, "%.6e ", d->rpdie * project_field(yvec,dat.field_exclude));
        fprintf(d->fp, "%.6e ", d->rpdie * project_field(zvec,dat.field_exclude));

        fprintf(d->fp, "%.6e ", d->rpdie * project_field(xvec,dat.field_a1));
        fprintf(d->fp, "%.6e ", d->rpdie * project_field(yvec,dat.field_a1));
        fprintf(d->fp, "%.6e ", d->rpdie * project_field(zvec,dat.field_a1));
        
        fprintf(d->fp, "%.6e ", d->rpdie * project_field(xvec,dat.field_a2));
        fprintf(d->fp, "%.6e ", d->rpdie * project_field(yvec,dat.field_a2));
        fprintf(d->fp, "%.6e ", d->rpdie * project_field(zvec,dat.field_a2));
        
        if ((int)d->site_ndx.size() > 0) {
            for (int i=0; i<nsites; i++) {
                fprintf(d->fp, "%.6e %.6e ", d->rpdie * dat.protein_site[i], d->rpdie * dat.water_site[i]);
            }
        }
        fprintf(d->fp, "\n");
    }

    /* close the pqr file */
    if ( d->dopqr ) {
        fclose(pqrout);
    }
    
    /* Print the current frame number to the xvg file */
    if (d->fpr) {
        fprintf(d->fpr, "%10i ", d->framen);
        for (int i=0;i<nresidues;i++) {
            fprintf(d->fpr,"%12.6e ",field_per_residue[i]);
        }
        fprintf(d->fpr,"\n");
    }

    
    /* increment the frame number */
    d->framen++;
    /* We need to return 0 to tell that everything went OK */
    return 0;
}
Ejemplo n.º 30
0
// from mSelfInv.c
int selfInv(ARMat *m) {
	if (minv(m->m, m->row, m->row) == NULL)
		return -1;

	return 0;
}