aardio 文档

aardio 范例: 画曲线

import win.ui;
/*DSG{{*/
var winform = win.form(text="画曲线";right=746;bottom=469)
winform.add(
edit={cls="edit";left=102;top=322;right=703;bottom=352;edge=1;multiline=1;z=2};
plusCanvas={cls="plus";left=32;top=25;right=703;bottom=302;align="right";bgcolor=0xFFFFFF;border={color=0xFF808080;width=1};db=1;dl=1;dr=1;dt=1;iconStyle={font=LOGFONT()};iconText="0";textPadding={top=10;right=100};valign="top";z=1};
static={cls="static";text="增长率:";left=32;top=365;right=94;bottom=385;align="right";transparent=1;z=5};
static2={cls="static";text="拐点:";left=32;top=400;right=94;bottom=420;align="right";transparent=1;z=6};
trackbarGrowth={cls="plus";left=102;top=367;right=703;bottom=382;bgcolor=0xFFD9AB23;border={radius=-1};color=0x005CFF;db=1;dr=1;foreRight=15;forecolor=0xFF1C77FF;paddingBottom=5;paddingTop=5;z=3};
trackbarMidpoint={cls="plus";left=102;top=407;right=703;bottom=422;bgcolor=0xFFD9AB23;border={radius=-1};color=0x005CFF;db=1;dr=1;foreRight=15;forecolor=0xFF1C77FF;paddingBottom=5;paddingTop=5;z=4}
)
/*}}*/

//更新绘图数据
winform.plusCanvas.updateCurve = function(calc,xMin,xMax,xStep,yMax){

        var width,height = owner.width,owner.height;
        if(!yMax) yMax = calc(xMax,yMax);

        var scaleX = width / (xMax - xMin);  
        var scaleY = height / yMax;

        var coordinates = [];
        for(x = xMin; xMax; xStep){ 

            //转换为 plus 控件内部坐标
            ..table.push(
                coordinates,(x - xMin) * scaleX, 
                height - (calc(x,yMax) * scaleY) );
        }

        owner.coordinates = coordinates;

        owner.text = math.stringify( calc(xMax,yMax),2 );
        owner.iconText = math.stringify( calc(10168,yMax),2 );
}

//绘图事件
winform.plusCanvas.onDrawContent = function(graphics, rc, txtColor, rcContent, foreColor, font){
    var coordinates = owner.coordinates;
    if(!#coordinates) return; 

    var pen = gdip.pen(0xFFFF0000, 2);  

    /*
    注意 coordinates 至少包含 3 个坐标点才能画出曲线,如果仅 2 个坐标点只能画出直线

    coordinates 支持两种格式的数组
    - [x1,y1,x2,y2,...] // 也就是数值数组,每两个数值表示一个坐标点
    - [{float x;float y},{float x;float y},...] //也就是 POINTF 结构体数组
    */
    graphics.drawCurve(pen, coordinates);
    pen.delete();
}

//滑块变动时重新计算曲线坐标
var onPosChanged = function(pos, triggeredByUser){

    var growthRate = winform.trackbarGrowth.progressPos / 100000.0;
    var midpoint = winform.trackbarMidpoint.progressPos / 100.0 * 121759;

    winform.plusCanvas.updateCurve(
        lambda (xValue,yMax) yMax / (1 + math.exp(-growthRate * (xValue - midpoint))),
        1/*xMin*/,100000/*xMax*/,1000/*xStep*/,25000
    );

    winform.plusCanvas.redrawTransparent();

    winform.edit.text = `增长率: ` + string.format('%.5f', growthRate) 
                + ' 拐点: ' + math.round(midpoint);
}

// 初始化新增的滑块
winform.trackbarGrowth.setTrackbarRange(1, 100);
winform.trackbarGrowth.progressPos = 10; // 默认值
winform.trackbarGrowth.onPosChanged = onPosChanged; // 联动更新

winform.trackbarMidpoint.setTrackbarRange(1, 100);
winform.trackbarMidpoint.progressPos = 30; // 默认值
winform.trackbarMidpoint.onPosChanged = onPosChanged; // 联动更新

//控件大小改变时重新计算坐标
winform.plusCanvas.adjust = function(){
    onPosChanged();
}

winform.show();
win.loopMessage();
Markdown 格式