crossとintersectの違い

id:yellow_73:20080116の続き。
まず、コメントでid:s_yasue さんから頂いた情報の ftp://ftp.software.ibm.com/ps/products/db2/info/vr95/pdf/ja_JP/db2sbj950.pdf にアクセスしてみました。
この場を借りてお礼申し上げます。
このURLにあるリソースは、DB2の空間データベース拡張(というのかどうか知りませんが)のマニュアルでした。ST_Crosses, ST_Intersects ともに用意されていて、説明文もありました。しかし、どちらも「交差」でさらっと流していましたorz
今度は、ST_CrossとST_Intersectの差を、挙動の違いで判断することとしました。
文献にはあたれよと言われそうだけど…多分、さらっと皆さん書いているところから考えると、幾何学では普通に使われているのではないかと。
なお、PostGIS 1.3.2 を使いました。

  1. 縦長長方形と横長長方形で「交差」するものについて cross かどうかテストしたら、FALSE。

    SELECT ST_Crosses(
    ST_GeomFromText('POLYGON( (1 2, 1 -2, -1 -2, -1 2, 1 2) )')
    ,
    ST_GeomFromText('POLYGON( (2 1, 2 -1, -2 -1, -2 1, 2 1) )')
    );
  2. 正方形とそれを横切る線をテストしたら、TRUE。

    SELECT ST_Crosses(
    ST_GeomFromText('LINESTRING(-2 0, 2 0)')
    ,
    ST_GeomFromText('POLYGON( (1 1, 1 -1, -1 -1, -1 1, 1 1) )')
    );
  3. 線の端点の一方を正方形内に入れた場合もTRUE。

    SELECT ST_Crosses(
    ST_GeomFromText('LINESTRING(0 0, 2 0)')
    ,
    ST_GeomFromText('POLYGON( (1 1, 1 -1, -1 -1, -1 1, 1 1) )')
    );
  4. 今度は2線で「交差」するものをテスト。「交差」する場合は、TRUE。

    SELECT ST_Crosses(
    ST_GeomFromText('LINESTRING(1 1, -1 -1)')
    ,
    ST_GeomFromText('LINESTRING(-1 1, 1 -1)')
    );
  5. 線同士が重なる場合は、FALSE。

    SELECT ST_Crosses(
    ST_GeomFromText('LINESTRING(1 1, -1 -1)')
    ,
    ST_GeomFromText('LINESTRING(2 2, -1 -1)')
    );
ここで言う"cross"は、「交点を持つ」、"intersect"は「共通部分を持つ」と言っていいのかも知れません。