2012-06-06 42 views
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]); 
} 

我讀通過編程(史蒂芬S. Skiena和Miguel雷維拉)挑戰書,也許有人應該已經看過這本書。我期待幾何代碼,我不知道P1 [X]代碼

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

該函數產生一個線性方程線。 (line *l) 首先如果sentense使x + C (p1[X]) = 0變爲l。

什麼我不知道的是:

  • 在C語言中,我怎麼能代表p1[X]

  • p1是一維數組嗎?那麼,XY是不變的宏?

  • 或者,使用C++,這是一個重載的運算符[]?那麼,點類型已經重載了operator [] ???

  • 或者是C中有點類型?我搜索谷歌「點C型」,我什麼也沒找到。

+5

你的問題的答案應該是在這本書解決。由於C沒有內置的'point'類型,本書的作者可能會在之前對其進行定義。 –

回答

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蒙上寫入。

+0

謝謝!這正是我需要的 –

1

前面已經說了,很可能這是C和一個標題包含:

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

或而非枚舉,也可能是

#define X 0 
#define Y 1 

然而,這是不是最好的代碼。 2點線方程是

(X - X 1)/(Y - Y 1)=(X2 - X1)/(Y2 - Y1)

交叉乘法:

(X - X 1) (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一 - Y1 b

或代碼

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

這樣就沒有必要檢查零。

1

需要定義結構point,類似於定義linetypedef。我將它設置這樣的:

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

採用該結構,您可以訪問的p1Xp1.X

另一種選擇是在ouah's answer給出,他只是定義了一個點,與2大小的數組,在這種情況下,你會訪問Xp1[0],並Y作爲p1[1] - 如果x是第一位的,y是數組中的第二個值。這在代碼中沒有明確說明!當你真正想要訪問X時,很容易混淆並編寫p1[1](訪問Y)。我認爲,陣列方法是更易致代碼,這就是爲什麼我會總是花時間寫兩行,正如我在上面的typedef那樣的錯誤。

在我的例子,可以使用點操作符來訪問結構的特定變量。在ouah的例子中,你使用[](是一個操作符?可能,但我不確定)訪問數組內的元素。請注意,在C &有限公司,第一元素與索引0,第二個有1,2等第三

相關問題