You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
}

补充说明

如果你的旋转需求是绕指定中心点而非坐标原点,只需要在旋转计算前做坐标偏移处理即可:

  1. 计算当前点和旋转中心点的差值
  2. 用差值乘以旋转矩阵得到旋转后的偏移量
  3. 偏移量加回旋转中心点坐标得到最终旋转后的点坐标

内容的提问来源于stack exchange,提问作者abdou93

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:24:04