http://blog.sina.com.cn/s/blog_4b700c4c0100ou6y.html 关于仿射坐标

笛卡尔坐标系

笛卡尔坐标系就是直角坐标系和斜角坐标系的统称。相交于原点的两条数轴,构成了平面放射坐标系(http://www.docin.com/p-4003026.html)。如两条数轴上的度量单位相等,则称此放射坐标系为笛卡尔坐标系。两条数轴互相垂直的笛卡尔坐标系,称为笛卡尔直角坐标系,否则称为笛卡尔斜角坐标系。笛卡尔坐标,它表示了点在空间中的位置,但却和直角坐标有区别,两种坐标可以相互转换。

简介

  笛卡尔坐标系 (Cartesian coordinates) 就是 直角坐标系 和斜角坐标系的统称。
  相交于原点的两条数轴,构成了平面放射坐标系。如两条数轴上的度量单位相等,则称此放射坐标系为笛卡尔坐标系。两条数轴互相垂直的笛卡尔坐标系,称为笛卡尔直角坐标系,否则称为笛卡尔斜角坐标系。

推广

  放射坐标系和笛卡尔坐标系平面向空间的推广
  相交于原点的三条不共面的数轴构成空间的放射坐标系。三条数轴上度量单位相等的放射坐标系被称为空间笛卡尔坐标系。三条数轴互相垂直的笛卡尔坐标系被称为空间笛卡尔直角坐标系,否则被称为空间笛卡尔斜角坐标系。
  笛卡尔坐标,它表示了点在空间中的位置,但却和直角坐标有区别,两种坐标可以相互转换。举个例子:某个点的笛卡尔坐标是493 ,454, 967,那它的X轴坐标就是4+9+3=16,Y轴坐标是4+5+4=13,Z轴坐标是9+6+7=22,因此这个点的直角坐标是(16, 13, 22),坐标值不可能为负数(因为三个自然数相加无法成为负数)。

产生

  笛卡尔和笛卡尔坐标系的产生
  据说有一天, 法国 哲学家、数学家笛卡尔生病卧床,病情很重,尽管如此他还反复思考一个问题:几何图形是直观的,而代数方程是比较抽象的,能不能把几何图形与代数方程结合起来,也就是说能不能用几何图形来表示方程呢?要想达到此目的,关键是如何把组成几何图形的点和满足方程的每一组“数”挂上钩,他苦苦思索,拼命琢磨,通过什么样的方法,才能把“点”和“数”联系起来。突然,他看见屋顶角上的一只蜘蛛,拉着丝垂了下来,一会功夫,蜘蛛又顺着丝爬上去,在上边左右拉丝。蜘蛛的“表演”使笛卡尔的思路豁然开朗。他想,可以把蜘蛛看做一个点,它在屋子里可以上、下、左、右运动,能不能把蜘蛛的每个位置用一组数确定下来呢?他又想,屋子里相邻的两面墙与地面交出了三条线,如果把地面上的墙角作为起点,把交出来的三条线作为三根数轴,那么空间中任意一点的位置就可以用这三根数轴上找到有顺序的三个数。反过来,任意给一组三个有顺序的数也可以在空间中找出一点P与之对应,同样道理,用一组数(x、y)可以表示平面上的一个点,平面上的一个点也可以有用一组两个有顺序的数来表示,这就是坐标系的雏形。
  直角坐标系的创建,在代数和几何上架起了一座桥梁,它使几何概念用数来表示,几何图形也可以用代数形式来表示。由此笛卡尔在创立直角坐标系的基础上,创造了用代数的方法来研究几何图形的数学分支——解析几何,他大胆设想:如果把几何图形看成是动点的 运动轨迹 ,就可以把几何图形看成是由具有某种共同特征的点组成的。举一个例子来说,我们可以把圆看作是动点到定点距离相等的点的轨迹,如果我们再把点看作是组成几何图形的基本元素,把数看作是组成方程的解,于是代数和几何就这样合为一家人了。
 
 
 
 
 
 
 
仿射变换是空间直角坐标变换的一种,它是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直线”和“平行性”,其可以通过一系列的原子变换的复合来实现,包括平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)。

此类变换可以用一个3×3的矩阵来表示,其最后一行为(0, 0, 1)。该变换矩阵将原坐标(x, y)变换为新坐标(x', y'),这里原坐标和新坐标皆视为最末一行为(1)的三维列向量,原列向量左乘变换矩阵得到新的列向量:

