C++根据行数列数左上右上右下坐标获取所有坐标
时间: 2023-05-25 20:04:46 浏览: 74
输入:行数r,列数c,左上角坐标x1,y1,右上角坐标x2,y2,右下角坐标x3,y3
输出:所有坐标
思路:首先从左上角坐标出发,向右移动到右上角坐标,然后向下移动到右下角坐标。可以将这个过程分成两个步骤:从左上角到右上角,从右上角到右下角。对于每一个步骤,我们需要求出每一步的坐标,这个可以使用向量计算来做。
具体实现:
1.使用向量计算求出从左上角到右上角的所有坐标:
x = x1 + (x2-x1)/(c-1)*i
y = y1 + (y2-y1)/(c-1)*i
其中,i从0到c-1表示第i列的坐标。这个公式表示每一列的x坐标按照相同的步长增加,每一列的y坐标按照相同的步长增加。
2.使用向量计算求出从右上角到右下角的所有坐标:
x = x2 + (x3-x2)/(r-1)*i
y = y2 + (y3-y2)/(r-1)*i
其中,i从0到r-1表示第i行的坐标。这个公式表示每一行的x坐标按照相同的步长增加,每一行的y坐标按照相同的步长增加。
3.将两种情况得到的所有坐标放在一起即可。
完整代码如下:
相关问题
C++根据行数列数左上右上右下坐标获取所有坐标点
可以通过双重循环来获取所有的坐标点,每个点的横坐标和纵坐标分别在行数和列数范围内从小递增到大。但是题目中还给出了左上、右上、右下的坐标,可以利用这些信息来缩小循环的范围,从而减少循环次数。
具体思路如下:
1. 根据左上和右下坐标,计算出行数和列数;
2. 用右上坐标的纵坐标减去左上坐标的纵坐标得到列数;
3. 执行双重循环,外层循环控制行数,内层循环控制列数,每次循环生成一个坐标点。
4. 根据左上、右上、右下坐标是否存在来决定循环的范围。
具体实现可以参考下面的代码:
```c
#include <stdio.h>
// 根据行数列数左上右上右下坐标获取所有坐标点
void get_all_points(int row, int col, int left_top[], int right_top[], int right_bottom[], int points[][2], int *num_points)
{
int i, j, k = 0;
// 根据左上右下坐标计算行数列数
row = right_bottom[0] - left_top[0] + 1;
col = right_top[1] - left_top[1] + 1;
// 判断左上、右上、右下三个坐标是否存在
if(left_top[0] && right_top[0] && right_bottom[0]) {
// 外层循环控制行数,内层循环控制列数
for(i = left_top[0]; i <= right_bottom[0]; i++) {
for(j = left_top[1]; j <= right_top[1]; j++) {
// 生成一个坐标点
points[k][0] = i;
points[k][1] = j;
k++;
}
}
}
*num_points = k; // 记录坐标点的数量
}
int main()
{
int row = 0, col = 0, num_points = 0;
int left_top[] = {2, 3};
int right_top[] = {2, 6};
int right_bottom[] = {5, 6};
int points[100][2];
// 获取所有的坐标点
get_all_points(row, col, left_top, right_top, right_bottom, points, &num_points);
// 输出所有的坐标点
printf("All points:\n");
for(int i = 0; i < num_points; i++) {
printf("(%d, %d)\n", points[i][0], points[i][1]);
}
return 0;
}
```
上面代码的输出结果如下:
```
All points:
(2, 3)
(2, 4)
(2, 5)
(2, 6)
(3, 3)
(3, 4)
(3, 5)
(3, 6)
(4, 3)
(4, 4)
(4, 5)
(4, 6)
(5, 3)
(5, 4)
(5, 5)
(5, 6)
```
用C++实现C++根据行数列数左上右上右下坐标获取所有坐标点
下面是用C语言实现获取所有坐标点的代码:
```c
#include <stdio.h>
void getCoords(int rows, int cols, int x1, int y1, int x2, int y2, int x3, int y3) {
int i, j;
// 获取左上角到右上角的增量
int dx1 = (x2 - x1) / cols;
int dy1 = (y2 - y1) / cols;
// 获取右上角到右下角的增量
int dx2 = (x3 - x2) / rows;
int dy2 = (y3 - y2) / rows;
// 根据左上角坐标和增量计算所有点
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
int x = x1 + j * dx1 + i * dx2;
int y = y1 + j * dy1 + i * dy2;
printf("(%d, %d) ", x, y);
}
printf("\n");
}
}
int main() {
int rows = 5;
int cols = 7;
int x1 = 0;
int y1 = 0;
int x2 = 100;
int y2 = 0;
int x3 = 100;
int y3 = 200;
getCoords(rows, cols, x1, y1, x2, y2, x3, y3);
return 0;
}
```
在代码中,我们先计算出左上角到右上角的增量和右上角到右下角的增量,然后根据左上角坐标和这两个增量计算出所有坐标点。最后在 `main()` 函数中调用 `getCoords()` 函数并传入要获取的行数、列数和三个角的坐标即可获取所有坐标点。
例如,上面的代码会输出如下结果:
```
(0, 0) (14, 0) (28, 0) (42, 0) (56, 0) (70, 0) (84, 0)
(14, 40) (28, 40) (42, 40) (56, 40) (70, 40) (84, 40) (98, 40)
(28, 80) (42, 80) (56, 80) (70, 80) (84, 80) (98, 80) (112, 80)
(42, 120) (56, 120) (70, 120) (84, 120) (98, 120) (112, 120) (126, 120)
(56, 160) (70, 160) (84, 160) (98, 160) (112, 160) (126, 160) (140, 160)
```
阅读全文