0
typedef struct {
   double a; // coefficient for x
   double b; // coefficient for y
   double c; // constant term
} line;

points_to_line(point p1, point p2, line *l)
{
   if (p1[X] == p2[X]) {
      l->a = 1;
      l->b = 0;
      l->c = -p1[X];
} else {
      l->b = 1;
      l->a = -(p1[Y]-p2[Y])/(p1[X]-p2[X]);
      l->c = -(l->a * p1[X]) - (l->b * p1[Y]);
}

我正在阅读(Steven S. Skiena 和 Miguel Revilla)的《编程挑战》一书,也许有人应该读过这本书。

p1[X]是点p1的X值,[Y]是Y值。

该函数生成线性方程线。( line *l) First If 句子使到x + C (p1[X]) = 0l。

我不知道的是:

  • 在 C 语言中,我该如何表示p1[X]??

  • p1一维数组吗?那么,XY是常量宏吗??

  • 或者,使用 C++,这是一个重载的 operator[] 吗?那么,点类型已经重载了运算符[]???

  • 还是C中有点类型?我搜索了谷歌“point type C”,但一无所获。

4

3 回答 3

3

假设它是 C 代码,p1使用运算符访问[],我的猜测是point类型很可能是typedef数组。

#define X  0
#define Y  1
typedef double point[2];

我认为这是double因为(p1[Y]-p2[Y])/(p1[X]-p2[X])表达式是在没有double演员表的情况下编写的。

于 2012-06-06T07:49:55.493 回答
1

如前所述,这很可能是 C 并且标头包含:

typedef double point[2];
enum { X, Y };

或者不是枚举,它可能是

#define X 0
#define Y 1

但是,这不是最好的代码。2点线方程是

(x - x1) / (y - y1) = (x2 - x1) / (y2 - y1)

交叉乘法:

(x - x1) (y2 - y1) = (y - y1) (x2 - x1)

x (y2 - y1) - y (x2 - x1) - x1 (y2 - y1) + y1 (x2 - x1) = 0

所以我们可以使用

a = y2 - y1, b = x1 - x2, c = - x1 a - y1 b

或在代码中

l->a = p2[Y] - p1[Y];
l->b = p1[X] - p2[X];
l->c = - p1[X] * l->a - p1[Y] * l->b;

这样就不需要检查零。

于 2012-06-06T08:34:03.250 回答
1

point需要定义结构,类似于typedef定义line。我会这样设置:

typedef struct {
  double X; 
  double Y; 
} point;

使用该结构,您可以访问as Xp1p1.X

ouah 的回答中给出了另一个选项,他只是将一个点定义为一个大小为 2 的数组,在这种情况下,您将访问Xas p1[0],并且Yas p1[1]-如果 x 是第一个值,而 y 是数组中的第二个值。这在代码中没有明确说明!当你真正想要的是访问时,很容易混淆和编写p1[1](访问) 。我认为数组方法更容易导致代码错误,这就是为什么我总是花时间再写两行,就像我在上面所做的那样。YXtypedef

在我的示例中,您使用点运算符来访问结构的特定变量。在 ouah 的示例中,您使用 [] (这是一个运算符吗?可能,但我不确定)来访问数组中的元素。请注意,在 C & Co 中,第一个元素用索引 0 寻址,第二个用 1 寻址,第三个用 2 等。

于 2012-06-06T08:58:03.667 回答