[x']   [m00 m01 m02] [x]   [m00*x+m01*y+m02]

[y'] = [m10 m11 m12] [y] = [m10*x+m11*y+m12]

[1 ]   [ 0    1 ] [1]             ]

用代数式表示如下:

x’ = m00*x+m01*y+m02;

             y’ = m10*x+m11*y+m12;

如果将它写成按旋转、缩放、平移三个分量的复合形式,则其代数式如下:

X= (x-x0)cosθ+(y-y0)sinθ+x0
Y=-(x-x0)sinθ+(y-y0)cosθ+y0

 


    其示意图如下:


几种典型的仿射变换:

1.public static AffineTransform getTranslateInstance(double tx, double ty)

平移变换,将每一点移动到(x+tx, y+ty),变换矩阵为:

      tx  ]

      ty  ]

       ]

(译注:平移变换是一种“刚体变换”,rigid-body transformation,中学学过的物理,都知道啥叫“刚体”吧,就是不会产生形变的理想物体,平移当然不会改变二维图形的形状。同理,下面的“旋转变换”也是刚体变换,而“缩放”、“错切”都是会改变图形形状的。)

2.public static AffineTransform getScaleInstance(double sx, double sy)

缩放变换,将每一点的横坐标放大(缩小)至sx倍,纵坐标放大(缩小)至sy倍,变换矩阵为:

  sx      ]

    sy    ]

       ]

3.public static AffineTransform getShearInstance(double shx, double shy)

剪切变换,变换矩阵为:

   shx    ]

shy      ]

       ]

相当于一个横向剪切与一个纵向剪切的复合

         ][    shx    ]

shy       ][       ]

         ][        ]

(译注:“剪切变换”又称“错切变换”,指的是类似于四边形不稳定性那种性质,街边小商店那种铁拉门都见过吧?想象一下上面铁条构成的菱形拉动的过程,那就是“错切”的过程。)

4.public static AffineTransform getRotateInstance(double theta)

旋转变换,目标图形围绕原点顺时针旋转theta弧度,变换矩阵为:

  cos(theta)    -sin(theta)     ]

  sin(theta)     cos(theta)     ]

                          ]

5.public static AffineTransform getRotateInstance(double theta, double x, double y)

旋转变换,目标图形以(x, y)为轴心顺时针旋转theta弧度,变换矩阵为:

  cos(theta)    -sin(theta)    x-x*cos+y*sin]

  sin(theta)     cos(theta)    y-x*sin-y*cos ]

                                    ]

相当于两次平移变换与一次原点旋转变换的复合:

[1  -x][cos(theta)  -sin(theta)  0][1  x]

[0  -y][sin(theta)   cos(theta)  0][0  y]

[0  1 ][                  1 ][0  1]

三、仿射变换四参数求解

A、C#自定义函数实现求解:

        1、求解旋转参数Rotaion:

 

 ///
       ///获取旋转角度 
       /// 
       ///源点1 
       ///目标点1 
        ///源点2 
        ///目标点2 
        ///返回旋转角度 
        private double GetRotation(CoordPoint fromPoint1, CoordPoint toPoint1,CoordPoint fromPoint2,CoordPoint toPoint2)
        {
            double a = (toPoint2.Y - toPoint1.Y) * (fromPoint2.X - fromPoint1.X) - (toPoint2.X - toPoint1.X) * (fromPoint2.Y - fromPoint1.Y);
            double b = (toPoint2.X - toPoint1.X) * (fromPoint2.X - fromPoint1.X) + (toPoint2.Y - toPoint1.Y) * (fromPoint2.Y - fromPoint1.Y);
            
            if (Math.Abs(b) > 0)
                return Math.Tan(a / b);
            else
                return Math.Tan(0);            
        }
        2、求解缩放比例参数(Scale):

 


///
       ///获取缩放比例因子 
       /// 
       ///源点1 
       ///目标点1 
        ///源点2 
        ///目标点2 
        ///旋转角度 
        ///返回旋转因子 
        private double GetScale(CoordPoint fromPoint1, CoordPoint toPoint1, CoordPoint fromPoint2, CoordPoint toPoint2, double rotation)
        {
            double a = toPoint2.X - toPoint1.X;
            double b = (fromPoint2.X - fromPoint1.X) * Math.Cos(rotation) - (fromPoint2.Y - fromPoint1.Y)*Math.Sin(rotation);
            if (Math.Abs(b) > 0)
                return a / b;
            else
                return 0;
        }

       3、求解X方向偏移距离参数(XTranslate):

 

 ///
       ///得到X方向偏移量 
       /// 
       ///源点1 
       ///目标点1 
        ///旋转角度 
        ///缩放因子 
        ///返回X方向偏移量 
        private double GetXTranslation(CoordPoint fromPoint1,CoordPoint toPoint1,double rotation,double scale)
        {
            return (toPoint1.X - scale * (fromPoint1.X * Math.Cos(rotation) - fromPoint1.Y * Math.Sin(rotation)));
        }


      4、求解Y方向偏移距离参数(YTranslate):

 

 ///

      ///得到Y方向偏移量 

      /// 

      ///源点1 

      ///目标点1 

       ///旋转角度 

       ///缩放因子 

       ///返回Y方向偏移量 

       private double GetYTranslation(CoordPoint fromPoint1, CoordPoint toPoint1, double rotation, double scale)

       {

           return (toPoint1.Y - scale * (fromPoint1.X * Math.Sin(rotation) + fromPoint1.Y * Math.Cos(rotation)));

       }
       B、C#+AE求解:

 

 


 ///

       ///从控制点定义仿射变换程式 

       /// 

       ///源控制点 

       ///目标控制点 

        ///返回变换定义 

        private ITransformation GetAffineTransformation(IPoint[] pFromPoints, IPoint[] pToPoints)

        {

            //实例化仿射变换对象 

            IAffineTransformation2D3GEN tAffineTransformation = new AffineTransformation2DClass();

            //从源控制点定义参数 

            tAffineTransformation.DefineFromControlPoints(ref pFromPoints, ref pToPoints);

            //查询引用接口 

            ITransformation tTransformation = tAffineTransformation as ITransformation;

            return tTransformation;

        }
四、空间对象转换

求出参数后,再利用公式对相应坐标点进行转换是一件相对简单的事件了。

示例代码:

 

 ///

      ///从控制点定义仿射变换程式 

      /// 

      ///源控制点 

      ///目标控制点 

       ///返回变换定义 

       private ITransformation GetAffineTransformation(IPoint[] pFromPoints, IPoint[] pToPoints)

       {

           //实例化仿射变换对象 

           IAffineTransformation2D3GEN tAffineTransformation = new AffineTransformation2DClass();

           //从源控制点定义参数 

           tAffineTransformation.DefineFromControlPoints(ref pFromPoints, ref pToPoints);

           //查询引用接口 

           ITransformation tTransformation = tAffineTransformation as ITransformation;

           return tTransformation;

       }

 

 
 
仿射变换
在几何上定义为两个向量空间之间的一个仿射变换或者仿射映射(来自拉丁语,affinis,“和...相关”)由一个线性变换接上一个平移组成。
原理
  在有限维的情况,每个仿射变换可以由一个矩阵A和一个向量  双仿射变换
b给出,它可以写作A和一个附加的列b。一个仿射变换对应于一个矩阵和一个向量的乘法,而仿射变换的复合对应于普通的矩阵乘法,只要加入一个额外的行到矩阵的底下,这一行全部是0除了最右边是一个1,而列向量的底下要加上一个1。
 
