如何在ILNumerics中配置比例标签位置?

时间:2014-07-08 04:24:37

标签: graph label axis lines ilnumerics

我用ILLinePlot绘制了一些线条。 enter image description here

然后我旋转立方体(意图改变从顶部开始的Y刻度标签的位置):

Rotation = Matrix4.Rotation(new Vector3(1, 0, 0), ILMath.pif),

它会产生这样的结果。 enter image description here

在此图表中,我在Y轴上丢失了刻度标签。如何配置?那么标签可以显示吗?

更新 此问题与:How to reverse the axis in ILNumerics

有关

首先,我创建了一个包含如下图所示的行的图: enter image description here 该数字由以下代码生成:

scene.Add(new ILPlotCube
{
   Children = {
      new ILLinePlot(ILMath.tosingle(responses["1,0;:"]),lineWidth:1, markerStyle: MarkerStyle.None),
      new ILLinePlot(line1, lineColor: Color.Black ,lineWidth: 2)
   },

   Axes =
   {
      YAxis =
      {
          LabelAnchor = new PointF(1, 0)
      },
      ZAxis = 
      {
         Visible = false,  
      }
   }
});

BoreholeRespondilPanel.Scene = scene;
BoreholeRespondilPanel.Refresh();

然后我要反转Y轴刻度变为这样: enter image description here

从这个帖子:How to reverse the axis in ILNumerics,他建议我将绘图立方体绕X轴旋转180°。那么这是我的最终代码:

scene.Add(new ILPlotCube
{
   Children = {
      new ILLinePlot(ILMath.tosingle(responses["1,0;:"]),lineWidth:1, markerStyle: MarkerStyle.None),
      new ILLinePlot(line1, lineColor: Color.Black ,lineWidth: 2)
   },
   Rotation = Matrix4.Rotation(new Vector3(1, 0, 0), ILMath.pif), //<<==== added this line

   Axes =
   {
      YAxis =
      {
          LabelAnchor = new PointF(1, 0)
      },
      ZAxis = 
      {
         Visible = false,  
      }
   }
});

BoreholeRespondilPanel.Scene = scene;
BoreholeRespondilPanel.Refresh();

但是,结果是缺少Y轴上的刻度标签。如何配置,所以可以显示比例标签?

1 个答案:

答案 0 :(得分:0)

使用解决方案编辑和新答案

经过一番调查后,您的问题可以转载。实际上我们有两个问题:

1)旋转绘图立方体以便翻转轴很好。但它应该正确完成。这涉及轮换翻译。两者可以组合在一起并应用于ILPlotCube.Rotation属性:

Rotation = Matrix4.Translation(0, 0, -2).Rotate(Vector3.UnitX, ILMath.pif)

需要进行平移,因为旋转始终围绕原点进行。绘图块的原点位于(0,0,0)并围绕X轴旋转,使绘图立方体更接近相机。如果没有翻译,它可能会过于靠近,以致ZNear上的剪辑开始并阻止场景的某些部分显示。

2) ILNumerics ILOGLLabel OpenGL标签类早于4.1版的ILNumerics中存在一个错误,它会阻止标签显示在这样一个旋转的plotcube中。这个bug将在4.1中修复。 为了解决这个错误,

一个。使用ILPlotCube.Transform代替ILPlotCube.Rotation
  湾重新配置ILPlotCube.ZNearILPlotCube.ZFar的设置:

plotCube.Transform = Matrix4.Translation(0, 0, -2).Rotate(Vector3.UnitX, ILMath.pif); 
plotCube.ZNear = -1; plotCube.ZFar = 1;

小结

为了用ILNumerics版本反转Y轴&gt; 4.0只适用1)。对于旧版本(4.0及更低版本),只需使用2)。


旧答案

@Edit:旧答案并没有真正回答这个问题。请参阅上面的第一部分,以找到原始问题的解决方案。这个旧答案留待这里完整,因为它无论如何都很有用:它展示了即使允许用户交互也如何确保稳定的配置。


我无法完全重现您的问题,但这是一个潜在的解决方案。

通过反转绘图立方体以使Y轴在顶部&gt;向下方向,您必须确保用户无法通过双击场景来重置绘图立方体。我们可以处理双击事件并将旋转放在那里。

无论如何,对于下面的这个例子,所有滴答都正确显示。如果问题仍然存在,请发布屏幕截图和 runnable 示例。

private void ilPanel1_Load(object sender, EventArgs e) {
    // generate some test data
    ILArray<float> A = ILMath.tosingle(ILMath.randn(1, 20));
    ILArray<float> B = A + ILMath.vec<float>(1, 20);
    // add two lines
    ilPanel1.Scene.Add(new ILPlotCube {
        Children = {
            new ILLinePlot(A, lineWidth:1, markerStyle: MarkerStyle.None),
            new ILLinePlot(B, lineColor: Color.Black, lineWidth: 2)
        },
        // rotate the plotcube so the Y axis appears in top down direction
        Rotation = Matrix4.Rotation(new Vector3(1, 0, 0), ILMath.pif), //<<==== added this line

        // configure some axis label properties
        Axes = {
            YAxis = {
                LabelAnchor = new PointF(1, 0)
            },
            ZAxis = {
                Visible = false,
            }
        }
    });

    // override the double click event: resetting the plotcube will restore the reversed axis
    ilPanel1.Scene.First<ILPlotCube>().MouseDoubleClick += (_s, _a) => {
        var plotCube = _s as ILPlotCube;
        if (plotCube != null) {
            plotCube.Reset(); 
            plotCube.Rotation = Matrix4.Rotation(new Vector3(1, 0, 0), ILMath.pif);
            _a.Refresh = true;
            _a.Cancel = true; 
        }
    }; 
}

enter image description here