C++
 Computer >> コンピューター >  >> プログラミング >> C++

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」が出力されます。

この手法を使えば、放物線の方程式に点の座標を代入するだけで、その点が放物線のどの領域に属するかを簡単に判定できます。座標やパラメータの値を変えて、さまざまなケースを試してみてください。

  1. C++で解く「Maze III」:ボールを最短距離で穴に落とすアルゴリズム

    問題の概要 空きスペースと壁からなる迷路の中に、ボールが1つ置かれています。ボールは空きスペース上を上(u)・下(d)・左(l)・右(r)のいずれかの方向に転がって移動できますが、壁にぶつかるまで停止しません。ボールが停止した時点で、次の方向を選択できます。また、迷路内には穴(hole)が1つあり、ボールが穴の位置まで転がると、その穴に落ちます。 ボールの初期位置・穴の位置・迷路の情報が与えられたとき、ボールを最短距離で穴に落とすための移動手順を求めます。ここでいう距離とは、スタート地点(含まない)から穴(含む)までにボールが通過した空きスペースの数として定義されます。 移動方向は「u」「d

  2. C++でべき等行列を判定するプログラムの作成方法

    行数を r、列数を c とする行列 M[r][c] が与えられ、r = c となる正方行列を考えます。この記事では、与えられた正方行列がべき等行列(アイデンポテント行列)であるかどうかを判定するC++プログラムを解説します。 べき等行列とは 行列 M がべき等行列であるとは、行列 M と自分自身の積が元の行列 M と等しくなること、すなわち M × M = M が成り立つことを指します。 例えば、次の行列を見てください。 この行列を自分自身で掛け合わせても、結果は元の行列とまったく同じになります。したがって、この行列はべき等行列であると言えます。 べき等行列の代表的な例としては、ベクトルを