4

我一直在开发(过去 3 个小时)我正在用 C# 做的一个小项目,以帮助我选择一个家。

具体来说,我将犯罪统计数据叠加在谷歌地图上,以找到一个不错的社区。

这是一个例子: http: //otac0n.com/Demos/prospects.html

现在,我手动找到了 Lat 和 Lng 以匹配示例中显示的地图的角落,但我还有一些地图要叠加。

我的新应用程序允许我选择一个地标并指向图像以将 Pixel 与 LatLng 联系起来。就像是:

locations.Add(new LocationPoint(37.6790f, -97.3125f, "Kellogg and I-135"));

// and later...

targetPoint.Pixel = FindPixel(mouseEvent.Location);

所以,我收集了一个像素/纬度组合列表,现在想变换图像(使用仿射或非仿射变换)。

这里的目标是让每条街道都排成一行。给定一张好的地图,唯一必要的转换是旋转以使地图从北到南排列(现在我会对此感到满意)。但我不知道从哪里开始。

有人有在 C# 中进行图像转换的经验吗?我如何找到合适的旋转来使地图水平?

在解决了制作精良的地图的情况后,我最终希望能够叠加手绘地图。这显然会导致最终图像的严重失真,并且可能超出第一次迭代的范围。但是,我不想开发一个将来无法扩展到该系统的系统。

4

3 回答 3

3

我不确定您到底想完成什么,但是如果您想将一张地图上的三个以上点与另一张地图上的三个以上点相匹配,则基本上有两种方法可以选择:

  1. 您可以尝试在您的点上创建一个三角形网格,然后在每个三角形内应用不同的仿射变换,并获得分段线性变换。为了正确进行网格划分,您可能需要对点进行Delaunay 三角剖分之类的操作,而qhull可能是您的首选。
  2. 您可以进行更高阶的变换,例如四边形失真,但可能很难找到适用于通用位置中任意数量点的解决方案。给自己找一本好的有限元方法书,并阅读有关高阶等参元素的章节,无论是拉格朗日还是偶然因素,这将为您提供多点到多点的良好映射。这里有几个链接(12)可以帮助您上路。但请注意,数学内容很密集......
于 2009-06-09T15:33:15.457 回答
2

在二维空间中,仿射变换可以由两组三个非线性二维点来指定。在 C# 中,您可以使用以下例程来计算适当的矩阵:

    public static Matrix fit(PointF[] src, PointF[] dst) {
        Matrix m1 = new Matrix(new RectangleF(0, 0, 1, 1), src);
        m1.Invert();
        Matrix m2 = new Matrix(new RectangleF(0, 0, 1, 1), dst);
        m2.Multiply(m1);
        return m2;
    }

它适用于具有 3 个元素的两个数组参数。

如果只需要旋转和平移,那么可以使用如下例程:

    public static Matrix fitOrt(PointF src1, PointF src2, PointF dst1, PointF dst2) {
        return fit(new PointF[] { src1, src2, ort(src1, src2) },
                new PointF[] { dst1, dst2, ort(dst1, dst2) });
    }

    public static PointF ort(PointF p, PointF q) {
        return new PointF(p.X + q.Y - p.Y, p.Y - q.X + p.X);
    }

如果您想找到两组多点之间的最佳近似值,那么您可以从这个http://elonen.iki.fi/code/misc-notes/affine-fit/开始

于 2009-06-08T13:54:02.637 回答
0

美丽的。

所以,感谢 Jamie 的指导,我发现了这个:

.NET 2.0 中的 Delaunay 三角剖分

http://local.wasp.uwa.edu.au/~pbourke/papers/triangulate/morten.html

在这一点上,这几乎被简化为 lerping。

于 2009-06-09T19:55:35.310 回答