直線

本物のページはこちら→line

3次元ベクトル的に書くとこうなる。

(1)
\begin{equation} p ・ n=d \end{equation}

あれぇ、この式って平面の方程式でもあるよね???
線は平面の次元が減っただけと考えることができる。
でも、3次元で線を表現したいんだって場合がある。
そういう時はベクトル形式の$P=P+td$になるのかなぁ
プログラム上で衝突判定などする場合は、このベクトル形式が最も便利かな。
データが少なくて済むし、内積や外積が使えるから。

2次元における直線の方程式

傾きが$\theta$の場合
線分とは違い、無限に広がっている

(2)
\begin{align} y=tan\theta x +k \end{align}

平面の定義と似せて陰関数形式で書くと

(3)
\begin{equation} ax+by=d \end{equation}

ベクトル(媒介変数)形式で書くと

(4)
\begin{align} p+d \cdot t \end{align}

d=方向ベクトル

直線の法線

2次元の直線の法線と線の方向ベクトルの関係

(5)
\begin{equation} n=(-d_y,d_x) \end{equation}

線の方程式と法線ベクトルの関係

(6)
\begin{align} ax+by=d\\ n=(a,b) \end{align}

直線の傾き

(7)
\begin{align} \frac{\Delta y}{\Delta x}=tan \theta \end{align}

2つの点から直線の方程式を導き出す

bool CVertex::CalcLineFormula(CVertex *_src,PFORMULA _dest){
    if(this->IsSameVertex(_src)){return false;}
    if(_src->x == this->x){
        _dest->coefa=_src->x;
    }else{
    _dest->coefa=(this->y-_src->y)/(this->x-_src->x);//傾き
    }
    _dest->coefb= -1.0*_dest->coefa;
    _dest->coefc= _src->y;
 
    return true;
 
}

2つの点から直線の方程式(法線とベクトル形式)を導き出す

まず、2つの点から直線の方向ベクトルが簡単にわかります

mDirection = _to - _from;

直線の方向ベクトル=dirと法線nとします。
dirnは直角であるので
まず内積($|a||b|\cos\theta$)=0です。
dir.x*n.x+dir.y+n.y=0

これだけじゃ導き出せないので、外積も使います
dir.x*n.y-dir.y*n.x=1

この2つの連立方程式から法線nがわかります
連立方程式を解いていくと(8)
\begin{cases} d_x n_y + d_y n_y= 0 & \\ -d_y n_x + d_x n_y = 1 & \end{cases}

上の式の両辺に$d_y$をかけて、
下の式の両辺に$d_x$をかけます

(9)
\begin{cases} d_y d_x n_y + d_y^2 n_y= 0 & \\ -d_y d_x n_x + d_x^2 n_y = d_x & \end{cases}

上の式と下の式を足すと左の項が消えてくれます

(10)
\begin{equation} d_y^2 n_y + = d_x^2 n_y = d_x \end{equation}

ここから$n_y$を導き出します

(11)
\begin{equation} n_y(d_y^2+d_x^2)=d_x \end{equation}

$(d_x,d_y)$は方向ベクトルで長さが1なので$d_y^2+d_x^2=1$です
よって

(12)
\begin{equation} n_y=d_x \end{equation}

ここから$n_x$も導き出せます

(13)
\begin{align} n_x = \frac{-d_y n_y}{d_x}\\ n_x= \frac{-d_y d_x}{d_x}\\ n_x = -d_y \end{align}

結局

(14)
\begin{align} n_x=-d_y\\ n_y=d_x \end{align}

です

SVGでの直線の描き方

<xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg">
<line x1="10" y1="10" x2="100" y2="20" stroke="black"/>
<svg xmlns="http://www.w3.org/2000/svg">

直線の方程式

傾きが$\theta$の場合

(15)
\begin{align} y=tan\theta x \end{align}

2つの点から直線の方程式を導き出す

bool CVertex::CalcLineFormula(CVertex *_src,PFORMULA _dest){
    if(this->IsSameVertex(_src)){return false;}
    if(_src->x == this->x){
        _dest->coefa=_src->x;
    }else{
    _dest->coefa=(this->y-_src->y)/(this->x-_src->x);//傾き
    }
    _dest->coefb= -1.0*_dest->coefa;
    _dest->coefc= _src->y;
 
    return true;
 
}

サポートサイト Wikidot.com