优化温差图绘制逻辑:更新代码注释,明确基于光标视觉大小的画笔缩放实现原理

This commit is contained in:
zqm
2025-11-10 17:14:31 +08:00
parent d945a37a55
commit a96e2e3a6b

View File

@@ -652,11 +652,15 @@ namespace JoyD.Windows.CS
// 获取相对于图像的坐标作为矩形起始点 // 获取相对于图像的坐标作为矩形起始点
Point imagePoint = ControlPointToImagePoint(e.Location); Point imagePoint = ControlPointToImagePoint(e.Location);
// 计算画笔大小在图像坐标系统中的缩放值 // 画笔大小应该基于鼠标光标的实际视觉大小
// 在控件坐标系中,画笔大小就是用户感知的光标大小
// 需要将控件坐标系统中的画笔大小转换为图像坐标系统
// 计算反向缩放比例:将控件坐标转换为图像坐标的比例
float scaleX = (float)picBoxTemp.Image.Width / picBoxTemp.ClientSize.Width; float scaleX = (float)picBoxTemp.Image.Width / picBoxTemp.ClientSize.Width;
float scaleY = (float)picBoxTemp.Image.Height / picBoxTemp.ClientSize.Height; float scaleY = (float)picBoxTemp.Image.Height / picBoxTemp.ClientSize.Height;
// 按下鼠标时初始框以鼠标位置为中心,大小为画笔大小(根据缩放比例调整) // 按下鼠标时初始框以鼠标位置为中心,大小为画笔大小(根据图像缩放比例调整)
// 这样无论图像如何缩放,画笔大小在用户视觉上始终保持与光标大小一致
float scaledHalfBrushSizeX = _currentBrushSize / 2 * scaleX; float scaledHalfBrushSizeX = _currentBrushSize / 2 * scaleX;
float scaledHalfBrushSizeY = _currentBrushSize / 2 * scaleY; float scaledHalfBrushSizeY = _currentBrushSize / 2 * scaleY;
@@ -1280,7 +1284,8 @@ namespace JoyD.Windows.CS
// 获取相对于图像的当前坐标 // 获取相对于图像的当前坐标
Point currentImagePoint = ControlPointToImagePoint(e.Location); Point currentImagePoint = ControlPointToImagePoint(e.Location);
// 计算矩形参数:左上点是起笔方块的左上点,右下点是当前鼠标位置+画笔一半的宽高(考虑缩放比例 // 计算矩形参数:左上点是起笔方块的左上点,右下点是当前鼠标位置+画笔一半的宽高(基于光标大小
// 使用反向缩放比例:将控件坐标中的光标大小转换为图像坐标
float scaleX = (float)picBoxTemp.Image.Width / picBoxTemp.ClientSize.Width; float scaleX = (float)picBoxTemp.Image.Width / picBoxTemp.ClientSize.Width;
float scaleY = (float)picBoxTemp.Image.Height / picBoxTemp.ClientSize.Height; float scaleY = (float)picBoxTemp.Image.Height / picBoxTemp.ClientSize.Height;
float scaledHalfBrushSizeX = _currentBrushSize / 2 * scaleX; float scaledHalfBrushSizeX = _currentBrushSize / 2 * scaleX;
@@ -1288,7 +1293,7 @@ namespace JoyD.Windows.CS
int x = _rectangleStartPoint.X; int x = _rectangleStartPoint.X;
int y = _rectangleStartPoint.Y; int y = _rectangleStartPoint.Y;
// 右下角为当前鼠标位置+画笔一半的宽高(根据缩放比例调整 // 右下角为当前鼠标位置+画笔一半的宽高(基于光标大小转换
Point endPoint = new Point( Point endPoint = new Point(
(int)(currentImagePoint.X + scaledHalfBrushSizeX), (int)(currentImagePoint.X + scaledHalfBrushSizeX),
(int)(currentImagePoint.Y + scaledHalfBrushSizeY) (int)(currentImagePoint.Y + scaledHalfBrushSizeY)
@@ -1771,7 +1776,8 @@ namespace JoyD.Windows.CS
// 获取相对于图像的当前坐标 // 获取相对于图像的当前坐标
Point currentImagePoint = ControlPointToImagePoint(e.Location); Point currentImagePoint = ControlPointToImagePoint(e.Location);
// 计算矩形参数:左上点是起笔方块的左上点,右下点是当前鼠标位置+画笔一半的宽高(考虑缩放比例 // 计算矩形参数:左上点是起笔方块的左上点,右下点是当前鼠标位置+画笔一半的宽高(基于光标大小
// 使用反向缩放比例:将控件坐标中的光标大小转换为图像坐标
float scaleX = (float)picBoxTemp.Image.Width / picBoxTemp.ClientSize.Width; float scaleX = (float)picBoxTemp.Image.Width / picBoxTemp.ClientSize.Width;
float scaleY = (float)picBoxTemp.Image.Height / picBoxTemp.ClientSize.Height; float scaleY = (float)picBoxTemp.Image.Height / picBoxTemp.ClientSize.Height;
float scaledHalfBrushSizeX = _currentBrushSize / 2 * scaleX; float scaledHalfBrushSizeX = _currentBrushSize / 2 * scaleX;
@@ -1779,7 +1785,7 @@ namespace JoyD.Windows.CS
int x = _rectangleStartPoint.X; int x = _rectangleStartPoint.X;
int y = _rectangleStartPoint.Y; int y = _rectangleStartPoint.Y;
// 右下角为当前鼠标位置+画笔一半的宽高(根据缩放比例调整 // 右下角为当前鼠标位置+画笔一半的宽高(基于光标大小转换
Point endPoint = new Point( Point endPoint = new Point(
(int)(currentImagePoint.X + scaledHalfBrushSizeX), (int)(currentImagePoint.X + scaledHalfBrushSizeX),
(int)(currentImagePoint.Y + scaledHalfBrushSizeY) (int)(currentImagePoint.Y + scaledHalfBrushSizeY)