如何在2D网格上绘制张量可视化

时间:2015-11-30 13:00:33

标签: c# math

我想在本文中实现(一个c#程序)系统IPSM它使用张量场来设计街道网络。对于我的实现,我的首要任务是从我自己的张量场中生成自己的街道网络。起初我不想要太先进的东西。该报称,张量线(主要和次要特征向量)将代表街道。 有没有人有任何想法我应该从哪里开始看(如何在2D网格中绘制这些线)。在论文中有一些参考文献,例如张量场可视化文件,但是我不能在一个循环中转向一个参考另一个参考。

问候。

2 个答案:

答案 0 :(得分:0)

我将假设这是你需要帮助的绘图部分。 C#具有许多绘图功能,可以很容易地绘制这样的东西。 GDI +(System.Drawing中包含的图形/绘图包)内置了对2D变换的支持,因此我们可以创建一个位图,然后使用任意坐标系在其上绘制。您还可以利用System.Windows命名空间中现有的Vector类来简化矢量数学。

首先,您需要的命名空间和程序集:

using System;

// Needs reference to System.Drawing to use GDI+ for drawing
using System.Drawing; 
using System.Drawing.Imaging;

// Needs reference to WindowBase to use Vector class
using Vector = System.Windows.Vector;

以下示例仅绘制一个10x10的向量网格。输出looks like this.代码将在控制台应用程序内运行(即没有用户界面)。您还可以修改代码以生成位图,并通过图片框或其他UI元素在Windows窗体应用程序中显示。然而,控制台版本很简单,易于使用:

// Define the size of our viewport using arbitary world coordinates
var viewportSize = new SizeF(10, 10);

// Create a new bitmap image that is 500 by 500 pixels
using (var bmp = new Bitmap(500, 500, PixelFormat.Format32bppPArgb))
{
    // Create graphics object to draw on the bitmap
    using (var g = Graphics.FromImage(bmp))
    {
        // Set up transformation so that drawing calls automatically convert world coordinates into bitmap coordinates
        g.TranslateTransform(0, bmp.Height * 0.5f - 1);
        g.ScaleTransform(bmp.Width / viewportSize.Width, -bmp.Height / viewportSize.Height);
        g.TranslateTransform(0, -viewportSize.Height * 0.5f);

        // Create pen object for drawing with
        using (var redPen = new Pen(Color.Red, 0.01f)) // Note that line thickness is in world coordinates!
        {
            // Randomization
            var rand = new Random();

            // Draw a 10x10 grid of vectors
            var a = new Vector();
            for (a.X = 0.5; a.X < 10.0; a.X += 1.0)
            {
                for (a.Y = 0.5; a.Y < 10.0; a.Y += 1.0)
                {
                    // Connect the center of this cell to a random point inside the cell
                    var offset = new Vector(rand.NextDouble() - 0.5, rand.NextDouble() - 0.5);
                    var b = a + offset;
                    g.DrawLine(redPen, a.ToPointF(), b.ToPointF());
                }
            }
        }
    }

    // Save the bitmap and display it
    string filename = System.IO.Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
        "c#test.png");
    bmp.Save(filename, ImageFormat.Png);
    System.Diagnostics.Process.Start(filename);
}

答案 1 :(得分:0)

你需要做很多工作来开发像他们一样的系统。您的第一步将绘制矢量场的流线。关于这个主题有很多文献,因为它是一个很大的领域。我建议你写一本关于这个主题的书,而不是试图处理那些总是缺少细节的论文。

一旦你有一个可以简化的框架,你就可以转移到算法的其他部分。为了简化算法,我将查看高度图上的部分。如果您可以在整个域上生成高度图,则可以将其中一个向量定义为渐变,并从该向量字段中绘制一些流线。

这可能是获得一个相当简单的工作系统的好方法。他们的完整算法非常复杂。我会说你需要大约一个月的时间才能实现他们的整个算法。