注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

亿能部落格---观察思维比思维本身更重要

我是回来地球补课的!

 
 
 

日志

 
 
关于我

光行者的存在不在于他们真的能唤醒人类或者改变人类,而在于人类世界走向几近崩溃的时候能够站出来建立一套持久永恒的生活模式。

网易考拉推荐

计算机分形之GTK实现  

2013-03-29 10:21:29|  分类: 分形启示录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文转载自黑黑的大鲨鱼《计算机分形之GTK实现》
截图 1  n = 0 时
计算机分形之GTK实现 - 黑黑的大鲨鱼 - 黑黑的大鲨鱼

截图 2  n = 1 时
计算机分形之GTK实现 - 黑黑的大鲨鱼 - 黑黑的大鲨鱼

截图 3  n = 2 时
计算机分形之GTK实现 - 黑黑的大鲨鱼 - 黑黑的大鲨鱼

截图 4  n = 3 时
计算机分形之GTK实现 - 黑黑的大鲨鱼 - 黑黑的大鲨鱼

截图 4  n = 4 时
计算机分形之GTK实现 - 黑黑的大鲨鱼 - 黑黑的大鲨鱼

截图 4  n = 5 时
计算机分形之GTK实现 - 黑黑的大鲨鱼 - 黑黑的大鲨鱼


附:计算机分形算法的GTK+实现

// draw_fractal.c
#include <gtk/gtk.h>
#include <gdk/gdk.h>

/* 分形算法 */
void draw_fractal(GdkDrawable *drawable, GdkGC *gc, GdkPoint gpoints[], gint ndraw)
{
GdkColor color;
GdkPoint points[3];
GdkPoint others[3];
int i = 0;

color.red = 0;
color.green = 0;
color.blue = 65535;
gdk_gc_set_rgb_fg_color(gc, &color);

if (ndraw > 0)
{
for (i = 0; i < 3; i++)
{
points[i].x = (gpoints[i].x + gpoints[(i+1)%3].x)/2;
points[i].y = (gpoints[i].y + gpoints[(i+1)%3].y)/2;
}

/* 绘制多边形 */
gdk_draw_polygon(drawable, gc, FALSE, points, 3);

ndraw--;

others[0].x = gpoints[0].x;
others[0].y = gpoints[0].y;

others[1].x = points[0].x;
others[1].y = points[0].y;

others[2].x = points[2].x;
others[2].y = points[2].y;

/* 递归调用分形函数 */
draw_fractal(drawable, gc, others, ndraw);

others[0].x = points[0].x;
others[0].y = points[0].y;

others[1].x = gpoints[1].x;
others[1].y = gpoints[1].y;

others[2].x = points[1].x;
others[2].y = points[1].y;

/* 递归调用分形函数 */
draw_fractal(drawable, gc, others, ndraw);

others[0].x = points[1].x;
others[0].y = points[1].y;

others[1].x = gpoints[2].x;
others[1].y = gpoints[2].y;

others[2].x = points[2].x;
others[2].y = points[2].y;

/* 递归调用分形函数 */
draw_fractal(drawable, gc, others, ndraw);
}
}

gboolean expose_event_callback(GtkWidget * widget,
GdkEventExpose * event, gpointer data)
{

GdkGC *gc = widget->style->fg_gc[GTK_WIDGET_STATE(widget)];
GdkDrawable *drawable = widget->window;
GdkColor color;
GdkPoint points[] = {{150, 50}, {50, 223}, {250, 223}};

/* 设置绘图区前景颜色为蓝色 */
color.red = 0;
color.green = 0;
color.blue = 65535;
gdk_gc_set_rgb_fg_color(gc, &color);

/* 绘制多边形 */
gdk_draw_polygon(drawable, gc, FALSE, points, 3);

/* 调用分形函数 */
draw_fractal(drawable, gc, points, 5);

return TRUE;
}

int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *drawing_area; /* 绘图区构件 */

gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "GtkFractal");

/* 创建绘图区构件并设置绘图区大小 */
drawing_area = gtk_drawing_area_new(); 
gtk_widget_set_size_request(drawing_area, 300, 300);

/* 接收
“expose_event“ 信号并处理之 */
g_signal_connect(GTK_OBJECT(drawing_area), "expose_event",
G_CALLBACK(expose_event_callback), NULL);

gtk_container_add(GTK_CONTAINER(window), drawing_area);

g_signal_connect(GTK_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);

gtk_widget_show_all(window);

gtk_main();

return 0;
}

// makefile
# this is makefile of the program draw_fractal.c
# the standard c compiler on  ubuntu 9.10 is gcc
# written by young on January 4th, 2010

TARGET = .

CC = gcc
CFLAGS = -g -Wall

MAINC = draw_fractal.c
EXEC = $(TARGET)/draw_fractal

GTKLIB = `pkg-config --cflags --libs gtk+-2.0`

all: $(EXEC)

$(EXEC): $(MAINC)
$(CC) $(CFLAGS) $(MAINC) $(GTKLIB) -o $@
@echo "<<<<<< $@ created successfully! >>>>>>"


clean:
rm -f $(EXEC)

注意:makefile文件中的红色字体行应以Tab键开始,否则使用make命令编译程序时将产生错误!
  评论这张
 
阅读(216)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017