簡體   English   中英

以 Windows 形式重新縮放圖像

[英]Rescaling Image in Windows Form

我有一組要在 2000x2000 canvas 上顯示的點。這是一個示例:“61.86, 83 - 61.79, 82.91 - 61.77, 82.77 - 61.92, 82.76 - 61.75, 82.7 - 61.79, 82.587 - 61.9 , 82.17 - 61.72, 81.88 - 61.61, 81.61 - 61.51, 81.33 - 61.49, 81.02 - 61.33, 80.99 - 61.37, 80.83"

這些點來自 100x100 網格,因此第一個點應該在我的 2000*2000 canvas 的右下角。

為此,我有代碼可以找到最大的 X 和 Y,然后重新縮放。

        List<double> MinAndMax(List<Node> spots)
        {
            List<double> retValues = new List<double>();
            double xLowest = spots.Select(s => s.X).Min();
            double xHighest = spots.Select(s => s.X).Max();
            double xDifference = xHighest - xLowest;
            double yLowest = spots.Select(s => s.Y).Min();
            double yHighest = spots.Select(s => s.Y).Max();
            double yDifference = yHighest - yLowest;
            if (xLowest < yLowest)
                retValues.Add(xLowest);
            else
                retValues.Add(yLowest);

            if (xHighest < yHighest)
                retValues.Add(yHighest);
            else
                retValues.Add(xHighest);

            return retValues;
        }
        int Rescale(double oldValue, double oldMin, double oldMax, int newMin, int newMax)
        {
            return Convert.ToInt32(((oldValue - oldMin) * (newMax - newMin) / (oldMax - oldMin)) + newMin);
        }

我這樣稱呼它:

            double zoneMin, zoneMax;
            int lowestCanvas = 150, highestCanvas = 1850;

            List<Node> path = await PathMaker();
            List<double> zoneMinMax = MinAndMax(path);

            zoneMin = zoneMinMax[0];
            zoneMax = zoneMinMax[1];

            foreach (Node spot in path)
            {
                Point point = new Point();
                point.X = Rescale(spot.X, zoneMin, zoneMax, lowestCanvas, highestCanvas);
                point.Y = Rescale(spot.Y, zoneMin, zoneMax, lowestCanvas, highestCanvas);
                NodeSpot dot = new NodeSpot()
                {
                    Name = spot.Name,
                    Location = point,
                    IsInPath = true
                };
                drawingSurface1.Nodes.Add(dot);
            }
            drawingSurface1.Invalidate();

我沒有把我的小路很好地展開,而是在左下角有一個象限的這個奇怪的團塊。 你可以看到團塊

我看不出我哪里錯了。 我需要做什么才能讓我的 14 個點分布在整個拉票上?

您的問題是您要返回一個最小值和一個最大值。 您需要為 X 和 Y 分別設置最小值和最大值,因為每個坐標的范圍都不同。 在問題的示例數據中,X 的范圍是 [-61.92, 61.86],Y 的范圍是 [80.83, 83]。 您的方法將繪制一個覆蓋 [-61.92, -61.92] 到 [83, 83] 的框架,其中大部分點位於一個角上。

您的測試未能發現問題,因為測試用例中的 X 和 Y 值相同。 創建一個 X 值為負而 Y 值為正的測試用例,這將顯示問題。

讓我們以 [[20, 20], [50, 50], [80, 80]] 作為一個簡單的例子。

最小值和最大值將為 20 和 80,所需的比例為 0 到 2000。

對於點 [50, 50]

(((oldValue - oldMin) * (newMax - newMin) / (oldMax - oldMin)) + newMin)

((50 - 20) * (2000 - 0) / (80 - 20)) + 0
= 30*2000 / 60
= 1000 (which is half the size of the canvas)

看起來連貫所以問題不是來自轉換 function

我建議嘗試通過打印“點”的 [X, Y] 值來調試它,以確保

同時打印 oldScale 的 min max 以確保這不是問題所在

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM