【发布时间】:2016-06-07 21:37:08
【问题描述】:
所以我有两个点的经纬度坐标List<object>,我需要连接它们之间的线。诀窍是显示面板内的所有线条,以便它们在面板的尺寸内缩放(转换坐标数以匹配像素),我几乎明白了。但是,我对一些未知问题感到困惑。代码是:
int canvasWidth = panel1.Width,
canvasHeight = panel1.Height;
var minX1 = tockeKoordinate.Min(x => x.startX);
var minX2 = tockeKoordinate.Min(x => x.endX);
var minX = Math.Min(minX1, minX2);
var maxX1 = tockeKoordinate.Max(x => x.startX);
var maxX2 = tockeKoordinate.Max(x => x.endX);
var maxX = Math.Max(maxX1, maxX2);
var maxY1 = tockeKoordinate.Max(x => x.startY);
var maxY2 = tockeKoordinate.Max(x => x.endY);
var maxY = Math.Max(maxY1, maxY2);
var minY1 = tockeKoordinate.Min(x => x.startY);
var minY2 = tockeKoordinate.Min(x => x.endY);
var minY = Math.Min(minY1, minY2);
double coordinatesWidth = Math.Abs(maxX - minX),
coordinatesHeight = Math.Abs(maxY - minY);
float coefWidth = (float)coordinatesWidth / canvasWidth,
coefHeight = (float)coordinatesHeight / canvasHeight;
基本上我检查List 的最小和最大XY 坐标,所以我知道极值是什么。然后我使用一个系数值来重新计算以像素为单位的坐标,以便在面板内。当我使用这个时:
drawLine(Math.Abs((float)(line.startX - minX) / coefWidth),
Math.Abs((float)(line.startY - minY) / coefHeight),
Math.Abs((float)(line.endX - maxX) / coefWidth),
Math.Abs((float)(line.endY - maxY) / coefHeight));
它在 foreach 循环中迭代来自 List 的所有元素。 drawline()方法如下:
private void drawLine(float startX, float startY, float endX, float endY)
{
PointF[] points =
{
new PointF(startX, startY),
new PointF(endX, endY),
};
g.DrawLine(myPen, points[0], points[1]);
}
当所有这些放在一起时,我得到了这张照片:
我知道“线”应该连接起来并形成形状,在这种情况下,它们代表郊区的道路。 我认为它将每个坐标集都视为唯一的坐标集,然后将其缩放到面板尺寸。实际上它应该参考所有其他坐标来缩放它
它应该“缩小”它们并相互连接,因为这是我定义面板尺寸和其他所有内容的方式。
编辑:ToW 的解决方案成功了,这行代码改为使用我的列表:
foreach (var line in tockeKoordinate)
{
gp.AddLine((float)(line.startX), (float)(line.startY), (float)(line.endX), (float)(line.endY));
gp.CloseFigure();
}
【问题讨论】:
-
不应该是
drawLine(Math.Abs((float)(line.startX - minX) / coefWidth),...是这样的:drawLine(Math.Abs((float)(line.startX) / coefWidth),... -
@TaW 我试图用它来删除 X 和 Y 轴偏移。立即研究您的解决方案。
标签: c# winforms coordinates panel scaling