我用ILLinePlot绘制了一些线条。
然后我旋转立方体(意图改变从顶部开始的Y刻度标签的位置):
Rotation = Matrix4.Rotation(new Vector3(1, 0, 0), ILMath.pif),
它会产生这样的结果。
在此图表中,我在Y轴上丢失了刻度标签。如何配置?那么标签可以显示吗?
更新 此问题与:How to reverse the axis in ILNumerics
有关首先,我创建了一个包含如下图所示的行的图: 该数字由以下代码生成:
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轴刻度变为这样:
从这个帖子: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轴上的刻度标签。如何配置,所以可以显示比例标签?
答案 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.ZNear
和ILPlotCube.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;
}
};
}