eaebec39创建于 2024年10月24日历史提交
package scientific.matplot

import std.math.*
import std.unittest.*
import std.unittest.testmacro.*

import scientific.numbers.*
import scientific.linear.*
import scientific.stats.random.*
import scientific.stats.normal.*

/* Type for x and explode: Float64 */
foreign func c_pie_ex(x: CPointer<Unit>, explode: CPointer<Unit>, len: Int64): Unit

foreign func c_pie_ex_label(x: CPointer<Unit>, explode: CPointer<Unit>, labels: CPointer<CString>,
                            len: Int64): Unit

public func pie(x: Vector<Float64>, explode: Vector<Float64>, labels: Array<String>) {
    let size = x.size()
    if (size != labels.size) {
        throw IllegalArgumentException("pie: size of data and labels does not match")
    }
        
    var a = unsafe { malloc(UIntNative(8 * size)) }
    var labels_ptr = CPointer<CString>(a)
    for (i in 0..size) {
        var cstr_label = unsafe { LibC.mallocCString(labels[i]) }
        unsafe { labels_ptr.write(i, cstr_label) }
        unsafe { LibC.free(cstr_label) }
    }

    unsafe{ c_pie_ex_label(x.ptr, explode.ptr, labels_ptr, size) }
}

public func pie(x: Vector<Float64>) {
    let size = x.size()
    let ex = zeros<Float64>(size)
    unsafe{ c_pie_ex(x.ptr, ex.ptr, size) }
}

public func pie(x: Vector<Float64>, explode: Vector<Float64>) {
    let size = x.size()
    unsafe{ c_pie_ex(x.ptr, explode.ptr, size) }
}

public func pie(x: Vector<Float64>, labels: Array<String>) {
    let size = x.size()
    let ex = zeros<Float64>(size)
    pie(x, ex, labels)
}

public func testPie1() {
    let array_x = [1.0, 3.0, 0.5, 2.5, 2.0]
    let x = vector<Float64>(array_x)

    pie(x)
    save("./tests/imgs/pie/pie_1.svg", "svg")
    clear()
}

public func testPie2() {
    let array_x = [1.0, 3.0, 0.5, 2.5, 2.0]
    let x = vector<Float64>(array_x)
    let array_ex = [0.0, 1.0, 0.0, 1.0, 0.0]
    let ex = vector<Float64>(array_ex)

    pie(x, ex)
    save("./tests/imgs/pie/pie_2.svg", "svg")
    clear()
}

public func testPie3() {
    let array_x = [1.0, 2.0, 3.0]
    let x = vector<Float64>(array_x)
    let labels = ["Taxes", "Expenses", "Profit"]

    pie(x, labels)
    save("./tests/imgs/pie/pie_3.svg", "svg")
    clear()
}

public func testPie4() {
    let array_x = [0.19, 0.22, 0.41]
    let x = vector<Float64>(array_x)

    pie(x)
    save("./tests/imgs/pie/pie_4.svg", "svg")
    clear()
}

public func testPie5() {
    let array_2010 = [50.0, 0.0, 100.0, 95.0]
    let array_2011 = [65.0, 22.0, 97.0, 120.0]

    let y2010 = vector<Float64>(array_2010)
    let y2011 = vector<Float64>(array_2011)

    tiledlayout(2,1)
    let ax1 = nexttile()
    pie(y2010)
    title("2010")

    let ax2 = nexttile()
    pie(y2011)
    title("2011")

    save("./tests/imgs/pie/pie_5.svg", "svg")
    clear()
}

public func testPie6() {
    let array_x = [17.0, 33.0, 33.0, 17.0]
    let array_ex = [0.0, 1.0, 1.0, 0.0]

    let x = vector<Float64>(array_x)
    let ex = vector<Float64>(array_ex)
    let labels = ["East(17%)", "North(33%)", "South(33%)", "West(17%)"]

    pie(x, ex, labels)
    save("./tests/imgs/pie/pie_6.svg", "svg")
    clear()
}

public func testPie() {
    print("  + testPie\n")
    testPie1()
    testPie2()
    testPie3()
    testPie4()
    testPie5()
    testPie6()
}