如何在ILNumerics中实现与Matlab的fill3函数类似的功能并输出到SVG

时间:2014-07-02 18:11:40

标签: ilnumerics

我正在尝试在ILNumerics中实现类似于Matlab的fill3函数并输出到SVG文件。 fill3允许您使用实心填充颜色绘制3d形状,并为要绘制的形状指定边缘颜色。

我用来绘制形状的代码如下:

var scene = new ILScene();
scene.Camera.Add(new ILTriangles
{
    Positions = new float[,]
    {
        {-1, -1, -1}, {-1, 1, -1}, {0, 1, 0},
        {-1, -1, -1}, {0, 1, 0}, {0, -1, 0},
        {0, -1, 0}, {0, 1, 0}, {1, 1, -1},
        {0, -1, 0}, {1, 1, -1}, {1, -1, -1}
    },
    Color = Color.Red,
    AutoNormals = false
});
scene.Camera.Add(new ILLines
{
    Positions = new float[,]
    {
        {-1, -1, -1}, {-1, 1, -1}, {0, 1, 0}, {0, -1, 0}
    },
    Indices = new[] {0, 1, 1, 2, 2, 3, 3, 0},
    Color = Color.Black,
    Width = 3
});
scene.Camera.Add(new ILLines
{
    Positions = new float[,]
    {
        {0, -1, 0}, {0, 1, 0}, {1, 1, -1}, {1, -1, -1}
    },
    Indices = new[] { 0, 1, 1, 2, 2, 3, 3, 0 },
    Color = Color.Black,
    Width = 3
});
ilPanel1.Scene = scene;

我用来输出到SVG的代码如下:

using (var fs = new FileStream(@"C:\test.svg", FileMode.Create))
{
    new ILSVGDriver(fs, scene: ilPanel1.GetCurrentScene(), width: 500, height: 600).Render();
}

结果在ILPanel中看起来很完美,但是当渲染到SVG时,三角形形状似乎踩到/覆盖线条。

还有另一种方法可以实现我想要的目标吗?谢谢!

1 个答案:

答案 0 :(得分:0)

ILNumerics根据三角形渲染所有填充的形状。这提供了最大的灵活性,并且与所有3D引擎基本上工作的方式相对应。另一方面,SVG被设计为2D描述格式。它知道更多的形状而不仅仅是三角形 - 如果您在2D空间中,那么它是有意义的并且是有效的。理论上,您总是可以用三角形组合任何多边形。这就是我猜的所有渲染器在非常低端的完成(OpenGL至少这样做)。

现在,问题是,今天所有流行的SVG渲染器都试图“看起来很漂亮”。即他们渲染边缘抗锯齿。抗锯齿涉及透明度。透明度涉及颜色的变化。如果您尝试绘制抗锯齿的相邻边缘,则最终得到您获得的结果:边缘上的颜色会略有不同,留下一条虚线,预计会出现纯色区域。

这是SVG的限制 - 不是ILNumerics的限制。如果要使用SVG创建实心填充多边形形状,则需要使用SVG提供的形状进行“设计”。如果您在其他库创建的SVG文件中观察到不同的结果,请将这些SVG作为示例发布在此处,以便我们检查它们。我很确定他们不会使用三角形。 (?)