如何实现600×600画布上图形坐标的90度顺时针旋转?
绕600×600画布中心顺时针旋转90度的坐标转换方案
核心转换公式
针对600×600的画布,中心坐标为(300,300),结合屏幕坐标系(y轴向下)的特性,任意点(x,y)绕中心顺时针旋转90度后的新坐标(x', y')可简化为:
x' = 600 - y y' = x
推导逻辑:
- 计算点相对于中心的偏移:
dx = x - 300,dy = y - 300 - 顺时针旋转90度后的偏移(适配屏幕y轴向下):
dx' = -dy,dy' = dx - 转换回绝对坐标:
x' = 300 + dx' = 600 - y,y' = 300 + dy' = x
正确代码实现
无需计算形状的宽高,直接对每个形状的起始点和结束点单独应用转换公式即可:
foreach (TekeningElement t in getekende_elementen) { // 转换起始点 Point oldStart = t.GetBeginPunt; Point newStart = new Point(600 - oldStart.Y, oldStart.X); // 转换结束点 Point oldEnd = t.GetEindPunt; Point newEnd = new Point(600 - oldEnd.Y, oldEnd.X); // 更新形状坐标 t.SetBeginPunt = newStart; t.SetEindPunt = newEnd; }
原代码问题分析
你原代码中通过宽高(x_verschil/y_verschil)推导新坐标的逻辑存在错误:
- 旋转操作仅与点自身坐标及中心位置相关,无需依赖形状的宽高参数
- 原公式会导致坐标偏移,无法实现正确的绕中心旋转效果
验证示例
以起始点(100,100)、结束点(200,300)的矩形为例:
- 旋转后起始点:
(600-100, 100)→(500,100) - 旋转后结束点:
(600-300, 200)→(300,200)
旋转后的矩形宽为200、高为100,正好是原矩形的高和宽交换,完全符合顺时针旋转90度的预期。
内容的提问来源于stack exchange,提问作者Quinten1208
相关产品推荐
相关产品推荐

