`
betty_betty2008
  • 浏览: 24892 次
  • 性别: Icon_minigender_1
  • 来自: 东莞
最近访客 更多访客>>
社区版块
存档分类
最新评论

SDK写的一个画树(花)程序

    博客分类:
  • D
阅读更多
[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);
}



运行时截图:
  • 大小: 86.8 KB
分享到:
评论

相关推荐

    基于SDK的树形控件演示程序

    标题中的“基于SDK的树形控件演示程序”是指一个使用软件开发工具包(SDK)创建的示例项目,该程序展示了如何在应用程序中实现和操作树形控件。树形控件是一种常见的用户界面元素,它允许用户以层级结构显示数据,常...

    windows sdk 象棋

    《Windows SDK与象棋程序开发》 ...通过以上步骤,我们可以利用Windows SDK构建一个功能完善的象棋游戏。尽管过程可能复杂,但Windows SDK提供的丰富资源和工具将极大地助力开发者,使项目得以顺利完成。

    ExtJS 7.6 SDK trial

    ExtJS 是一个流行的JavaScript框架,用于构建富客户端的Web应用程序。它提供了丰富的用户界面组件、数据绑定机制和强大的API,使开发者能够创建功能强大的、响应式的桌面和移动应用。7.6版本是ExtJS的一个重要更新,...

    FBX-Loader-OpenGL-C-:使用 glut lib 和 fbx SDK 加载带有动画(opengl c++)的 3D 模型 FBX 文件。

    我们需要解析这些数据,构建一个骨骼树,然后在每一帧根据动画数据更新每个骨骼的变换矩阵。这一步通常通过计算关节之间的相对变换并应用到相应的OpenGL模型矩阵来实现。为了在OpenGL中播放动画,需要在每一帧调用...

    SpeedTree 4.1 SDK

    **SpeedTree 4.1 SDK** 是一个专为游戏开发和视觉效果设计的高级树木建模和渲染技术软件开发工具包。它提供了高效且逼真的树木生成和渲染解决方案,广泛应用于游戏引擎、电影特效以及虚拟现实环境。SDK 包含了以下几...

    OpenSceneGraph-3.6.5-sdk.zip

    OpenSceneGraph是一个开源的图形库,专为实时3D应用程序设计,如科学可视化、游戏开发、虚拟现实等。版本3.6.5是这个库的一个稳定版本,包含了库文件和必要的头文件,允许开发者在Visual Studio项目中进行编程。 **...

    javafx.sdk.zip

    在JavaFX中,开发者可以利用Scene Graph来构建UI,这是一个树形结构,表示UI元素的层次关系。Scenes、Nodes、Layouts等概念构成了Scene Graph的基本元素。此外,JavaFX还提供了丰富的预定义控件,如按钮、文本框、...

    Qooxdoo 1.3 SDK

    Qooxdoo是一个开源的JavaScript框架,用于构建富互联网应用程序(RIA)。它的1.3版本SDK是一个开发工具包,包含了创建、编译和运行Qooxdoo应用所需的所有组件和工具。下面将详细介绍Qooxdoo 1.3 SDK中的核心知识点。...

    Degrafa学习一,(含SDK4.0兼容版本及源码,略微有所修改)

    Degrafa是一个图形化开发框架,它主要用于创建2D图形应用程序,特别是在Swing或JavaFX平台上。这个资源包包括了SDK的4.0兼容版本,这意味着你可以利用这个框架来开发与Java SDK 4.0相适应的应用。"含SDK4.0兼容版本...

    手机JAVA电子书制作程序

    程序通常提供一个友好的图形用户界面(GUI),允许用户输入文本、导入图片、设置样式等。完成后,程序会将所有内容打包成适合手机阅读的格式,如EPUB或PDF。 3. **Java编程基础** 在使用这个程序前,熟悉Java基础...

    Android程序研发源码Android 树形控件源码.zip

    树形控件在计算机界面上通常以节点的形式展现,节点之间存在父子关系,形成一个层级结构。用户可以通过展开和折叠节点来查看或隐藏子节点,方便对复杂数据进行组织和操作。 2. **Android中的树形控件** Android ...

    安卓端圣诞树

    这个程序的核心在于利用Android SDK提供的各种工具和技术来创建一个互动的、动态的视觉体验,让用户在手机或平板电脑上也能感受到节日的氛围。 首先,我们需要对Android应用开发的基础知识有所了解。Android应用...

    iPhone开发书籍大全].Beginning.iPhone.SDK.Programming.with.Objective-C

    ### iPhone SDK Programming with Objective-C 知识点概览 #### 一、图书介绍与目标读者 - **书名**:《Beginning ...无论是想要成为一名专业iOS开发者还是希望扩展自己技能树的程序员,本书都是一个非常好的起点。

    fluttersdk.7z

    Flutter SDK 是一个全面的开发工具包,用于构建高性能、高保真、跨平台的移动应用程序。这个名为 "fluttersdk.7z" 的压缩文件很可能包含了Flutter SDK的完整安装包,便于开发者在本地环境中搭建Flutter开发环境。...

    迷宫程序(VC图形化界面)

    《迷宫程序(VC图形化界面)》是基于VC++开发的一款交互式迷宫求解应用,它结合了广度优先搜索算法与Windows API及SDK技术,为用户提供了一个直观、可自定义的迷宫环境。下面我们将深入探讨该程序的核心知识点。 ...

    dotnet OpenXML 读取 PPT 动画进入退出强调动画类型.rar

    在.NET框架中,`OpenXML`库是一个强大的工具,它允许开发者直接操作Microsoft Office文档,如Word、Excel和PowerPoint,而无需启动Office应用程序。在这个特定的案例中,我们关注的是如何使用`OpenXML`来读取...

    Google Android SDK开发范例大全.docx

    说明了如何设计一个关于程序的信息页面,通常包含版本号、版权信息等内容,并可通过菜单项访问。 - **3.18 程序加载中~请稍后——ProgressDialog与线程整合应用** 讲解了如何使用ProgressDialog显示加载进度,...

    如何用DirectX制作高级动画.rar

    10. **工具和框架**:Visual Studio作为开发环境,搭配DirectX SDK,可以方便地进行DirectX程序编写。此外,还有许多第三方库,如Assimp用于模型导入,Bullet或PhysX提供物理模拟,帮助开发者更高效地实现动画功能。...

    Android代码-树形控件源码.zip

    这个"Android代码-树形控件源码.zip"压缩包包含了一个实现树形控件的源代码示例,可以帮助开发者更好地理解和使用这种控件。下面我们将详细探讨树形控件在Android中的实现原理、常见应用场景以及如何自定义和优化。 ...

Global site tag (gtag.js) - Google Analytics