平面坐标系

目录

一,直角坐标系

1,数学中的平面坐标系

2,计算机中的平面坐标系

二,六边形坐标系

1,直角坐标系

2,120度坐标系

3,60度坐标系

4,极坐标系


一,直角坐标系

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

以下是一个简单的 C 语言示例代码,用于实现平面直角坐标系之间的旋转和平移转换。假设原坐标系为 $(x_1, y_1)$,目标坐标系为 $(x_2, y_2)$,转换过程包括平移 $(t_x, t_y)$ 和旋转 $\theta$ 角度。 ```c #include <stdio.h> #include <math.h> // 定义一个结构体来表示二维坐标 typedef struct { double x; double y; } Point; // 平面坐标系转换函数 Point coordinate_transformation(Point p, double tx, double ty, double theta) { Point result; // 旋转矩阵 double cos_theta = cos(theta); double sin_theta = sin(theta); // 先平移 p.x = p.x + tx; p.y = p.y + ty; // 再旋转 result.x = p.x * cos_theta - p.y * sin_theta; result.y = p.x * sin_theta + p.y * cos_theta; return result; } int main() { Point p = {1.0, 2.0}; // 原坐标 double tx = 3.0; // 平移的 x 分量 double ty = 4.0; // 平移的 y 分量 double theta = M_PI / 4; // 旋转角度,这里是 45 度 Point new_p = coordinate_transformation(p, tx, ty, theta); printf("原坐标: (%lf, %lf)\n", p.x, p.y); printf("转换后的坐标: (%lf, %lf)\n", new_p.x, new_p.y); return 0; } ``` ### 代码解释 1. **结构体 `Point`**:用于表示二维平面上的点,包含 `x` 和 `y` 两个分量。 2. **`coordinate_transformation` 函数**:该函数接受一个 `Point` 类型的点 `p`,以及平移量 `tx`、`ty` 和旋转角度 `theta` 作为参数。在函数内部,先进行平移操作,然后进行旋转操作,最后返回转换后的点。 3. **`main` 函数**:定义了一个原坐标 `p`,以及平移量 `tx`、`ty` 和旋转角度 `theta`。调用 `coordinate_transformation` 函数进行坐标转换,并输出原坐标和转换后的坐标。 ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值