atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
ゲームプログラミングというゲームを攻略するWIKI
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
ゲームプログラミングというゲームを攻略するWIKI
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
ゲームプログラミングというゲームを攻略するWIKI
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • ゲームプログラミングというゲームを攻略するWIKI
  • 線分と線分の距離

ゲームプログラミングというゲームを攻略するWIKI

線分と線分の距離

最終更新:2021年05月09日 14:40

from0

- view
メンバー限定 登録/ログイン

問題を定義する

2つの線分

  • (x1, y1, z1)から(x1 + dx1, y1 + dy1, z1 + dz1)への線分
  • (x2, y2, z2)から(x2 + dx2, y2 + dy2, z2 + dz2)への線分 の間の最短距離について考える。

問題を整理する

言い換えれば、2点

  • (x1 + t1 * dx1, y1 + t1 * dy1, z1 + t1 * dz1)
  • (x2 + t2 * dx2, y2 + t2 * dy2, z2 + t2 * dz2)

の最短距離でもある。 (線分の区間に収まるならば、0 <= t1 <= 1 かつ 0 <= t2 <= 1)

2つの線の最短経路のベクトルと線1の内積は0なので

( (x2 + t2*dx2) - (x1 + t1*dx1) ) * dx1 + ( (y2 + t2*dy2) - (y1 + t1*dy1) ) * dy1 + ( (z2 + t2*dz2) - (z1 + t1*dz1) ) * dz1 = 0

よって

t1*(dx1*dx1 + dy1*dy1 + dz1*dz1) = x2*dx1 + t2*dx1*dx2 - x1*dx1 + y2*dy1 + t2*dy1*dy2 - y1*dy1 + z2*dz1 + t2*dz1*dz2 - z1*dz1

点ではなく線分なら(dx1*dx1 + dy1*dy1 + dz1*dz1)は0ではない。 両辺を割ると

t1 = (x2*dx1 + t2*dx1*dx2 - x1*dx1 + y2*dy1 + t2*dy1*dy2 - y1*dy1 + z2*dz1 + t2*dz1*dz2 - z1*dz1) / (dx1*dx1 + dy1*dy1 + dz1*dz1)

最短経路のベクトルと線2の内積も0なので ( (x2 + t2*dx2) - (x1 + t1*dx1) ) * dx2 + ( (y2 + t2*dy2) - (y1 + t1*dy1) ) * dy2 + ( (z2 + t2*dz2) - (z1 + t1*dz1) ) * dz2 = 0

よって

t1*(dx1*dx2 + dy1*dy2 + dz1*dz2) = x2*dx2 + t2*dx2*dx2 - x1*dx2 + y2*dy2 + t2*dy2*dy2 - y1*dy2 + z2*dz2 + t2*dz2*dz2 - z1*dz2

ここで線1との内積から求めた式を持ってきて

(x2*dx1 + t2*dx1*dx2 - x1*dx1 + y2*dy1 + t2*dy1*dy2 - y1*dy1 + z2*dz1 + t2*dz1*dz2 - z1*dz1)*(dx1*dx2 + dy1*dy2 + dz1*dz2) / (dx1*dx1 + dy1*dy1 + dz1*dz1) = x2*dx2 + t2*dx2*dx2 - x1*dx2 + y2*dy2 + t2*dy2*dy2 - y1*dy2 + z2*dz2 + t2*dz2*dz2 - z1*dz2

よって

t2* ( (dx1*dx2 + dy1*dy2 + dz1*dz2)*(dx1*dx2 + dy1*dy2 + dz1*dz2)

  • (dx2*dx2 + dy2*dy2 + dz2*dz2)*(dx1*dx1 + dy1*dy1 + dz1*dz1) ) =
  1. (x2*dx2 - x1*dx2 + y2*dy2 - y1*dy2 + z2*dz2 - z1*dz2)*(dx1*dx1 + dy1*dy1 + dz1*dz1)
  • (x2*dx1 - x1*dx1 + y2*dy1 - y1*dy1 + z2*dz1 - z1*dz1)*(dx1*dx2 + dy1*dy2 + dz1*dz2)

2つの線分が平行でなければ

t2 = ( (x2*dx2 - x1*dx2 + y2*dy2 - y1*dy2 + z2*dz2 - z1*dz2)*(dx1*dx1 + dy1*dy1 + dz1*dz1)

  • (x2*dx1 - x1*dx1 + y2*dy1 - y1*dy1 + z2*dz1 - z1*dz1)*(dx1*dx2 + dy1*dy2 + dz1*dz2) ) / ( (dx1*dx2 + dy1*dy2 + dz1*dz2)*(dx1*dx2 + dy1*dy2 + dz1*dz2)
  • (dx2*dx2 + dy2*dy2 + dz2*dz2)*(dx1*dx1 + dy1*dy1 + dz1*dz1) )

例外的な状況

但し dx1*dx1 + dy1*dy1 + dz1*dz1 = 0 ならば線分1の長さは0で、点からの距離と考えるべき。

また (dx1*dx2 + dy1*dy2 + dz1*dz2)*(dx1*dx2 + dy1*dy2 + dz1*dz2) - (dx2*dx2 + dy2*dy2 + dz2*dz2)*(dx1*dx1 + dy1*dy1 + dz1*dz1) = 0 ならば2つの線分は平行で、最短経路を特定することができない。

実装

これからする。

 

最適化

まだやってない。

「線分と線分の距離」をウィキ内検索
LINE
シェア
Tweet
ゲームプログラミングというゲームを攻略するWIKI
記事メニュー

メニュー

  • トップページ
  • プラグイン紹介
  • メニュー
  • 右メニュー



リンク

  • @wiki
  • @wikiご利用ガイド




ここを編集
記事メニュー2
最近更新されたページ
  • 1466日前

    点と移動する線分の交点
  • 1525日前

    凸体と線分の交差
  • 1527日前

    平面と点の距離
  • 1527日前

    平面と線分の交点
  • 1533日前

    線分と線分の距離
  • 1561日前

    動的に読み込まれたSharedObjectからC++を利用する
  • 1561日前

    C++から動的に読み込まれたSharedObjectを利用する
  • 1570日前

    C++でほぼほぼプロパティ
  • 1570日前

    線分と点の距離
  • 1572日前

    点と点の距離
もっと見る
最近更新されたページ
  • 1466日前

    点と移動する線分の交点
  • 1525日前

    凸体と線分の交差
  • 1527日前

    平面と点の距離
  • 1527日前

    平面と線分の交点
  • 1533日前

    線分と線分の距離
  • 1561日前

    動的に読み込まれたSharedObjectからC++を利用する
  • 1561日前

    C++から動的に読み込まれたSharedObjectを利用する
  • 1570日前

    C++でほぼほぼプロパティ
  • 1570日前

    線分と点の距離
  • 1572日前

    点と点の距離
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. 鹿乃つの氏 周辺注意喚起@ウィキ
  2. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  3. MadTown GTA (Beta) まとめウィキ
  4. R.E.P.O. 日本語解説Wiki
  5. シュガードール情報まとめウィキ
  6. AviUtl2のWiki
  7. ソードランページ @ 非公式wiki
  8. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  9. Dark War Survival攻略
  10. 星飼いの詩@ ウィキ
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 初音ミク Wiki
  5. 検索してはいけない言葉 @ ウィキ
  6. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  7. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
  8. 発車メロディーwiki
  9. オレカバトル アプリ版 @ ウィキ
  10. モンスター烈伝オレカバトル2@wiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 参加者一覧 - ストグラ まとめ @ウィキ
  2. コメント/雑談・質問 - マージマンション@wiki
  3. マイティーストライクフリーダムガンダム - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  4. ブラック ジャックス - ストグラ まとめ @ウィキ
  5. マリオカート ワールド - アニヲタWiki(仮)
  6. 過去の行動&発言まとめ - 鹿乃つの氏 周辺注意喚起@ウィキ
  7. 前作からの変更点 - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  8. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  9. ギャルがアップした動画 - 検索してはいけない言葉 @ ウィキ
  10. 猗窩座(鬼滅の刃) - アニヲタWiki(仮)
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.