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) による Programming Challenges の本を読んでいます。おそらく誰かがこの本を読んでいるはずです。

p1[X] は点 p1 の X 値、[Y] は Y 値です。

この関数は、一次方程式の直線を作成します。( line *l) 最初の文がx + C (p1[X]) = 0l になる場合。

私が知らないのは:

  • C言語では、どのように表現できますかp1[X]??

  • p1一次元配列ですか?ではXY定数マクロですか??

  • または、C++ を使用して、これはオーバーロードされた operator[] ですか?? 次に、ポイント型が operator[] をオーバーロードしていますか???

  • それともCにポイント型はありますか?? 「ポイントタイプC」をグーグルで検索しましたが、何も見つかりませんでした。

4

3 に答える 3

3

演算子でp1アクセスされるように、それがCコードであると仮定すると、私の推測では、型は配列へのaである可能性が高いです。[]pointtypedef

#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

を定義するのと同様に、構造体pointを定義する必要がありtypedefますline。私は次のように設定します:

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

Xその構造で、p1asにアクセスできますp1.X

別のオプションがouah's answerに示されています。彼はポイントをサイズ 2 の配列として定義するだけです。その場合、 asとしてアクセスXp1[0]x が最初の値で y が配列の 2 番目の値である場合は、としてアクセスしますこれはコードで明示的に述べられていません! 本当に必要なのは にアクセスすることであるのに、物事をごちゃ混ぜにして書く( にアクセスする) のは非常に簡単です。配列アプローチは、コード内でエラーを引き起こしやすいと思います。そのため、上記のように、常に2 行追加するのに時間がかかります。Yp1[1]p1[1]YXtypedef

この例では、ポイント演算子を使用して構造体の特定の変数にアクセスします。ouah の例では、配列内の要素にアクセスするために [] (それは演算子ですか?おそらく、しかし確かではありません) を使用します。C & Co では、最初の要素はインデックス 0、2 番目の要素は 1、3 番目の要素は 2 などでアドレス指定されることに注意してください。

于 2012-06-06T08:58:03.667 に答える
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 に答える