我一直在开发(最近3个小时)我在C#做的一个小项目,帮助我选择一个家。
具体来说,我将犯罪统计数据叠加在谷歌地图上,找到一个不错的社区。 p>
这是一个例子: 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);
所以,我收集了一个像素/ latlng组合列表,现在想要转换图像(使用仿射或非仿射变换)。
这里的目标是让每条街道排成一行。给定一张好的地图,唯一必要的转换就是轮换从北到南排列地图(现在我会对此感到满意)。但我不知道从哪里开始。
有没有人在C#中进行图像转换的经验?如何找到正确的旋转以使地图水平?
在精心制作的地图解决后,我最终希望能够叠加手绘地图。这显然会导致最终图像的严重失真,并且可能超出了第一次迭代的范围。但是,我不希望开发一个将来无法扩展到该系统的系统。
答案 0 :(得分:3)
我不确定你想要完成什么,但是如果你想在一张地图上超过三个点而在另一个地图上超过三个点,你基本上有两种方法可以去:
答案 1 :(得分:2)
在2D空间中,仿射变换可以由两组三个非线性2D点指定。在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/
开始答案 2 :(得分:0)
美丽。
所以,感谢Jamie的指示,我发现了这个:
.NET 2.0中的Delaunay三角剖分
http://local.wasp.uwa.edu.au/~pbourke/papers/triangulate/morten.html
此时,这已经非常简化为lerping。