以 Windows 格式重新缩放图像
Rescaling Image in Windows Form
我有一组要在 2000x2000 canvas 上显示的点。 Here is an example: "61.86, 83 - 61.79, 82.91 - 61.77, 82.77 - 61.92, 82.76 - 61.75, 82.7 - 61.79, 82.58 - 61.85, 82.46 - 61.79, 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 分分布在 canvass 上?
我们以 [[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)
看起来很连贯,所以问题不是来自变换函数
我建议尝试通过打印“点”的 [X, Y] 值来调试它,以确保
同时打印 oldScale 的 min max 以确保这不是问题所在
您的问题是您返回了一个最小值和一个最大值。您需要为 X 和 Y 分别设置最小值和最大值,因为每个坐标的范围都不同。在问题的示例数据中,X 的范围是 [-61.92, 61.86],Y 的范围是 [80.83, 83]。您的方法将绘制一个覆盖 [-61.92, -61.92] 到 [83, 83] 的框架,其中大部分点位于一个角上。
您的测试未能发现问题,因为测试用例中的 X 和 Y 值相同。创建一个X值为负,Y值为正的测试用例,这将显示问题。
我有一组要在 2000x2000 canvas 上显示的点。 Here is an example: "61.86, 83 - 61.79, 82.91 - 61.77, 82.77 - 61.92, 82.76 - 61.75, 82.7 - 61.79, 82.58 - 61.85, 82.46 - 61.79, 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 分分布在 canvass 上?
我们以 [[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)
看起来很连贯,所以问题不是来自变换函数
我建议尝试通过打印“点”的 [X, Y] 值来调试它,以确保
同时打印 oldScale 的 min max 以确保这不是问题所在
您的问题是您返回了一个最小值和一个最大值。您需要为 X 和 Y 分别设置最小值和最大值,因为每个坐标的范围都不同。在问题的示例数据中,X 的范围是 [-61.92, 61.86],Y 的范围是 [80.83, 83]。您的方法将绘制一个覆盖 [-61.92, -61.92] 到 [83, 83] 的框架,其中大部分点位于一个角上。
您的测试未能发现问题,因为测试用例中的 X 和 Y 值相同。创建一个X值为负,Y值为正的测试用例,这将显示问题。