测试代码:
mg_line testline = new mg_line(new PointF(200, 200), new PointF(400, 500));
Graphics g = e.Graphics;
g.DrawLine(new Pen(Brushes.Red), testline.pt_start, testline.pt_end);
testline.直线旋转(new PointF(0, 0), -0.523);//30度
g.DrawLine(new Pen(Brushes.Green), testline.pt_start, testline.pt_end);
testline.直线旋转(testline.pt_end, -1.57);//90度
g.DrawLine(new Pen(Brushes.Blue), testline.pt_start, testline.pt_end);
效果如下:
看上去,好像长度不对,怕错?测了长度,相等,ok,再次放心(我们矩阵变换类是随手写的,当然要验证),下面又捋了捋这两个类,前面太乱,现在顺眼多了(把以前的类精简到最少,需要了再增加):
class 矩阵变换
{
public double[,] 单位矩阵 = new double[3, 3];//单位矩阵
public 矩阵变换()
{
int i, j;
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
{
if (i == j) 单位矩阵[i, j] = 1;
else 单位矩阵[i, j] = 0;
}
}
}
class 矩阵变换EX : 矩阵变换
{
public void 点平移(PointF 指定点, ref PointF sp)
{
矩阵变换 M = new 矩阵变换();
M.单位矩阵[2, 0] = -指定点.X;
M.单位矩阵[2, 1] = -指定点.Y;
double x, y;
x = M.单位矩阵[0, 0] * sp.X + M.单位矩阵[1, 0] * sp.Y + M.单位矩阵[2, 0];
y = M.单位矩阵[0, 1] * sp.X + M.单位矩阵[1, 1] * sp.Y + M.单位矩阵[2, 1];
sp.X = (float)x;
sp.Y = (float)y;
}
public void 原点旋转(double 弧度, ref PointF sp)
{
矩阵变换 M = new 矩阵变换();
M.单位矩阵[0, 0] = M.单位矩阵[1, 1] = Math.Cos(弧度);//Math.Cos
M.单位矩阵[0, 1] = Math.Sin(弧度);//Math.Sin
M.单位矩阵[1, 0] = -M.单位矩阵[0, 1];
double x, y;
x = M.单位矩阵[0, 0] * sp.X + M.单位矩阵[1, 0] * sp.Y + M.单位矩阵[2, 0];
y = M.单位矩阵[0, 1] * sp.X + M.单位矩阵[1, 1] * sp.Y + M.单位矩阵[2, 1];
sp.X = (float)x;
sp.Y = (float)y;
}
}
public class mg_line
{
public PointF pt_start;
public PointF pt_end;
public mg_line()
{
pt_end = new PointF();
pt_start = new PointF();
}
public mg_line(PointF pstart, PointF pend)
{
pt_start = pstart;
pt_end = pend;
}
public void 直线平移(PointF 指定点)
{
矩阵变换EX temp = new 矩阵变换EX();
temp.点平移(指定点, ref pt_start);
temp.点平移(指定点, ref pt_end);
}
public void 直线旋转(PointF 指定点, double 弧度)
{
矩阵变换EX temp = new 矩阵变换EX();
PointF tempPt=new PointF ();
tempPt.X = -指定点.X; tempPt.Y = -指定点.Y;
直线平移(指定点); //平移
temp.原点旋转(弧度, ref pt_start); //旋转
temp.原点旋转(弧度, ref pt_end);
直线平移(tempPt); //再平移
} }