Archivo:Dyadic trans.gif

Contenido de la página no disponible en otros idiomas.
De Wikipedia, la enciclopedia libre

Dyadic_trans.gif(300 × 300 píxeles; tamaño de archivo: 114 kB; tipo MIME: image/gif)

Resumen

Descripción Dyadic transformation xy plot
Fecha
Fuente Trabajo propio
Autor Claudio Rocchini
Permiso
(Reutilización de este archivo)
own work, attribution required

Source Code

/*****************************
 * Dyadic transformation Plot
 * (C)2010 Claudio Rocchini
 * claudio@rockini.name
 *****************************/

#include <stdio.h>
#include <assert.h>
#include <vector>
#include <set>

typedef unsigned char byte;

class image {			// image definition
public:
	byte * mbuf;		// Image memory
	int    dimx,dimy;	// Image size
	 image( int ndimx, int ndimy ) : dimx(ndimx),dimy(ndimy) {
		 mbuf = new byte[dimx*dimy*3];
		 memset(mbuf,255,dimx*dimy*3);
	 }
	~image() { delete[] mbuf; }
	bool save_ppm( const char * filename ) const {
		FILE * f = fopen(filename,"wb"); if(f==0) return false;
		fprintf(f,"P6\n%d %d\n255\n",dimx,dimy);
		fwrite(mbuf,3,dimx*dimy,f);
		fclose(f);
		return true;
	}
	void set_black_pixel( int x, int y, double trasp )
	{
		if(x<0 || x>=dimx) return; if(y<0 || y>=dimy) return;
		byte * p = mbuf+3*(x+y*dimx);
		p[0] = byte(p[0]*(1-trasp) /*+ (trasp)*0*/);
		p[1] = byte(p[1]*(1-trasp) /*+ (trasp)*0*/);
		p[2] = byte(p[2]*(1-trasp) /*+ (trasp)*0*/);
	}
	void dot( double x, double y, double trasp )	// float precision put pixel
	{
		int ix = int(x); double rx = x-ix;
		int iy = int(y); double ry = y-iy;
		set_black_pixel(ix+0,iy+0,trasp*(1-rx)*(1-ry));
		set_black_pixel(ix+1,iy+0,trasp*(  rx)*(1-ry));
		set_black_pixel(ix+0,iy+1,trasp*(1-rx)*(  ry));
		set_black_pixel(ix+1,iy+1,trasp*(  rx)*(  ry));
	}
};

	// rational definition
typedef __int64 bigint;

bigint gcd(bigint m, bigint n) {
	while (n != 0){
		bigint t = m % n;
		m = n; n = t;
	}
	return m;
}

class rational {
public:
	bigint p,q;

	rational(){}
	rational( int np, int nq ) { p=np; q=nq; normalize(); }
	bool operator< ( const rational & x ) const { return p*x.q < q*x.p; }
	void normalize()  { bigint g = gcd(p,q); p /= g; q /= g; }
	void doubled()    {
		if( q%2==0 ) { assert(q!=1);        q /= 2; }		// assert for overflow checking
		else         { assert(p< (1<<30) ); p *= 2; }
	}
	void modulo()     { while( p >= q ) p -= q; normalize(); }
	operator double() { return double(p)/q; }
};

int main() {
	const int SX = 600;
	const int SY = 600;
	image im(SX,SY);
	std::set< rational > ss;					// fraction done
	for(int i=2;i<150;++i) {					// enumerate the fractions
		for(int j=1;j<i;++j) {
			rational w(j,i);				// current start fractions
			if( ss.find(w)!=ss.end() ) continue;		// just do it!
			ss.insert(w);
			double xx = SX*w;
			std::set< rational > tt;			// row set
			for(;;){
				if( tt.find(w)!=tt.end() ) break;	// just do it: is a loop
				tt.insert(w);
				double yy = SX*w;
				im.dot(xx,yy,0.5);			// dot this value
				w.doubled();				// ww = (w*2) mod 1
				w.modulo();
			}
		}
	}
	im.save_ppm("c:\\temp\\dyadic.ppm");
	return 0;
}

Licencia

Yo, titular de los derechos de autor de esta obra, la publico en los términos de las siguientes licencias:
GNU head Se autoriza la copia, distribución y modificación de este documento bajo los términos de la licencia de documentación libre GNU, versión 1.2 o cualquier otra que posteriormente publique la Fundación para el Software Libre; sin secciones invariables, textos de portada, ni textos de contraportada. Se incluye una copia de la dicha licencia en la sección titulada Licencia de Documentación Libre GNU.
w:es:Creative Commons
atribución compartir igual
Este archivo se encuentra bajo la licencia Creative Commons Genérica de Atribución/Compartir-Igual 3.0.
Eres libre:
  • de compartir – de copiar, distribuir y transmitir el trabajo
  • de remezclar – de adaptar el trabajo
Bajo las siguientes condiciones:
  • atribución – Debes otorgar el crédito correspondiente, proporcionar un enlace a la licencia e indicar si realizaste algún cambio. Puedes hacerlo de cualquier manera razonable pero no de manera que sugiera que el licenciante te respalda a ti o al uso que hagas del trabajo.
  • compartir igual – En caso de mezclar, transformar o modificar este trabajo, deberás distribuir el trabajo resultante bajo la misma licencia o una compatible como el original.
Esta etiqueta de licencia fue agregada a este archivo como parte de la actualización de la licencia GFDL.
w:es:Creative Commons
atribución
Este archivo está disponible bajo la licencia Creative Commons Reconocimiento 2.5 Genérica.
Eres libre:
  • de compartir – de copiar, distribuir y transmitir el trabajo
  • de remezclar – de adaptar el trabajo
Bajo las siguientes condiciones:
  • atribución – Debes otorgar el crédito correspondiente, proporcionar un enlace a la licencia e indicar si realizaste algún cambio. Puedes hacerlo de cualquier manera razonable pero no de manera que sugiera que el licenciante te respalda a ti o al uso que hagas del trabajo.
Puedes usar la licencia que prefieras.

Leyendas

Añade una explicación corta acerca de lo que representa este archivo

Elementos representados en este archivo

representa a

Historial del archivo

Haz clic sobre una fecha y hora para ver el archivo tal como apareció en ese momento.

Fecha y horaMiniaturaDimensionesUsuarioComentario
actual13:02 12 dic 2006Miniatura de la versión del 13:02 12 dic 2006300 × 300 (114 kB)Rocchini{{Information| |Description=Dyadic transformation xy plot |Source=Own work |Date=2006-12-12 |Author=Claudio Rocchini |Permission=own work, attribution required }}

La siguiente página usa este archivo:

Uso global del archivo

Las wikis siguientes utilizan este archivo: