数学坐标和屏幕坐标的转换
在调用windowsAPI画函数图的时候,经常要用到数学坐标到屏幕坐标的转换,因为数学坐标系y轴是朝上的,而屏幕y轴是朝下的,而且一般来说,函数图像要展现多个象限,如果直接套用屏幕的坐标系,则只能显示第一象限,并且函数图像是要倒立的。
所以我们要使用坐标系变换,把数学坐标变换到屏幕坐标。坐标变换有旋转
和平移
,下面来分别讨论旋转和平移的原理,然后把它们结合在一起,获得一个快速的坐标转换公式
坐标轴旋转基本原理
在极坐标系\(Ox\)中,有\(A\),\(A\prime\)两点,其中\(A\)旋转\(\theta\)角变成\(A\prime\)
如图
我们将其转换为直角坐标系
有
\[A \ \left\{\begin{array}{l} \rho\ \cos\alpha=x \\ \rho\ \sin\alpha=y \end{array}\right. \]
\[A\prime \ \left\{\begin{array}{l} \rho\ cos(\alpha+\theta)=x\prime \\ \rho\ sin(\alpha+\theta)=y\prime \end{array}\right. \]
化简关于\(A\prime\)的式子可得到\(A(x,y)\)和\(A\prime(x\prime,y\prime)\)的关系
\[\left\{\begin{array}{l} \rho\ ( \cos\alpha \cos\theta - \sin\alpha \sin\theta )=x\prime \\ \rho\ (\sin\alpha \cos\theta + \sin\theta\cos\alpha )=y\prime \end{array}\right. \to\]
\[\left\{\begin{array}{l} x\cos\theta - y\sin\theta = x\prime \\ x\sin\theta + y\cos\theta = y\prime \end{array}\right. \]
若使用矩阵表示
\[\begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix} \begin{pmatrix} x\\ y \end{pmatrix}= \begin{pmatrix} x\prime\\ y\prime \end{pmatrix} \]
能发现前者是一个关于\(\theta\)的矩阵,其数学意义就是,\(A\)逆时针旋转\(\theta\)角之后的坐标,它就是所谓的旋转矩阵,数学符号为\(M\)。
很容易发现旋转矩阵是一个正交矩阵,即\(MM^{T}=E=MM^{-1}\)
而屏幕坐标和我们的数学坐标Y轴是相反
的,而X轴却相同。则我们可设x相关的矩阵元素为1,而关于y的为\(\pi\),如下
\[\begin{pmatrix} |\cos\pi|&-\sin\pi\\ \sin\pi&\cos\pi \end{pmatrix} \to \begin{pmatrix} 1& 0\\ 0&-1 \end{pmatrix} \]
坐标轴平移基本原理
这个算是比较简单的了,所以不多赘述,设坐标轴\(X-Y\)的原点为原点, \(X\prime-Y\prime\)的原点在前者坐标系中常量坐标为\((x_{0},y_{0})\)
如图
放在一起
数学坐标到屏幕坐标的转换公式如下
\[\begin{pmatrix} 1& 0\\ 0&-1 \end{pmatrix} \begin{pmatrix} x\\ y \end{pmatrix} + \begin{pmatrix} x_0\\ y_0 \end{pmatrix} = \begin{pmatrix} x\prime\\ y\prime \end{pmatrix} \]
注意,\((x_0,y_0)\)是在\(X\prime-Y\prime\)坐标系下的坐标,就是屏幕坐标。
你就把这个过程想象成数学坐标旋转180°之后,在屏幕坐标上进行平移(实际上屏幕坐标和数学坐标并不是旋转180°的关系,但是你可以这么想象)。
一般来说,我们可以令
\[ \left\{\begin{array}{l} x_0=\frac{PMX}{2} \\ \\ y_0=\frac{PMY}{2} \end{array}\right. \]
其中\((PMX,PMY)\)为屏幕大小