# 幾何学的演算

幾何学的演算は、幾何の基本的な操作を演算として行うものです。それは、図形の要素や位置を表すベクトル(数のリスト)に適用されます。もし、演算子が図形の要素を返すならば、それをdraw演算子で描画することもできます。

## リストと座標

直線のための座標は常に同次座標です。すなわち、３つの数のリストで、 `[a,b,c]` が、方程式 `ax+by+c=0`を表します。 点の座標はユークリッド座標(２つの数のリスト `[x,y]`) か、 または同次座標 (３つの数のリスト `[x,y,z]` で点 `[x/z,y/z]`)を表す)です。戻り値は常に同次座標です。以下の説明の中では、特に断りなく、点の形式の引数は <point>で、直線の形式の引数は `<line>` で表します。
`<point>` と `<line>` は両方とも３つの数のリストで表現することができるので、両者を区別する方法が必要になります。内部的には、リストは、それが幾何学的にどのような意味を持つのかというフラグを持っています。その情報は、 `geotype(<list>)` 演算子で得ることができます。この演算子は、 `"Point"`, `"Line"`, `"None"` のいずれかを返します。ベクトルが持つ幾何学的な意味に応じて、 `draw` 演算子は対応する図形を描きます。

## 基本的な幾何学演算子

#### ２直線の交点: `meet(<直線1>,<直線2>)`

説明: この演算子は２本の直線の交点を計算し、その同次座標を返します。

#### ２点を通る直線: `join(<点1>,<点2>)`

説明: この演算子は、２点を通る直線を計算し、その同次座標を返します。

#### 平行線を求める: `parallel(<点>,<直線>)`

#### 平行線を求める: `parallel(<直線>,<点>)`

説明: この演算子では、点と直線を引数として与え(順序は問わない)、その点を通りその直線に平行な直線を求めます。戻り値は直線の同次座標です。 この演算子はユークリッド幾何に対して適用されます。双曲線幾何と楕円幾何はサポートしていません。この演算子は、 `para(...)` と略すこともできます。

#### 垂線: `perpendicular(<点>,<直線>)`

#### 垂線: `perpendicular(<直線>,<点>)`

説明: この演算子では、点と直線を引数として与え(順序は問わない)、その点を通りその直線に垂直な直線を求めます。戻り値は直線の同次座標です。 この演算子はユークリッド幾何に対して適用されます。双曲線幾何と楕円幾何はサポートしていません。この演算子は、 `perp(...)` と略すこともできます。
組み合わせた例: 次のコードを実行すると図のようになります。それぞれの演算の戻り値が図形のタイプ(点か直線か)を内在していますので、drawall演算子によって自動的に正確に描画されます。

    A=[1,1];
    B=[2,5];
    C=[7,2];
    a=join(B,C);
    b=join(C,A);
    c=join(A,B);
    ha=perpendicular(A,a);
    hb=perpendicular(B,b);
    hc=perpendicular(C,c);
    X=meet(ha,hb);
    drawall([a,b,c,d,ha,hb,hc,X,A,B,C]);

#### 垂直なベクトル: `perpendicular(<リスト>)`

説明: もし `perp` 演算子の引数が、２つの数からなるリスト１つだけとします。その場合は、リスト `[a,b]` は `[-b,a]` に変換されます。それは、もとのベクトルを 90° 回転したものです。

#### 三角形の面積: `area(<点1>,<点2>,<点3>)`

説明: この演算子は、<60point1>, <60point2>, <60point3> を３つの頂点とする三角形の面積を計算します。点の方向が反時計回りならば面積は正、時計回りならば面積は負になります。３点が同一直線上にあるときは面積はゼロです。

## 有用な線形代数演算子

線形代数で使う次の演算子は幾何でも有用です。特に３次元のベクトルに適用できます。 その状況 (行列の計算、内積など) については、ベクトルと行列 の節を参照してください。

#### 3点の位置ベクトルの行列式: `det(<ベクトル1>,<ベクトル2>,<ベクトル3>)`

説明: この演算子は、３つの３次元ベクトル `<ベクトル1>`, `<ベクトル2>`, `<ベクトル3>` からなる 3 × 3 行列の行列式を計算します。ベクトルと行列 の節にある一般的な行列式と異なり、この方法はパフォーマンスが優れています。

#### 2点の位置ベクトルの外積: `cross(<ベクトル1>,<ベクトル2>)`

説明: この演算子は、２つの３次元ベクトルの外積を計算します。外積は３次元ベクトルで、もとの２つのベクトルと垂直です。

## 変換とオブジェクトの型

#### オブジェクトの型: `geotype(<リスト>)`

説明: この演算子は、オブジェクトが明確な幾何学的意味を持つかどうかを決定します。戻り値は、文字列で `"Point"`, `"Line"`, `"None"` のいずれかです。
この演算子を、２つの数からなるリストに適用した場合は、常に `"Point"`を返します。3つの数からなるリストに適用した場合は、このリストの内部フラグによって `"Point"`, `"Line"`, or `"None"` のいずれかを返します。シンデレラで描画した幾何オブジェクトであれば、常にそのフラグを有しています。 `meet` 演算子の戻り値は常に "Point" です。 `join`, `parallel`, `perpendicular` 演算子の戻り値は常に "Line"です。さらに、幾何学的意味は `line` と `point` 演算子によって明確に設定することができます。

#### 点の指定: `point(<ベクトル>)`

説明: この演算子は、３つの数のベクトルを、はっきりと `"Point"`として位置づけます。引数が３つの数からなるベクトルでなければ無効です。

#### 直線の指定: `line(<ベクトル>)`

説明: この演算子は、３つの数のベクトルを、はっきりと `"Line"` として位置づけます。引数が３つの数からなるベクトルでなければ無効です。

#### 点を複素数に変換: `complex(<点>)`

説明: この演算子は点の座標を複素数に変換します。ここで、ユークリッド座標系はガウスの複素数平面と同一視されます。点 `[a,b]` は複素数 `a+i*b`に変換されます。

#### 複素数を点に変換: `gauss(<点>)`

説明: この演算子は先ほどと逆です。複素数 `a+i*b` を２つの数のリスト `[a,b]` に変換します

#### ４点または直線の複比: `crossratio(<ベクトル>,<ベクトル>,<ベクトル>,<ベクトル>)`

説明: ４点の幾何複比を計算します。４点が共線であれば、通常の実数射影平面における複比が計算されます。４点が共線でなければ、複素射影直線の対応した点における複比が計算されます。共線的無限遠点に対しては２つの結果は同等です。

#### 4つの数の複比: `crossratio(<数>,< 数 >,< 数 >,< 数>)`

説明: 4つの実数または複素数の複比 (A/B)/(C/D) を計算します。 とても有用な幾何学的不変量です。

## 幾何学変換と基底

代数的な方法で幾何の変換を扱うことができます。変換は 3 × 3 行列で表されます。実際の変換は、点の同次座標に変換行列を掛けて行われます。この変換行列を計算するためにいくつかの演算子があります。

#### 線対称: `linereflect(<直線>)`

説明: <直線>に関して対称な点をを求める行列を返します。
例: 次のコードは直線 a を与えて、対称変換行列を作り、点C の同次座標に掛けて対称点を求めます。結果は緑色の点です。

    m=linereflect(a);
    draw(m*C.homog);

#### 点対称: `pointreflect(<点>)`

説明: `<点>` に関する対称点を求める行列を返します。

#### 平行移動: `map(<点1>,<点2>)`

説明: <点1> を <点2> に写す平行移動を表す行列を返します。

#### 相似変換: `map(<点1>,<点2>,<点3>,<点4>)`

説明: <点1>を<点2>に、<点3>を<点4> に写す相似変換を表す行列を返します。

#### アフィン変換: `map(<点1>,<点2>,<点3>,<点4>,<点5>,<点6>)`

説明: <点1>を<点2>に、<点3>を<点4>に、<点5>を<点6> に写すアフィン変換を表す行列を返します。

#### 射影変換: `map(<点1>,<点2>,<点3>,<点4>,<点5>,<点6>,<点7>,<点8>)`

説明: <点1>を<点2>に、<点3>を<点4>に、<点5>を<点6>に、<点7>を<点8> に写す射影変換を表す行列を返します。

Page last modified on Wednesday 07 of March, 2012 [10:47:08 UTC].
The original document is available at http://doc.cinderella.de/tiki-index.php?page=Geometric%20OperatorsJ