電子書籍の厳選無料作品が豊富!

ピクセル座標で2点間の直線上の座標点をPHPで求める方法を教えてください。

やりたいことは、ピクセル座標点A、点Bを直線で結んだ時の
ピクセル座標端の座標(X.Y)を求めたいです。
分かっている情報(引数)としては、
点AのX.Y(可変)
点BのX.Y(可変)
ピクセル座標の高さ(範囲は0~n)
ピクセル座標の幅(範囲は0~n)

条件としては
点Aは必ずピクセル座標の高さ、ピクセル座標の幅の範囲内の場所。
点Bはピクセル座標の高さ、ピクセル座標の幅の範囲外の場所。
点Aから見たときの点Bの場所は上下左右どこの位置でもOK

例えばサンプル画像の例1のように
ピクセル座標の高さ30
ピクセル座標の幅40
点A(22.18)点B(20.39)を直線で結び
この時のピクセル座標の高さ、ピクセル座標の幅上の座標点を求めたいです。
この場合Yの値は30は決まっているのですが、Xの値を求めたい。

例2の場合はXの値は0は決まっていてYの値を求めたいです。

何か数式にあてはめて求めることが出来るのでしょうか?
PHPで作成したあとにそれをC++に置き換えも考えています。

色々考えてみたのですが、
まったくわからない状態です。
どなたかご教授いただければと思います。よろしくお願いいたします。

「ピクセル座標で2点間の直線上の座標点をP」の質問画像

A 回答 (1件)

。。

。単なる内分比の問題です。

点A = (Ax, Ay) 点B = (Bx, By) とし、求めたい点を 点P = (Px, Py) とします。

例1)Px = {(By - 30) * Ax + (30 - Ay) * Bx} / (- Ay + By)
例2)Py = (- Bx * Ay + Ax * By) / (Ax - Bx)

[PHP]
define ('Nx', 30);
define ('Ny', 40);

$a = array ('x' => ***, 'y' => ***);
$b = array ('x' => ***, 'y' => ***);

/* PHP 限定 C++ の場合は、if で地味に */
switch (true) {
case $b['x'] < 0 : $p = interior_division($a, $b, array ($a['x'], - $b['x'])); break;
case $b['x'] > Nx : $p = interior_division($a, $b, array (Nx - $a['x'], $b['x'] - Nx)); break;
case $b['y'] < 0 : $p = interior_division($a, $b, array ($a['y'], - $b['y'])); break;
case $b['y'] > Ny : $p = interior_division($a, $b, array (Ny - $a['y'], $b['y'] - Ny)); break;
default : echo 'The condition is not satisfied.';
}

function interior_division($a, $b, $r) {
return array (
'x' => ($r[1] * $a['x'] + $r[0] * $b['x']) / ($r[0] + $r[1]),
'y' => ($r[1] * $a['y'] + $r[0] * $b['y']) / ($r[0] + $r[1])
);
}
[/PHP]
    • good
    • 0
この回答へのお礼

yuu_xさん

早々の回答ありがとうございました。
まさに求めていた回答でした。

早速試してみます。

本当にありがとうございました。

お礼日時:2010/09/24 22:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!