C++で点が放物線の内側・外側・上のどれに位置するかを判定する方法
放物線と点の位置関係を判定する方法
頂点座標 (h, k)、焦点と頂点の距離 a で表される放物線が1つ与えられ、さらに任意の点 (x, y) が与えられたとします。このとき、その点が放物線の内側にあるのか、外側にあるのか、あるいは放物線上にあるのかを判定する問題を解いてみましょう。
判定の原理
判定には、放物線の標準形の方程式を利用します。与えられた点 (x, y) を次の式に代入し、左右の差を計算します。
(y − k)² = 4a(x − h)
具体的には、res = (y − k)² − 4a(x − h) を求め、その値の符号によって点の位置を判定します。
- res < 0 の場合: 点は放物線の内側にある
- res = 0 の場合: 点は放物線上にある
- res > 0 の場合: 点は放物線の外側にある
C++による実装例
#include <iostream>
#include <cmath>
using namespace std;
int isInsideParabola(int h, int k, int x, int y, int a) {
int res = pow((y - k), 2) - 4 * a * (x - h);
return res;
}
int main() {
int x = 2, y = 1, h = 0, k = 0, a = 4;
if(isInsideParabola(h, k, x, y, a) > 0){
cout << "Outside Parabola";
}
else if(isInsideParabola(h, k, x, y, a) == 0){
cout << "On the Parabola";
} else{
cout << "Inside Parabola";
}
}実行結果
Inside Parabola
コードの解説
この例では、頂点 (0, 0)、a = 4 の放物線に対して、点 (2, 1) の位置を判定しています。isInsideParabola 関数は (y − k)² − 4a(x − h)、すなわち (1 − 0)² − 4 × 4 × (2 − 0) = 1 − 32 = −31 を計算します。結果が負の値となるため、点 (2, 1) は放物線の内側にあると判定され、「Inside Parabola」が出力されます。
この手法を使えば、放物線の方程式に点の座標を代入するだけで、その点が放物線のどの領域に属するかを簡単に判定できます。座標やパラメータの値を変えて、さまざまなケースを試してみてください。
-
C++で解く「Maze III」:ボールを最短距離で穴に落とすアルゴリズム
問題の概要 空きスペースと壁からなる迷路の中に、ボールが1つ置かれています。ボールは空きスペース上を上(u)・下(d)・左(l)・右(r)のいずれかの方向に転がって移動できますが、壁にぶつかるまで停止しません。ボールが停止した時点で、次の方向を選択できます。また、迷路内には穴(hole)が1つあり、ボールが穴の位置まで転がると、その穴に落ちます。 ボールの初期位置・穴の位置・迷路の情報が与えられたとき、ボールを最短距離で穴に落とすための移動手順を求めます。ここでいう距離とは、スタート地点(含まない)から穴(含む)までにボールが通過した空きスペースの数として定義されます。 移動方向は「u」「d
-
C++でべき等行列を判定するプログラムの作成方法
行数を r、列数を c とする行列 M[r][c] が与えられ、r = c となる正方行列を考えます。この記事では、与えられた正方行列がべき等行列(アイデンポテント行列)であるかどうかを判定するC++プログラムを解説します。 べき等行列とは 行列 M がべき等行列であるとは、行列 M と自分自身の積が元の行列 M と等しくなること、すなわち M × M = M が成り立つことを指します。 例えば、次の行列を見てください。 この行列を自分自身で掛け合わせても、結果は元の行列とまったく同じになります。したがって、この行列はべき等行列であると言えます。 べき等行列の代表的な例としては、ベクトルを