我想在本文中实现(一个c#程序)IPSM系统。它使用张量域来设计街道网络。对于我的实现,我的首要任务是从我自己的张量域生成我自己的街道网络。一开始我不想要太高级的东西。该论文称张量线(主特征向量和次特征向量)将代表街道。有人知道我应该从哪里开始看(如何在2D网格中绘制这些线)吗。这篇论文中有一些参考文献,比如张量场可视化论文,但我无法停止在循环中寻找一个参考文献。
谨致问候。
我假设这是您需要帮助的绘图部分。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的矢量网格。输出如下所示。代码将在控制台应用程序内部运行良好(即没有用户界面)。您也可以修改代码以生成位图,并通过图片框或其他一些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);
}
要开发一个像他们这样的系统,需要做大量的工作。第一步是绘制矢量场的流线。有很多关于这个话题的文献,因为这是一个很大的领域。我建议你读一本关于这个主题的书,而不是试图处理那些总是缺少细节的论文。
一旦你有了一个可以做流线的框架,你就可以进入算法的其他部分。为了简化算法,我会查看关于高度图的部分。如果你可以在整个域上生成一个高度图,那么你可以将其中一个向量定义为梯度,并从该向量场中绘制一些流线。
这可能是获得一个相当简单的工作系统的好方法。他们的完整算法真的很复杂。我想说,你需要大约一个月的工作来实现他们的整个算法。