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
是一个一维数组吗?然后,X
和Y
是常量宏??
或者,使用C ++,这是一个重载运算符[] ??然后,点类型重载运算符[] ???
或者C中有点类型吗?我搜索谷歌“点类型C”,我什么也没找到。
答案 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等。