数学可视化(01)——坐标转换与距离

  1. 1. 本质
  2. 2. 图形渲染中常用的距离的类型
    1. 2.1. 欧式距离
    2. 2.2. 曼哈顿距离
    3. 2.3. 切比雪夫距离
    4. 2.4. 马氏距离

 

本质

  • 本质是构造一个造型函数(Sharping Function)
  • 输入是一个二维的向量坐标XY,输出是一个三维向量RGB
  • 在CPUSample中,输入的是分辨率下的像素索引i,j
  • 在GPUSample中,输入的是屏幕坐标u,v
  • 也就是说,我们默认屏幕处于正交笛卡尔坐标系的第四象限,即平面直角坐标系下的第四象限

  • 造型函数:c.rgb = uv.xxx;
  • c.rgb = uv.yyy;
  • c.rgb = half3(uv.x, 0, uv.y);

  • 第四象限改为第一象限,只需将uv的y方向颠倒即可
  • uv.y = 1.0 - uv.y;
  • 这样uv的y方向就与Unity默认的y方向就一致了

  • 如果想显示整个四个象限,将原点从(0,0)移动到屏幕中心
  • 具体做法是:uv = uv * 2.0 - 1.0;
  • 这样将[0,1]的区间变成[-1,1]的区间

图形渲染中常用的距离的类型

  • 以下都以四象限为例:
  • uv = uv * 2.0 - 1.0;

欧式距离


  • c = sqrt((pow(uv.y, 2) + pow(uv.x, 2)) * 0.5);
  • * 0.5 是为了不出现>1.0的白色的截断的值,使颜色过渡更平滑

曼哈顿距离

  • x、y轴轴距绝对值的总和
  • 如上图,绿色的线代表欧式距离,其他线是两点间等效的曼哈顿距离
  • c = (abs(uv.y) + abs(uv.x)) * 0.5;

切比雪夫距离

  • 也叫做棋盘距离
  • c = max(abs(uv.y), abs(uv.x));

马氏距离

  • 是一种特殊的欧氏距离,要考虑不同量度特性间的联系
  • 要考虑不同维度间,数据的协方差来计算距离
  • 要将量度转换到同一维度下,再计算欧氏距离
  • 屏幕的宽度高度属于不同维度,如果不统一量度,会造成图形的拉伸
  • 为了图形不被拉伸,需要将宽高转换到同一量度上
  • half co = h / w;
    c = sqrt((pow(uv.y * co, 2) + pow(uv.x, 2)) * 0.5);