无法通过读取 x、y 坐标输入到数组来计算多边形的周长
Trouble calculating perimeter of a polygon from reading x, y coordinate input into arrays
根据输入的 (x,y) 坐标计算多边形周长的程序出现问题。我需要使用数组,但我对它们不是很有信心。主要是在从 .txt 文件(使用 <)将值读入数组以及如何使用最后一个点和第一个点来关闭多边形时遇到问题。
输入为:
3 1.0 2.0 1.0 5.0 4.0 5.0
5 1.0 2.0 4.0 5.0 7.8 3.5 5.0 0.4 1.0 0.4
4 1.0 0.4 0.4 0.4 0.4 3.6 1.0 3.6
0
其中每行中的第一个数字表示点数 (npoints),然后是坐标本身,它们以两个为一组,即 (x,y)。
每个新行表示需要读取的新多边形。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_PTS 100
#define MAX_POLYS 100
#define END_INPUT 0
double
getDistance(int npoints, double x[], double y[]) {
double distance = 0.0;
for (int i = 0; i < npoints; ++i) {
int j =; // I'm stuck here
distance = sqrt((x[i]-x[j]) * (x[i]-x[j]) + (y[i]-y[j]) *(y[i]-y[j]));
}
return distance;
}
int
main(int argc, char *argv[]) {
int npoints, iteration = 0;
double x[MAX_PTS], y[MAX_PTS];
double perimeter = 0.0;
if (npoints == END_INPUT){
scanf("%d", &npoints);
// start with 0 value of parameter.
for (iteration = 0; iteration < npoints; ++iteration) {
scanf("%lf %lf", &(x[iteration]), &(y[iteration]));
// take input for new-point.
// for next iteration, new-point would be first-point in getDistance
}
perimeter += getDistance(npoints, x, y);
perimeter += getDistance(); // stuck here
// need to add the perimeter
// need to complete the polygon with last-edge joining the last-point
// with initial-point but not sure how to access array
printf("perimeter = %2.2f m\n", perimeter);
}
return 0;
}
第一个多边形的输出应该是 10.24m
如果有人能帮我一把那就太好了,我很困惑
你快到了。添加文件输入后,只需在这里和那里进行一些调整。最重要的是,如何让数组点回绕到最前面。
#include <stdio.h>
#include <math.h>
#define MAX_PTS 100
double getDistance(int npoints, double x[], double y[]) {
double distance = 0.0, dx, dy;
int i;
for (i = 0; i < npoints; ++i) {
dx = x[(i+1) % npoints] - x[i]; // wrap the index
dy = y[(i+1) % npoints] - y[i];
distance += sqrt(dx * dx + dy * dy); // accumaulate
}
return distance;
}
int main(int argc, char *argv[]) {
int npoints, point;
double x[MAX_PTS], y[MAX_PTS];
double perimeter;
FILE *fp;
if (argc < 2) {
printf("No file name supplied\n");
return 1;
}
if ((fp = fopen(argv[1], "rt")) == NULL) {
printf("Error opening file\n");
return 1;
}
while (1) {
if (1 != fscanf(fp, "%d", &npoints)) { // check result
printf("Error reading number of sides\n");
return 1;
}
if (npoints == 0)
break; // end of data
if (npoints < 3 || npoints > MAX_PTS) { // check range
printf("Illegal number of sides %d\n", npoints);
return 1;
}
for (point = 0; point < npoints; ++point) {
if (2 != fscanf(fp, "%lf %lf", &x[point], &y[point])) { // check result
printf("Error reading coordinates of %d-sided polygon\n", npoints);
return 1;
}
}
perimeter = getDistance(npoints, x, y); // include args
printf("perimeter = %2.2f\n", perimeter);
}
fclose(fp);
return 0;
}
程序输出:
>test polydata.txt
perimeter = 10.24
perimeter = 18.11
perimeter = 7.60
去掉 main()
中 npoints == END_INPUT
的测试。它没有任何作用,并且由于 npoints
未初始化,因此会产生未定义的行为。
关于你问的问题,假设点代表一个没有边交叉的多边形,则距离将是相邻点之间的距离之和(0->1
,1->2
,.. ..., npoint-2 -> npoints-1
, npoints-1 -> 0
).
其中唯一特别的是最后一个。除了最后一个,正在计算点 i
到点 i + 1
.
之间的距离
这表明 j
对于 i = 0
到 npoints-2
是 i+1
。然后,对于 i == npoints-1
,j
将等于 0
。
编写代码来实现这很简单。
根据输入的 (x,y) 坐标计算多边形周长的程序出现问题。我需要使用数组,但我对它们不是很有信心。主要是在从 .txt 文件(使用 <)将值读入数组以及如何使用最后一个点和第一个点来关闭多边形时遇到问题。
输入为:
3 1.0 2.0 1.0 5.0 4.0 5.0
5 1.0 2.0 4.0 5.0 7.8 3.5 5.0 0.4 1.0 0.4
4 1.0 0.4 0.4 0.4 0.4 3.6 1.0 3.6
0
其中每行中的第一个数字表示点数 (npoints),然后是坐标本身,它们以两个为一组,即 (x,y)。 每个新行表示需要读取的新多边形。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_PTS 100
#define MAX_POLYS 100
#define END_INPUT 0
double
getDistance(int npoints, double x[], double y[]) {
double distance = 0.0;
for (int i = 0; i < npoints; ++i) {
int j =; // I'm stuck here
distance = sqrt((x[i]-x[j]) * (x[i]-x[j]) + (y[i]-y[j]) *(y[i]-y[j]));
}
return distance;
}
int
main(int argc, char *argv[]) {
int npoints, iteration = 0;
double x[MAX_PTS], y[MAX_PTS];
double perimeter = 0.0;
if (npoints == END_INPUT){
scanf("%d", &npoints);
// start with 0 value of parameter.
for (iteration = 0; iteration < npoints; ++iteration) {
scanf("%lf %lf", &(x[iteration]), &(y[iteration]));
// take input for new-point.
// for next iteration, new-point would be first-point in getDistance
}
perimeter += getDistance(npoints, x, y);
perimeter += getDistance(); // stuck here
// need to add the perimeter
// need to complete the polygon with last-edge joining the last-point
// with initial-point but not sure how to access array
printf("perimeter = %2.2f m\n", perimeter);
}
return 0;
}
第一个多边形的输出应该是 10.24m
如果有人能帮我一把那就太好了,我很困惑
你快到了。添加文件输入后,只需在这里和那里进行一些调整。最重要的是,如何让数组点回绕到最前面。
#include <stdio.h>
#include <math.h>
#define MAX_PTS 100
double getDistance(int npoints, double x[], double y[]) {
double distance = 0.0, dx, dy;
int i;
for (i = 0; i < npoints; ++i) {
dx = x[(i+1) % npoints] - x[i]; // wrap the index
dy = y[(i+1) % npoints] - y[i];
distance += sqrt(dx * dx + dy * dy); // accumaulate
}
return distance;
}
int main(int argc, char *argv[]) {
int npoints, point;
double x[MAX_PTS], y[MAX_PTS];
double perimeter;
FILE *fp;
if (argc < 2) {
printf("No file name supplied\n");
return 1;
}
if ((fp = fopen(argv[1], "rt")) == NULL) {
printf("Error opening file\n");
return 1;
}
while (1) {
if (1 != fscanf(fp, "%d", &npoints)) { // check result
printf("Error reading number of sides\n");
return 1;
}
if (npoints == 0)
break; // end of data
if (npoints < 3 || npoints > MAX_PTS) { // check range
printf("Illegal number of sides %d\n", npoints);
return 1;
}
for (point = 0; point < npoints; ++point) {
if (2 != fscanf(fp, "%lf %lf", &x[point], &y[point])) { // check result
printf("Error reading coordinates of %d-sided polygon\n", npoints);
return 1;
}
}
perimeter = getDistance(npoints, x, y); // include args
printf("perimeter = %2.2f\n", perimeter);
}
fclose(fp);
return 0;
}
程序输出:
>test polydata.txt
perimeter = 10.24
perimeter = 18.11
perimeter = 7.60
去掉 main()
中 npoints == END_INPUT
的测试。它没有任何作用,并且由于 npoints
未初始化,因此会产生未定义的行为。
关于你问的问题,假设点代表一个没有边交叉的多边形,则距离将是相邻点之间的距离之和(0->1
,1->2
,.. ..., npoint-2 -> npoints-1
, npoints-1 -> 0
).
其中唯一特别的是最后一个。除了最后一个,正在计算点 i
到点 i + 1
.
这表明 j
对于 i = 0
到 npoints-2
是 i+1
。然后,对于 i == npoints-1
,j
将等于 0
。
编写代码来实现这很简单。