以下代码为用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;
作图效果如下