检查多边形是否凸出

时间:2014-03-06 16:51:06

标签: c math geometry polygon computational-geometry

我需要检查多边形是否凸出 我知道这里有问题,但我需要检查代码,是否正确

#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;并且它返回我的真实,但多边形不凸...我真的无法得到它

1 个答案:

答案 0 :(得分:0)

如果多边形的所有角度都是锐角,或180度(那么,它不是一个角度,而是取决于你的行为,有时它们会发生。)因此,只要确保所有角度都是锐角或180°度。

在2维上,这并不难,你只需确保你的多边形总是以相同的方式缠绕,然后测试分段ab和bc之间的角度,你通过旋转vec2(a - b)90度创建另一个向量朝向多边形的中间(始终是相同的旋转,因为它总是以相同的方式缠绕。这里可以通过翻转x和y值,然后根据您的方式否定其中一个值来实现90度旋转然后,如果旋转矢量的点积和vec2(cb)的矢量为正,则为锐角,如果为负,则为钝角,如果为0,则为直线。在三个维度上,它也不是那么难,但你必须沿着与原始角度相同的平面旋转。

查看你的代码我不知道如何确定角度是否是尖锐的。在某些时候,你需要一个角度,或一个角度的正弦,或一个角度的余弦(通过这个方法通过点积产生),或某种与角度有关的东西。还有更直接的方法可以做到这一点,这只是一个相对高效的方法。