ILNumerics:手动创建的滴答声

时间:2014-09-10 13:14:41

标签: c# ilnumerics

我创建了手动刻度,就像在ilnumerics页面上显示的那样: http://ilnumerics.net/axis-configuration.html。 让我们以x轴上的日期为例。 我的问题如下:

在我的程序中,我想使用交互式鼠标缩放和拖动。但是,如果我这样做,则刻度标签和网格线将从绘图立方体的左右边界绘制出来。 (也在提到的例子中。)

我发现我可以通过使用plotCube的剪切属性来修复网格线问题。对于我的面板尺寸,它看起来像这样:

        plotCub.Clipping = new ILClipParams{
            Plane0 = new Vector4(1, 0, 0, 0.63f),
            Plane1 = new Vector4(-1, 0, 0, 0.63f)
        };

但刻度标签仍然在边界外绘制。我现在的解决方法是在plotcube的左侧和右侧放置面板。我想有更好的方法来解决这个问题?!?

另一个问题是裁剪仅适合当前面板尺寸。但我想在运行时更改面板大小,然后裁剪不再适合。 我没有找到如何获得裁剪的正确因素。或者还有其他/更好的解决方案吗?

提前感谢您的帮助!

编辑:对不起,好像我是瞎子!!我现在在动态ticks示例中使用了{em> TickCreationFunc ,就像http://ilnumerics.net/axis-configuration.html#ticks-configuration一样。 这很好用!但现在我遇到了新问题:
当我在示例中使用 TickCreationFunc 时,只要我缩放或拖动场景,滴答就会完美更新。 但该函数仅返回刻度的位置。使用 LabelTransformFunc 我可以操作Label的文本,通过 DefaultLabel ,我可以设置所有刻度的字体和锚点。
现在我正在寻找一种方法来定义单个刻度的锚点,因为我需要交替地将刻度线放在两个高度上,因为它们不可读,否则它们太靠近了。 有没有办法做到这一点??这是我的代码的最小化示例:

private void ilPanel1_Load(object sender, EventArgs e)
{
    // create some base data:
    ILArray<double> A = new Double[,] { { 1, 4, 0 }, { 10, 12, 0 }, { 100, 10, 0 }, { 1000, 18, 0 }, { 10000, 15, 0 } };
    // create a line plot and keep a reference to it
    var linePlot = new ILLinePlot(ILMath.tosingle(A));

    ilPanel1.Scene.Add(new ILPlotCube{
        Children = { linePlot },
        Axes = {
            XAxis = {
                Ticks = {
                    TickCreationFunc = (min, max, count) => {
                        List<float> ret = new List<float>();
                        using (ILScope.Enter())
                        {
                            // some example ticks
                            for (double i = 0; i <= 10000; i += 100)
                            {
                                // only ticks within the plotcube limits
                                if ((float)ILMath.log10(i) >= min && (float)ILMath.log10(i) <= max)
                                {
                                    float mval = (float)ILMath.log10(i);
                                    // add if not allready in the collection
                                    if (!ret.Contains(mval))
                                        ret.Add(mval);
                                }
                            }
                        }
                        return ret;
                    },
                    LabelTransformFunc = (ind, val) => {
                        String s = "" + (float)(ILMath.round(ILMath.pow(10.0, Convert.ToSingle(val.ToString("f3"))) * 10) / 10.0);
                        return s;
                    },
                    DefaultLabel = {Font = new Font("ProFont", 5), Anchor = new PointF(0.5f, -1.0f)},
               },
           },
       },
       ScaleModes = { XAxisScale = AxisScale.Logarithmic },
   });

我无法在这些功能中阅读或操纵Ticks,我也不知道该怎么做。

因为我尝试使用 TickCreationFuncEx ,因为我的VisualStudio警告我 TickCreationFunc 不再是最新的?!使用该功能,我可以返回一个完整的 ILTickCollection ,并根据需要设置所有锚点。
但是这个功能似乎并没有被plotcube调用。我忘记了什么吗? 这是我写的。我替换了 TickCreationFunc LabelTransformFunc DefaultLabel

TickCreationFuncEx = (min, max, count, axis, scale) => {
    IList<ILTick> ret = new List<ILTick>();
    // some example ticks
    for (double i = 0; i <= 10000; i += 100)
    {
        // only ticks within the plotcube limits
        if ((float)ILMath.log10(i) >= min && (float)ILMath.log10(i) <= max)
        {
            String s = "" + i;
            float mval = (float)ILMath.log10(i);
            ret.Add(new ILTick(mval, s));

        }
    }
    Font f = new Font("ProFont", 5);
    for (int i = 0; i < ret.Count; i++)
    {
        ret[i].Label.Font = f;
        if (i % 2 == 1)
            ret[i].Label.Anchor = new PointF(0.5f, -1.0f);
        else
            ret[i].Label.Anchor = new PointF(0.5f, 0.25f);
    }
    return ret;
}

当我调试我的第一个程序版本时,我看到 TickCreationFunc 被反复调用,但在第二个中, TickCreationFuncEx 从未被调用。我究竟做错了什么?

非常感谢您提前寻求帮助!

0 个答案:

没有答案