如何在C# WPF中通过迭代矩阵旋转生成连续的新坐标点
累积旋转生成序列点的实现方法
你现有代码的核心问题是:每次循环都重新读取初始坐标生成原始点,旋转操作始终基于初始坐标计算,没有把上一次的旋转结果作为下一次旋转的输入,因此无法实现「A旋转得B、B旋转得C」的递进效果。
修改思路
- 在循环外初始化初始两个端点,作为第一轮操作的基准
- 每轮循环先绘制当前两点组成的线段
- 基于当前两点计算旋转后的新坐标,将新坐标覆盖赋值给当前点变量,作为下一轮循环的输入
- 修正原代码中
p1/p2应为point1/point2的笔误 - 将画笔、矩阵这类固定对象提到循环外创建,减少不必要的性能损耗
修改后代码
// 初始化初始端点坐标 double currentX1 = 0.5; double currentY1 = 0.1; double currentX2 = 0.3; double currentY2 = 0.4; // 提前定义好旋转矩阵、画笔,避免循环内重复创建浪费性能 System.Windows.Media.Pen pen = new System.Windows.Media.Pen(System.Windows.Media.Brushes.Black, 1); // 循环20次生成20组递进旋转的线段 for(int i = 0; i < 20; i++) { // 生成当前轮次的两个端点 System.Windows.Point point1 = new System.Windows.Point(currentX1, currentY1); System.Windows.Point point2 = new System.Windows.Point(currentX2, currentY2); // 计算当前点旋转后的新点 System.Windows.Point rotatedPoint1 = point1 * rotmatrix; System.Windows.Point rotatedPoint2 = point2 * rotmatrix; // 绘制逻辑 DrawingVisual d = new DrawingVisual(); using (DrawingContext drawingContext = d.RenderOpen()) { // 绘制当前原始线段,若不需要可删除该行 drawingContext.DrawLine(pen, point1, point2); // 绘制当前旋转后的线段 drawingContext.DrawLine(pen, rotatedPoint1, rotatedPoint2); } canvas.Children.Add(new VisualHost { Visual = d }); // 把旋转后的点赋值给当前坐标变量,下一轮循环就用这组新点作为基准 currentX1 = rotatedPoint1.X; currentY1 = rotatedPoint1.Y; currentX2 = rotatedPoint2.X; currentY2 = rotatedPoint2.Y; }
补充说明
如果你的旋转需求是绕指定中心点而非坐标原点,只需要在旋转计算前做坐标偏移处理即可:
- 计算当前点和旋转中心点的差值
- 用差值乘以旋转矩阵得到旋转后的偏移量
- 偏移量加回旋转中心点坐标得到最终旋转后的点坐标
内容的提问来源于stack exchange,提问作者abdou93
相关产品推荐
相关产品推荐