仿射变换流程图
AffineTransform类描述了一种二维仿射变换的功能,它是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”(译注: straightness,即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(译注:parallelness,其实是指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变。大二学过的复变,“保形变换/保角变换”都还记得吧,数学就是王道啊!)。仿射变换可以通过一系列的原子变换的复合来实现,包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和错切(Shear)。  此类变换可以用一个3×3的矩阵来表示,其最后一行为(0, 0, 1)。该变换矩阵将原坐标(x, y)变换为新坐标(x', y'),这里原坐标和新坐标皆视为最末一行为(1)的三维列向量,原列向量左乘变换矩阵得到新的列向  常用的仿射变换:旋转、倾斜、平移、缩放
量:   [x'] [m00 m01 m02] [x] [m00*x+m01*y+m02]   [y'] = [m10 m11 m12] [y] = [m10*x+m11*y+m12]   [1 ] [0 0 1 ] [1] [ 1 ]
示例
  几种典型的仿射变换:   public static AffineTransform getTranslateInstance(doubl  仿射变换-例
e tx, double ty)   平移变换,将每一点移动到(x+tx, y+ty),变换矩阵为:   [ 1 0 tx ]   [ 0 1 ty ]   [ 0 0 1 ]   (译注:平移变换是一种“刚体变换”,rigid-body transformation,中学学过的物理,都知道啥叫“刚体”吧,就是不会产生形变的理想物体,平移当然不会改变二维图形的形状。同理,下面的“旋转变换”也是刚体变换,而“缩放”、“错切”都是会改变图形形状的。)  public static AffineTransform getScaleInstance(double sx, double sy)     缩放变换,将每一点的横坐标放大(缩小)至sx倍,纵坐标放大(缩小)至sy倍,变换矩阵为:   [ sx 0 0 ]   [ 0 sy 0 ]   [ 0 0 1 ]   当sx=sy时,称为尺度缩放,sx不等于sy时,这就是我们平时所说的拉伸变换。  public static AffineTransform getShearInstance(double shx, double shy)     剪切变换,变换矩阵为:   [ 1 shx 0 ]   [ shy 1 0 ]   [ 0 0 1 ]   相当于一个横向剪切与一个纵向剪切的复合   [ 1 0 0 ][ 1 shx 0 ]   [ shy 1 0 ][ 0 1 0 ]   [ 0 0 1 ][ 0 0 1 ]   (译注:“剪切变换”又称“错切变换”,指的是类似于四边形不稳定性那种性质,街边小商店那种铁拉门都见过吧?想象一下上面铁条构成的菱形拉动的过程,那就是“错切”的过程。)  public static AffineTransform getRotateInstance(double theta)     典型的仿射变换-平移变换
   典型的仿射变换-缩放变换
 
  典型的仿射变换-剪切变换
   典型的仿射变换-旋转变换
 
  典型的仿射变换-旋转变换
 
 
相关例子
     旋转变换1,目标图形围绕原点顺时针旋转theta弧度,变换矩阵为:   [ cos(theta) -sin(theta) 0 ]   [ sin(theta) cos(theta) 0 ]   [ 0 0 1 ]   public static AffineTransform getRotateInstance(double theta, double x, double y)      旋转变换2,目标图形以(x, y)为轴心顺时针旋转theta弧度,变换矩阵为:   [ cos(theta) -sin(theta) x-x*cos+y*sin]   [ sin(theta) cos(theta) y-x*sin-y*cos ]   [ 0 0 1 ]   相当于两次平移变换与一次原点旋转变换的复合:   [1 0 x][cos(theta) -sin(theta) 0][1 0- x]   [0 1 y][sin(theta) cos(theta) 0][0 1 -y]   [0 0 1 ][ 0 0 1 ][0 0 1]   这里是以空间任一点为圆心旋转的情况。
 
 
 
 

仿射几何学

  研究图形在仿射变换下不变性质的几何学分支学科。设V是一个 n维向量空间,A是一个集合,其中元素称为点。如果对A中每两个点PQ都惟一对应着V中的一个向量并且这种对应规则还满足:(1)(V中零向量),(2)任给P点和V中向量a,总惟一存在点Q使,(3)对A中任意三点PQM ,成立则称A为一个n维仿射空间。n=2时,称为仿射平面。

仿射几何学

  研究图形在仿射变换下不变性质的几何学分支学科。设V是一个 n维向量空间,A是一个集合,其中元素称为点。如果对A中每两个点PQ都惟一对应着V中的一个向量并且这种对应规则还满足:(1)(V中零向量),(2)任给P点和V中向量a,总惟一存在点Q使,(3)对A中任意三点PQM ,成立则称A为一个n维仿射空间。n=2时,称为仿射平面。
  在仿射空间中取定一点O,那么任意一点P就惟一地与V中的向量对应,称为P点关于点O的位置向量。点O也常称为原点。因此,取定原点后,仿射空间A就与向量空间V建立起双方一一的对应。由此,就可以建立起仿射空间中的仿射坐标系(见
坐标系)。
  对于向量空间Vk维子空间 Vk(0<kn)和A中点P,集合称为A的仿射子空间,它是过点P的一个k维仿射空间。如果A的子集是仿射空间,必能表为上面形式。特别当k=1时,A称为过P的直线;k=2时,称为平面;k=n-1时,称为超平面。
  仿射空间中最重要的变换是
仿射变换,它的特征是将共线的三点变为共线的三点。给定仿射坐标系后,仿射变换有明确的代数表示。仿射变换全体构成的变换群称为仿射变换群。仿射变换下重要的不变性质和不变量有:共线性、平行性、平行线段的长度比等。
  如果在仿射平面(或空间)中引入无穷远点,并且将它们与原有点不加区别,则就成为射影平面(或空间)。在射影平面(或空间)中指定一条(或一个)直线l(或超平面π),那么射影变换群中保持l(或π)不动的变换就构成一个与仿射变换群同构的变换子群。从这个意义上讲,仿射变换群就是射影变换群的子群,而仿射几何也就成为射影几何的子几何(见
射影几何学)。
  参考书目
 苏步青编:《高等几何讲义》,上海科学技术出版社,上海,1964。
 方德植,陈奕培编:《射影几何》,高等教育出版社,北京,1983。

  在仿射空间中取定一点O,那么任意一点P就惟一地与V中的向量对应,称为P点关于点O的位置向量。点O也常称为原点。因此,取定原点后,仿射空间A就与向量空间V建立起双方一一的对应。由此,就可以建立起仿射空间中的仿射坐标系(见 坐标系 )。
  对于向量空间Vk维子空间 Vk(0<kn)和A中点P,集合称为A的仿射子空间,它是过点P的一个k维仿射空间。如果A的子集是仿射空间,必能表为上面形式。特别当k=1时,A称为过P的直线;k=2时,称为平面;k=n-1时,称为超平面。
  仿射空间中最重要的变换是
仿射变换 ,它的特征是将共线的三点变为共线的三点。给定仿射坐标系后,仿射变换有明确的代数表示。仿射变换全体构成的变换群称为仿射变换群。仿射变换下重要的不变性质和不变量有:共线性、平行性、平行线段的长度比等。
  如果在仿射平面(或空间)中引入无穷远点,并且将它们与原有点不加区别,则就成为射影平面(或空间)。在射影平面(或空间)中指定一条(或一个)直线l(或超平面π),那么射影变换群中保持l(或π)不动的变换就构成一个与仿射变换群同构的变换子群。从这个意义上讲,仿射变换群就是射影变换群的子群,而仿射几何也就成为射影几何的子几何(见
射影几何学 )。
  参考书目
 苏步青编:《高等几何讲义》,上海科学技术出版社,上海,1964。
 方德植,陈奕培编:《射影几何》,高等教育出版社,北京,1983。
 
 

仿射变换

  仿射平面(或空间)到自身的一类变换,最重要的性质是保持点的共线性(或共面性)以及保持直线的平行性。作为最常见的例子,首先引进两平面间的平行投影,设已知两平面ππ┡,d是与两平面都不平行的向量,过平面 π上各点AB、C、…分别作与d平行的直线交π┡于A┡、B┡、C┡、…,于是ππ┡各点间存在着一一对应的关系,这项对应关系叫做ππ┡的平行投影。AA┡,BB┡,C与C┡…为平行投影下的对应点,显见平行投影与 d有关。两平面间的平行投影具有以下重要性质:点变点;直线变直线;点与直线的结合关系不变。共线三点的简比不变,即其中A┡、B┡、C┡分别是共线三点AB、C的对应点,平面π上的两条平行线,对应着平面π┡上的两条直线,也是平行的(图1)。当把π经过一系列平行投影,最后仍变到π本身的一一变换,就是一个仿影变换。在此情况下,上述性质也是保留的。将平行投影的概念加以推广,即得到下面的重要概念。
  两平面间的一一对应,如满足共线三点的对应点仍是共线三点;则此一一对应,叫仿射对应。如果两平面重合,就叫平面到它本身的仿射变换。因为仿射变换之积,仍是仿射变换;任一个仿射变换的逆,仍是仿射变换,故平面内所有仿射变换的集合成群(见
变换群),叫做仿射变换群。它是射影变换群的子群。类似地可定义空间的仿射变换及仿射变换群。
  仿射性质与仿射不变量  按照依变换群将几何学分类的观点,图形在仿射变换群下的不变性质和不变的量叫做仿射性质和仿射不变量。研究图形仿射性质的几何分支就称为仿射几何学。例如同素性(点变成点,直线变成直线)、结合性(点在线上或直线通过点)都是基本的仿射不变性,简比则是基本的仿射不变量。而且还可推出,二直线的平行性、平行线段的比、封闭图形面积的比等,都是在仿射变换下不变的。又如关于二次曲线的中心、直径及共轭径等,都是平面仿射几何的研究对象,因为它们都是仿射性质。
  仿射坐标系  见
坐标系
  仿射变换的代数表示  设给定平面上一个仿射坐标系{O;e1,e2},仿射变换将点P变为点P┡,并将坐标系{Oe1,e2}变为坐标系{O┡;e姈,e娦} (图2
)。若令则e1,e2e姈,e娦分别为新旧两坐标轴上的坐标向量。设PP┡,e姈,e娦,O┡在{O;e1,e2}下的坐标,分别是P(x,y),P┡(x┡,y′),e姈(α11,α21),e娦(α12,α22),O┡(α13,α23),如果要求出PP┡坐标间的关系。由于仿射变换保持平行性,故OPPP仍为平行四边形,又由于仿射变换保持简比不变,所以P┡在{O┡;e姈,e娦}下的坐标仍为(x,y)。根据向量的加法及向量的坐标表达,则有:

 

 

比较以上二式,得

     (1)

由于e姈,e娦不平行,故又有

     (2)

满足(2)的(1)式,就是仿射变换的代数表示式。利用仿射变换的代数表示,对问题的解决将有很大的方便,同时也便于将它推广到高维空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值