我正在寻找几何代码,我不知道p1 [X]代码

时间:2012-06-06 07:38:43

标签: c struct geometry typedef point

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) 首先如果sentense使x + C (p1[X]) = 0成为l。

我不知道的是:

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

  • p1是一个一维数组吗?然后,XY是常量宏??

  • 或者,使用C ++,这是一个重载运算符[] ??然后,点类型重载运算符[] ???

  • 或者C中有点类型吗?我搜索谷歌“点类型C”,我什么也没找到。

3 个答案:

答案 0 :(得分:2)

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

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

我认为它是double因为(p1[Y]-p2[Y])/(p1[X]-p2[X])表达式是在没有double强制转换的情况下编写的。

答案 1 :(得分: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;

这样就不需要检查零了。

答案 2 :(得分:1)

需要定义结构point,类似于定义typedef的{​​{1}}。我会这样设置:

line

使用该结构,您可以typedef struct { double X; double Y; } point; X p1访问p1.X

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

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