C#中的旋转矩阵绘制出怪异的形状

问题描述:

我正在尝试围绕圆的圆周来转换一个点。C#中的旋转矩阵绘制出怪异的形状

为了测试我的代码,我只需要翻译该点并为每个角度增量画一条从中心到翻译点的直线。

这应该看起来像一个自行车轮,但它看起来更像一个铲子。奇怪的是,我是否在数学函数中使用了弧度或度数似乎是一样的。

for (double degrees = 0; degrees <= 360; degrees += 1) 
{ 
    double radians = Math.PI * degrees/180.0; 
    Console.Write("degrees = " + degrees + " radians = " + radians); 
    double sx = 0.0; 
    double sy = -100.0; 
    sx = ((sx * Math.Cos(radians)) + (sy * Math.Sin(radians))); 
    sy = (-(sx * Math.Sin(radians)) + (sy * Math.Cos(radians))); 

    Console.WriteLine(", sx = " + sx + ", sy = " + sy); 

    g.DrawLine(new Pen(Brushes.GhostWhite), 200, 200, (int)sx+200, (int)sy+200); 
} 

所以你数学是正确的。你使用这个矩阵来计算旋转。

[cos(r) sin(r)] 
[-sin(r) cos(r)] 

但是你的编码是错的!

在使用它计算sy之前,您已将sx更改为旋转值!

您正在对x和y按顺序执行计算,而在矩阵中,它们是同时完成的。所以,你的y坐标被错误地计算,使用剪切坐标系统,因为它是...

你需要这样做:

double sx = 0.0; 
double sy = -100.0; 
double nsx = ((sx * Math.Cos(radians)) + (sy * Math.Sin(radians))); 
double nsy = (-(sx * Math.Sin(radians)) + (sy * Math.Cos(radians))); 

g.DrawLine(new Pen(Brushes.GhostWhite), 200, 200, (int)nsx+200, (int)nsy+200); 
+0

gah为什么我没有看到/ facepalm – amcashcow

double radius = 200; 

    for (double degrees = 0; degrees <= 360; degrees += 1) 
    { 
     double radians = Math.PI * degrees/180.0; 

     int sx = (int) (200 + radius * Math.Cos(radians)); 
     int sy = (int) (200 + radius * Math.Sin(radians)); 

     g.DrawLine(new Pen(Brushes.GhostWhite), 200, 200, sx, sy); 
    } 
+1

代码的解释改变了你这样做将使这一个实际的答案。 –

我认为这是一个纯粹的数学问题。尝试:

double radius = 100; 
double sx = radius * Math.Cos(radians); 
double sy = radius * Math.Sin(radians);