3x+1猜想之6m+4树的生成与作图源码

以下代码为用aardio编程的代码

//6m+4树绘图 
import win.ui;
import win.ui.menu;
import com.picture;
/*DSG{{*/
var winform = win.form(text="aardio form";right=566;bottom=424;parent=...)
winform.add(
button={cls="button";text="GDI+ 绘图测试";left=317;top=394;right=465;bottom=427;db=1;dl=1;z=1};
edit={cls="edit";text="16";left=217;top=401;right=313;bottom=420;autohscroll=false;autovscroll=false;border=1;db=1;dl=1;edge=1;num=1;z=3};
static={cls="static";text="6m+4树根:";left=136;top=402;right=208;bottom=420;border=1;color=255;db=1;dl=1;transparent=1;z=2}
)
/*}}*/

//导入GDI+库,实际开发中建议仅导入gdip名字空间下需要用到的库  
import gdip;
import math;

function   deCollatz(m){
	tab={}
	y=6*m+4
	o1=2*y
	o2=2*o1
	j=(y-1)/3
	jm=j%6
	select(jm) {
		case 1 {
			jo1=2*j
			jo2=4*j
//			tab={y;o1;o2;j;jo1;jo2}
			tab={y;o2;jo2}
		}
		case 3 {
//			tab={y;o1;o2;j}
			tab={y;o2;j}
		}
		case 5 {
			jo1=2*j
//			tab={y;o1;o2;j;jo1}
			tab={y;o2;jo1}
		}
	}
return tab; 
}

//第m个6m+4分叉数的分叉表,从模6角度看有三种分叉类型[1,3,5],也是第m个奇数所在分叉数[根;奇叉;偶叉]
function   deCollatz0(m){
	var tab={}
	if(m<=0) {
		tab={0;0}
		return tab; 
		}
	var y=6*m+4
	var j=2*m+1
	var o2=4*y
	var jm=j%6
	select(jm) {
		case 1 {
			jo1=2*j
			jo2=4*j
//			tab={jo2;o2}
			tab={o2;jo2}
			return tab
		}
		case 3 {
//			tab={0;o2}
			tab={o2;0}
			return tab
		}
		case 5 {
			jo1=2*j
//			tab={jo1;o2}
			tab={o2;jo1}
			return tab
		}
	}
}
//创建一个起始于x=6m+4分叉数结点数为long的二叉数顺序表
function CreateTree(x,long){
	var tab1={x}
	var i=1
	while(#tab1<long){
		var temp=tab1[i]
//		if(temp){
			atab=deCollatz0(temp)
			table.push(tab1,table.unpack(atab))
//		}
	i=i+1
	}
	return tab1; 	
}


//创建一个起始于x=6m+4分叉数结点数为long的二叉数顺序表及各层分叉数数目
function CreateTree1(x,long){
	var tab1={x};
	var oldl=#tab1;
	var tab2={oldl};
	var newl;
	var k = 1; 
	var i=1;
	while(#tab1<long){
		for(j=1;tab2[k];1){
			var temp=tab1[i]
				var m=(temp-4)/6
				atab=deCollatz0(m)
				if(tab2[k+1]==null){
					tab2[k+1]=0
				}
				tab2[k+1]=tab2[k+1]+#atab
				table.push(tab1,table.unpack(atab))
				i=i+1
		}
		k=k+1
	}
	return tab1,tab2; 	
}
//创建一个起始于x=6m+4分叉数层为long的二叉数表,返回一个按各层分叉数组成的表
function CreateTree2(x,long){
	var tab1,tab2= CreateTree1(x,long)
	var tab3={}
	var n=1
	for(i=1;#tab2;1){
		tab3[i]={}
	}
	for(j=1;#tab2;1){
		for(k=1;tab2[j];1){
			table.push(tab3[j],tab1[n])
		n=n+1
		}
	}
	return tab3; 	
}

winform.button.oncommand = function(id,event){
	//图形对象graphics(可以看作是画板)
	var graphics = gdip.graphics(  winform )
	graphics.clear(0xFFFFFFFF)
		
	//创建刷子
	var brush = gdip.solidBrush(0xFF0000FF);
	
	//创建FontFamily 
	var family = gdip.family("宋体");
	
	//创建stringFormat 
	var strformat = gdip.stringformat ( ); 
	
	//设置样式
	strformat.align = 0/*_GdipStringAlignmentNear*/;
	
	//创建Font
	var curFont = family.createFont(  12,2/*_GdipFontStyleItalic*/, 2/*_GdipUnitPixel*/)
	var curFont1 = family.createFont(  24,2/*_GdipFontStyleItalic*/, 2/*_GdipUnitPixel*/)
	
	//设置文字抗据齿
	graphics.smoothingMode = 4/*_GdipSmoothingModeAntiAlias*/ ;
	
	//消除走样,且边作平滑处理
	graphics.textRenderingHint = 3/*_GdipTextRenderingHintAntiAliasGridFit*/;

	//创建画笔,画笔pen只能画一个轮廓(画线) 
	var pen = gdip.pen( 0xFFFF0000, 1, 2/*_GdipUnitPixel*/ );
	var w =winform.width ; 
	var h=winform.height;
	var tab4={}
	var m4 =winform.edit.text ; 
	tab4=CreateTree2(6*m4+4,46)
	var s=#tab4;//确定层数
	var hi=h/s;
	var hy=50//高度下调值
	var ss =1 ; 
	var str = "6m+4树:根为"+tostring(6*m4+4)+"层为5"; 
	rclayout = gdip.RECTF(); 
					rclayout.x = w/2-150
					rclayout.y = 20
					graphics.drawString( str , curFont1, rclayout, strformat,brush);

	for(i=1;#tab4;1){
		ss=2**i;//本层横坐标分段数
		wi=(w-100)/ss;//本层横坐标分段的宽度
		wii=wi/2;//下层横坐标分段数
		for(k=1;#tab4[i];1){
					//绘制本层数据
					rclayout.x = (2*k-1)*wi
					rclayout.y =  (i-1)*hi+hy
				if(tab4[i][k]){	
					graphics.drawString( tostring(tab4[i][k] ) , curFont, rclayout, strformat,brush);
				}	
					//画本层数据到下层的两条线(满树时) - 需要指定画笔(Pen)
				if(tab4[i][k] && i<#tab4 ){//父结点不为0且未到最后一层时画
					graphics.drawLine( pen, rclayout.x, rclayout.y, rclayout.x-wii, i*hi+hy)//画左结点
					if(tab4[i+1][2*k])graphics.drawLine( pen, rclayout.x, rclayout.y, rclayout.x+wii, i*hi+hy)//右结点不为0时画线
					}
			}
		}
		
	
	
	//删除所有GDI+对象 
	pen.delete()
	brush.delete()
	curFont.delete()
	strformat.delete();
	family.delete(); 

}
winform.show(true) 
	
win.loopMessage(); 

return winform;

作图效果如下

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值