Archivo:Dyadic trans.gif
Dyadic_trans.gif (300 × 300 píxeles; tamaño de archivo: 114 kB; tipo MIME: image/gif)
Este es un archivo de Wikimedia Commons, un depósito de contenido libre hospedado por la Fundación Wikimedia. Más abajo se reproduce su página de descripción con la información sobre su origen y licencia. |
Resumen
DescripciónDyadic trans.gif | 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:
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.http://www.gnu.org/copyleft/fdl.htmlGFDLGNU Free Documentation Licensetruetrue |
Este archivo se encuentra bajo la licencia Creative Commons Genérica de Atribución/Compartir-Igual 3.0. | ||
| ||
Esta etiqueta de licencia fue agregada a este archivo como parte de la actualización de la licencia GFDL.http://creativecommons.org/licenses/by-sa/3.0/CC BY-SA 3.0Creative Commons Attribution-Share Alike 3.0truetrue |
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.
Elementos representados en este archivo
representa a
12 dic 2006
Historial del archivo
Haz clic sobre una fecha y hora para ver el archivo tal como apareció en ese momento.
Fecha y hora | Miniatura | Dimensiones | Usuario | Comentario | |
---|---|---|---|---|---|
actual | 13:02 12 dic 2006 | 300 × 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 }} |
Usos del archivo
La siguiente página usa este archivo:
Uso global del archivo
Las wikis siguientes utilizan este archivo:
- Uso en en.wikipedia.org
- Uso en fr.wikipedia.org
Obtenido de «https://es.wikipedia.org/wiki/Archivo:Dyadic_trans.gif»