我需要检查多边形是否凸出 我知道这里有问题,但我需要检查代码,是否正确
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int check_figure(float* x_points[], float* y_points[]);
int main(void) {
int n;
scanf("%i", &n);
int i = 0;
float **x_points = NULL, **y_points = NULL;
x_points = (float**) malloc(sizeof(float*) * (n + 1));
if (x_points == NULL) {
return 0;
}
y_points = (float**) malloc(sizeof(float*) * (n + 1));
if (y_points == NULL) {
return 0;
}
for (i = 0; i < n; i++) {
x_points[i] = (float*) malloc((n + 1) * sizeof(float));
scanf("%f", x_points[i]);
y_points[i] = (float*) malloc((n + 1) * sizeof(float));
scanf("%f", y_points[i]);
}
for (i = 0; i < n - 1; i++) {
if ((x_points[i] == NULL) || (y_points[i] == NULL)) {
return 0;
}
}
x_points[n] = NULL;
y_points[n] = NULL;
int convex = check_figure(x_points, y_points);
if (convex == 1) {
printf("%s", "true");
} else {
printf("%s", "false");
}
free(x_points);
free(y_points);
//free(convex);
return 0;
}
int check_figure(float *x_points[], float *y_points[]) {
float first = 0, booll = 1, sign = 0, result = 0;
int i = 0;
//int *convex = (int*)malloc(sizeof(int));
int convex;
while (1) {
if (x_points[i] != NULL) {
i++;
} else {
break;
}
}
first = *x_points[i - 1] * *y_points[0] - *y_points[i - 1] * *x_points[0];
sign = first / fabsf(first);
int k;
for (k = 0; k < i - 2; k++) {
result = *x_points[k] * *y_points[k + 1] - *x_points[k + 1] * *y_points[k];
booll = booll * sign * result / fabsf(result);
if (booll < 0) {
convex = 0;
return convex;
} else {
convex = 1;
return convex;
}
}
}
有一个样本,例如我输入4然后输入0,2; 2,-2; 0,0; -2,-2;并且它返回我的真实,但多边形不凸...我真的无法得到它
答案 0 :(得分:0)
如果多边形的所有角度都是锐角,或180度(那么,它不是一个角度,而是取决于你的行为,有时它们会发生。)因此,只要确保所有角度都是锐角或180°度。
在2维上,这并不难,你只需确保你的多边形总是以相同的方式缠绕,然后测试分段ab和bc之间的角度,你通过旋转vec2(a - b)90度创建另一个向量朝向多边形的中间(始终是相同的旋转,因为它总是以相同的方式缠绕。这里可以通过翻转x和y值,然后根据您的方式否定其中一个值来实现90度旋转然后,如果旋转矢量的点积和vec2(cb)的矢量为正,则为锐角,如果为负,则为钝角,如果为0,则为直线。在三个维度上,它也不是那么难,但你必须沿着与原始角度相同的平面旋转。
查看你的代码我不知道如何确定角度是否是尖锐的。在某些时候,你需要一个角度,或一个角度的正弦,或一个角度的余弦(通过这个方法通过点积产生),或某种与角度有关的东西。还有更直接的方法可以做到这一点,这只是一个相对高效的方法。