[img]C:\Documents and Settings\All Users\Documents\My Pictures\示例图片\Sunset.jpg[/img]从国外一个网站上抄来的,是用C+SDK写的,惭愧看不大懂,转成D版本先:
运行时截图:
module flower;
import std.stdio;
import std.string;
import std.conv;
import std.math;
import std.algorithm;
import core.runtime;
//import core.stdc.math;
import win32.windows;
import samsTools.utils:toCstring;
const double Pi=3.1415926;
static TCHAR[256] szAppName=cast(char[256])"flower";
static const char[256] caption=cast(char[256])"SDK Flower Example";
int xo=320,yo=860;
int r=0,g=0,b=0;
HDC hddc;
float alfa0,beta0,gamma0,Riduzione;
struct elem2 { float x; float y; };
struct elem3 { float x; float y; float z; };
float sen (float r)
{ return sin(r); }
int Round (float nf)
{ int k;
float t,f;
k=cast(int)nf; t=cast(float)k;
f=nf-t;
if (f>0.50) k++;
if (f<-0.50) k--;
return k;
}
void putpixel (int x,int y)
{
SetPixel(hddc,x,y,RGB(cast(ubyte)r,cast(ubyte)g,cast(ubyte)b));
}
void setcolor (int col)
{ if (col==15) {r=0;g=0;b=255;}
if (col==14) {r=255;g=0;b=0;}
if (col==13) {r=0;g=255;b=0;}
if (col==12) {r=255;g=0;b=0;}
if (col==11) {r=0;g=255;b=255;}
if (col==10) {r=0;g=255;b=0;}
if (col==9) {r=0;g=0;b=255;}
if (col==8) {r=255;g=0;b=0;}
if (col==7) {r=0;g=100;b=0;}
}
void swap(int *a, int *b)
{ int t;
t=*b; *b=*a; *a=t;
}
void dasline (int x1,int y1,int x2,int y2)
{ int x,dx,incx;
int y,dy,incy;
int s,i,pxy,sw;
dx=abs(x2-x1);
dy=abs(y2-y1);
if (x1>x2) incx=-1; else incx=1;
if (y1>y2) incy=-1; else incy=1;
if (dy>dx) { swap(&dx,&dy); swap(&incx,&incy); swap(&x1,&y1); sw=1; }
else sw=0;
pxy=dx;
dx=dx-dy;
s=dy;
x=x1; y=y1;
if (sw) putpixel(y,x); else putpixel(x,y);
for (i=0;i<pxy;i++)
{ x+=incx;
if (s>0) {s-=dx; y+=incy;} else {s+=dy;}
if (sw) putpixel(y,x); else putpixel(x,y);
}
}
void RAss (elem3 *Vt, float xo, float yo, float zo,
float alfa,float beta,float gamma)
{ float x2,y2,z2,x1,y1,z1,x,y,z;
x2=Vt.x ; y2=Vt.y ; z2=Vt.z ;
x1=x2*cos(gamma)-z2*sen(gamma);
z1=x2*sen(gamma)+z2*cos(gamma);
z=z1*cos(beta)-y2*sen(beta)+zo;
y1=z1*sen(beta)+y2*cos(beta);
x=x1*cos(alfa)-y1*sen(alfa)+xo;
y=x1*sen(alfa)+y1*cos(alfa)+yo;
Vt.x=x; Vt.y=y; Vt.z=z;
}
void Rids (elem3 *vt3,elem2 *vt2)
{ float fi,yp;
vt2.x=-vt3.z*sen(Pi/4)+vt3.x*cos(Pi/4);
fi=0.5;
yp=-vt3.x*sen(fi)+vt3.y*cos(fi);
vt2.y=-vt3.z*sen(fi)+yp*cos(fi);
}
void Co(elem2 *vp, elem2 *vf)
{ int X1,X2,Y1,Y2;
X1=xo+cast(int)(vp.x); Y1=yo-cast(int)(vp.y);
X2=xo+cast(int)(vf.x); Y2=yo-cast(int)(vf.y);
dasline(X1,Y1,X2,Y2);
}
void Disegna (float R,float Xo,float Yo,float Zo,
float alfa,float beta,float gamma)
{ int i;
elem2 V2[3];
elem3 V3[3];
V3[1].x=0 ; V3[1].y=R ; V3[1].z=0 ;
V3[2].x=0 ; V3[2].y=0 ; V3[2].z=0;
for (i=1;i<3;i++) RAss (&V3[i],Xo,Yo,Zo,alfa,beta,gamma);
for (i=1;i<3;i++) Rids (&V3[i],&V2[i]);
Co (&V2[1],&V2[2]);
}
void Frattale (int n, float R,float Xrif,float Yrif,float Zrif,
float Rifa,float Rifb,float Rifg)
{ int rip;
float R1,PasAlfa,PasBeta,PasGamma;
elem3 pv;
elem3 V3[3];
if (n<9)
{ V3[1].x=0 ; V3[1].y=R ; V3[1].z=0 ;
V3[2].x=R ; V3[2].y=0 ; V3[2].z=0;
R1=R/Riduzione;
for (rip=1;rip<4;rip++)
{ pv.x=V3[1].x; pv.y=V3[1].y; pv.z=V3[1].z;
switch (rip)
{ case 1 : PasAlfa=Rifa+alfa0; PasBeta=Rifb+beta0;
PasGamma=Rifg+gamma0;
break;
case 2 : PasAlfa=Rifa-alfa0; PasBeta=Rifb-beta0;
PasGamma=Rifg-gamma0;
break;
case 3 : PasAlfa=Rifa+alfa0; PasBeta=Rifb-beta0;
PasGamma=Rifg-gamma0;
}
if (n<2) setcolor(10);
if ((n>1) && (n<8)) setcolor(15);
if (n==8) setcolor(12);
RAss (&pv,Xrif,Yrif,Zrif,Rifa,Rifb,Rifg);
Disegna(R1,pv.x,pv.y,pv.z,PasAlfa,PasBeta,PasGamma);
Frattale(n+1,R1,pv.x,pv.y,pv.z,PasAlfa,PasBeta,PasGamma);
}
}
}
void fracto()
{
setcolor(10);
Riduzione=2.0; alfa0=-0.3; beta0=0.2; gamma0=0.1;
Frattale(0,500,0,0,0,0,0,0);
}
extern(Windows)
int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
//initialize D runtime
Runtime.initialize;
runModuleUnitTests;
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=&WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(null,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(null,IDC_ARROW);
wndclass.hbrBackground=cast(HBRUSH)(COLOR_3DFACE+1);//GetStockObject(WHITE_BRUSH)
wndclass.lpszMenuName=null;
wndclass.lpszClassName=cast(const(char*))szAppName;
if(! RegisterClass(&wndclass))
{
MessageBox(null,toCstring("Program requires Windows NT!"),
cast(char*)szAppName,MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(szAppName.ptr,caption.ptr,
WS_OVERLAPPEDWINDOW/*|WS_VSCROLL|WS_HSCROLL*/,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
null,null,hInstance,null);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,null,0,0)>0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//dispose D runtime:
Runtime.terminate;
return msg.wParam;
}
extern(Windows)
LRESULT WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(message)
{
case WM_CREATE:
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
hddc=hdc;
fracto();
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_CLOSE:
PostMessage(null,WM_QUIT,0,0);
break;
default:
break;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
运行时截图: