【问题标题】:Drawing sets of coordinates to pixels so they mutually scale将坐标集绘制为像素,以便它们相互缩放
【发布时间】: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


【解决方案1】:

据我所知,您最好的选择是将所有这些行添加到GraphicsPath

完成后,您可以查看它的边界矩形并将其与Panel 提供的大小进行比较。

然后您可以计算Graphics 对象的比例以进行绘制以及平移。

最后你用Graphics.DrawPath画线。

您身边只有 2 个师 :-)

这是一个例子:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    Graphics G = e.Graphics;
    Random R = new Random(13);
    GraphicsPath gp = new GraphicsPath();
    for (int i = 0; i < 23; i++)
    {
        gp.AddLine(R.Next(1234), R.Next(1234), R.Next(1234), R.Next(1234));
        gp.CloseFigure();  // disconnect lines
    }
    RectangleF rect = gp.GetBounds();

    float scale = Math.Min(1f * panel1.Width / rect.Width, 
                           1f * panel1.Height / rect.Height);


    using (Pen penUnscaled = new Pen(Color.Blue, 4f))
    using (Pen penScaled = new Pen(Color.Red, 4f))
    {
        G.Clear(Color.White);
        G.DrawPath(penUnscaled, gp);
        G.ScaleTransform(scale, scale);
        G.TranslateTransform(-rect.X, -rect.Y);
        G.DrawPath(penScaled, gp);
    }
}

一些注意事项:

  • 蓝色线条不适合面板
  • 红线按比例缩小以适应
  • Pen 与图形的其余部分一起缩放,但不会低于 1f。
  • 要创建连接线,请添加PointF[],或者更方便的是List&lt;PointF&gt;.ToArray()
  • 我真的应该使用panel1.ClientSize.Width 而不是panel1.Width 等..;现在它在底部有点偏离;坏孩子我;-)

【讨论】:

  • 感谢您的回答。但是,使用您的解决方案,我得到一个空白的panel1。我还应该做点别的吗?
  • 嗯,你确实连接了 Paint 事件,对吧?你的点坐标看起来好吗?您可能想发布添加行的代码..
  • 我在panel1_Paint 中用你的代码替换了我现有的代码,只是用我的列表中的随机值更改了随机值。在调试模式下,我看到图形路径正在存储所有点及其坐标。现在它看起来有点工作了,panel1 区域看起来像这样:imgur.com/sHSHG1o
  • 嗯,看起来有点,嗯,浓密?
  • 是的,但我看不出它“有点工作”。你能看看比例值和矩形大小吗?您的数据中有多少行?也尝试使用 1f 的 Pen.Width。
猜你喜欢
  • 2014-06-17
  • 2021-12-30
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
相关资源
最近更新 更多