目录
一,直角坐标系
1,数学中的平面坐标系
数学中的平面坐标系只有一种:
2,计算机中的平面坐标系
计算机中,常用的平面坐标系有两种:
第一种是和数学中的比较接近,
第二种是契合阅读顺序,即x=3,y=5对应第三行第5列
opencv中,at函数是第二种坐标系,矩形是第一种坐标系(常见的都是第一种坐标系)。
二,六边形坐标系
直角坐标系中,用平行来理解坐标也可以,用垂直来理解坐标也可以。
但是本质上,平行才是几何的基本概念,垂直是推导出来的概念,所以严格来讲我们就应该用平行来理解直角坐标。
对于六边形坐标系,自然没有垂直的概念,平行的概念仍然可用。
1,直角坐标系
六边形直角坐标系是尽量贴近普通直角坐标系设计的,不过还是很不一样,这里的直线是扭曲的。
从(x,y)往上、右上、右下分别走一步,向量分别是(0,1)(1,x%2)(1,x%2-1),
其实往右下走一步就是往右上走一步再往下走一步。
往另外三个方向走一步,和这三个方向分别相反即可。
求2点之间的最小路径距离:
struct Node
{
int x,y;
};
int GetLen(Node a, Node b)
{
if (a.x > b.x)return GetLen(b, a);
int dx = b.x - a.x;
int dy = abs(b.y - a.y);
if (dx % 2 == 0) {
if (dy <= dx / 2)return dx;
return dx + dy - dx / 2;
}
int ym = dx / 2 + ((a.x + (b.y < a.y)) % 2 + 2) % 2;
if (dy <= ym)return dx;
return dx + dy - ym;
}
计算从一个点往一个方向运动一定距离之后,到达的位置:
Node Move(Node a, int dire, int len)//dire是0-5,len是0-正无穷
{
if (dire % 3 == 0)return Node{ a.x, a.y + (dire == 0 ? 1 : -1) * len };
if (dire == 1 || dire == 5)return Node{ a.x + (dire == 1 ? 1 : -1)*len, a.y + len / 2 + (len % 2 ? (a.x % 2 + 2) % 2 : 0) };
Node b = Move(a, 3, len);
if (dire == 2)return Move(b, 1, len);
return Move(b, 5, len);
}
应用:六宫数局
2,120度坐标系
3个方向里面任选2个作为坐标系方向即可。
或者3个方向里面任选2个作为坐标系方向即可。
我取红线作为坐标系:
可以看出,剩下的黑线就是直线y=x
3,60度坐标系
任选2个夹角为60度的方向作为坐标系方向也是可以的。
其实这就相当于把120度坐标系的一个轴,方向反过来。
4,极坐标系
可以把一个正六边形按顺序编号,用编号a代替角度。
坐标用(r,a)表示,r是距离,a是编号
六条直线(射线)的方程分别是a=kr,k=0,1,2,3,4,5