This is MaView.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "MaView.h" #import <dpsclient/wraps.h> #include <math.h> #include <stdlib.h> #import <dpsclient/dpsclient.h> @implementation MaView #define DESSINE 1 #define EFFACE 0 -initFrame:(const NXRect *) framerect { [super initFrame:framerect]; action = EFFACE ; return self; } - (int) dessine:(int)nombre:(int)nbrIter:(int)coul:(float ) p:(float *)abscisses: (float *)ordonnees { int k,m,mg; float xx[NBRMAX],yy[NBRMAX]; if( nombre == 0 ) return 0 ; couleur = coul; pas_de_calcul = p; nombre_de_souris = nombre ; if (nbrIter>NBRITER) nombre_iterations = NBRITER ; else nombre_iterations = nbrIter; for( m=0 ; m<nombre ; m++ ) { souris[m][0].x = abscisses[m]; souris[m][0].y = ordonnees[m]; } for( k=0 ; k<nbrIter ; k++ ) { for (m=0;m<nombre;m++) { mg = (m+1) % nombre; xx[m] = souris[m][k].x+p*(souris[mg][k].x-souris[m][k].x); yy[m] = souris[m][k].y+p*(souris[mg][k].y-souris[m][k].y); } for (m=0;m<nombre;m++) { souris[m][k+1].x = xx[m]; souris[m][k+1].y = yy[m]; } } action = DESSINE ; [self display]; return nombre; } - efface:sender { action = EFFACE ; nombre_de_souris = 0; [self display]; return self; } -drawSelf:(NXRect *)rects :(int)rectCount { float maxX , maxY ; float minX , minY ; float coefX , coefY ; int i,k; float X,Y,Z,inverse; float rougeDebut, vertDebut, bleuDebut; float rougeFin, vertFin, bleuFin; float r,v,b; NXConvertColorToRGB([couleurFond color],&rougeFin,&vertFin,&bleuFin); PSsetrgbcolor(rougeFin, vertFin, bleuFin); NXRectFill(&bounds); if( action == DESSINE ) { maxX = minX = souris[0][0].x ; maxY = minY = souris[0][0].y ; for (k=0;k<nombre_de_souris;k++) { for( i=0 ; i<nombre_iterations ; i++ ) { if( souris[k][i].x < minX ) minX = souris[k][i].x ; else if( souris[k][i].x > maxX ) maxX= souris[k][i].x ; if( souris[k][i].y < minY ) minY = souris[k][i].y ; else if( souris[k][i].y > maxY ) maxY = souris[k][i].y ; } } if (fabs(coefX = fabs(maxX - minX)) < 1e-6) coefX = 1.0; if (fabs(coefY = fabs(maxY - minY)) < 1e-6) coefY = 1.0; printf("%f,%f\n", NX_WIDTH(&bounds) ,NX_HEIGHT(&bounds)); NXConvertColorToRGB([couleurFin color],&rougeFin,&vertFin,&bleuFin); NXConvertColorToRGB([couleurDebut color],&rougeDebut,&vertDebut,&bleuDebut); r = (rougeFin-rougeDebut)/nombre_iterations; v = (vertFin-vertDebut)/nombre_iterations; b = (bleuFin-bleuDebut)/nombre_iterations; inverse = 1.0/(float)nombre_iterations; PSsetlinewidth(1.0); for (k=0;k<nombre_de_souris;k++) { X = (souris[k][0].x-minX)* NX_WIDTH(&bounds) / coefX; Y = (souris[k][0].y-minY)* NX_HEIGHT(&bounds) / coefY; for( i=1 ; i<nombre_iterations ; i++) { switch(couleur) { case 1: Z = 1.0-pow((float)i*inverse,0.166666666); PSsetgray(Z); break; case 2: Z = pow((float)i*inverse,3.0); PSsetgray(Z); break; case 3 : PSsetrgbcolor(rougeDebut+r*i,vertDebut+v*i,bleuDebut+b*i); break; default: PSsetgray(NX_WHITE); } PSnewpath(); PSmoveto(X,Y); X = (souris[k][i].x-minX)* NX_WIDTH(&bounds) / coefX; Y = (souris[k][i].y-minY)* NX_HEIGHT(&bounds) / coefY; PSlineto( X , Y ) ; PSstroke(); } } } else { } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.