【C++】点が楕円の内側・外側・境界上のどこにあるかを判定する方法
中心座標 (h, k)、長半径 a、短半径 b をもつ楕円が1つ与えられ、さらに任意の点 (x, y) が与えられたとします。このとき、その点が楕円の内側にあるのか、外側にあるのか、あるいは境界上にあるのかを判定する方法を解説します。
判定に使う数式
点の位置関係は、次の式に点の座標 (x, y) を代入して計算することで求められます。
$$\frac{\left(x-h\right)^2}{a^2}+\frac{\left(y-k\right)^2}{b^2}$$
この計算結果と 1 を比較することで、点の位置を以下のように分類できます。
- 結果が 1 未満の場合 → 点は楕円の内側
- 結果が 1 と等しい場合 → 点は楕円の境界上
- 結果が 1 より大きい場合 → 点は楕円の外側
C++での実装例
実際にC++でプログラムを実装してみましょう。なお、整数同士の除算で小数部分が切り捨てられるのを防ぐため、計算結果は double 型で扱うのが安全です。
#include <iostream>
#include <cmath>
using namespace std;
double ellipseValue(int h, int k, int x, int y, int a, int b) {
return pow((x - h), 2) / pow(a, 2) + pow((y - k), 2) / pow(b, 2);
}
int main() {
int x = 2, y = 1, h = 0, k = 0, a = 4, b = 5;
double res = ellipseValue(h, k, x, y, a, b);
if (res > 1)
cout << "Outside Ellipse";
else if (res == 1)
cout << "On the Ellipse";
else
cout << "Inside Ellipse";
return 0;
}実行結果
Inside Ellipse
コードの解説
この例では、中心が原点 (0, 0)、長半径 a = 4、短半径 b = 5 の楕円に対して、点 (2, 1) の位置を判定しています。
式に代入すると、(2 − 0)² / 4² + (1 − 0)² / 5² = 4/16 + 1/25 = 0.25 + 0.04 = 0.29 となり、結果は 1 未満です。したがって、この点は楕円の内側にあると判定され、「Inside Ellipse」が出力されます。
この手法は、当たり判定や図形処理など、点と楕円の位置関係を扱うさまざまな場面で応用できます。
-
【C++】指定範囲内に特定の数字が存在するかどうかを判定するクエリ処理
この記事では、配列 arr[] と複数のクエリ(各クエリは L、R、val の3つの値で構成される)が与えられたとき、C++ を使って「指定された範囲内に特定の数字が存在するか」を判定するプログラムを作成する方法を解説します。問題の概要各クエリに対して、範囲 L ~ R の間に要素 val が含まれているかどうかを確認する必要があります。具体例で確認してみましょう。入力:arr[] = {4, 8, 1, 7, 2, 9, 3, 5, 1}Q = 3query = {{1, 4, 3}, {0, 2, 1}, {4, 7, 2}}出力:Not Present Present Present出力
-
C++で解く「Maze III」:ボールを最短距離で穴に落とすアルゴリズム
問題の概要 空きスペースと壁からなる迷路の中に、ボールが1つ置かれています。ボールは空きスペース上を上(u)・下(d)・左(l)・右(r)のいずれかの方向に転がって移動できますが、壁にぶつかるまで停止しません。ボールが停止した時点で、次の方向を選択できます。また、迷路内には穴(hole)が1つあり、ボールが穴の位置まで転がると、その穴に落ちます。 ボールの初期位置・穴の位置・迷路の情報が与えられたとき、ボールを最短距離で穴に落とすための移動手順を求めます。ここでいう距離とは、スタート地点(含まない)から穴(含む)までにボールが通過した空きスペースの数として定義されます。 移動方向は「u」「d