C++で学ぶコンピュータグラフィックスのポイントクリッピングアルゴリズム
コンピュータグラフィックスにおけるクリッピングとは
コンピュータグラフィックスは、コンピュータの画面上に画像や図形を描画する技術です。ここでは、画面を2次元座標系として扱います。この座標系は左上の原点 (0,0) から始まり、右下に向かって広がります。
ビューイングプレーン(視野面)とは、コンピュータグラフィックスにおいて図形を描画するために定義された領域のことであり、画面上の可視範囲を指します。
クリッピングとは、このビューイングプレーンの外側にある点や図形を取り除く処理のことです。
クリッピングを理解するために、具体例を見てみましょう。

上図の例では、青色で示されたビューイングプレーンの外側にある点Cと点Dがクリッピングされます。
ポイントクリッピングの判定条件
点をクリッピングするには、まずビューイングプレーンの座標、すなわち最小値 (Xmin, Ymin) と最大値 (Xmax, Ymax) を把握する必要があります。次に、対象となる点の座標をこれらの値と比較します。
(Xmin, Ymin) <= (Xpoint, Ypoint) <= (Xmax, Ymax) という条件が成り立てば、その点はビューイングプレーンの内側にあると判断され、表示されます。条件を満たさない場合は、画面外の点として切り取られます。
C++での実装例
以下は、ポイントクリッピングの動作を示すC++プログラムです。
#include <iostream>
using namespace std;
void pointClipping(int points[][2], int n, int Xmin, int Ymin, int Xmax, int Ymax) {
cout<<"Points that are removed by Point clipping Algorithm are :"<<endl;
for (int i = 0; i < n; i++){
if ((points[i][0] < Xmin) || (points[i][0] > Xmax))
cout<<"("<<points[i][0]<<","<<points[i][1]<<")\t";
else if ((points[i][1] < Ymin) || (points[i][1] > Ymax))
cout<<"("<<points[i][0]<<","<<points[i][1]<<")\t";
}
}
int main() {
int points[6][2] = {{0, 0}, {-10, 10}, {1000, 1000}, {100, 900}, {501, 311}, {250, 250}};
int Xmin = 0;
int Xmax = 500;
int Ymin = 0;
int Ymax = 500;
pointClipping(points, 6, Xmin, Ymin, Xmax, Ymax);
return 0;
}
実行結果
Points that are removed by Point clipping Algorithm are :
(-10,10) (1000,1000) (100,900) (501,311)
このプログラムでは、X座標・Y座標ともに0〜500の範囲を表示領域として設定しています。6つの点のうち、領域の外側にある (-10,10)、(1000,1000)、(100,900)、(501,311) の4点がクリッピング対象として出力されます。一方、(0,0) と (250,250) は領域内にあるため、そのまま表示されます。
-
最近傍アルゴリズムをC++で実装!巡回セールスマン問題の最小コストを求める方法
概要本記事では、巡回セールスマン問題(TSP:Traveling Salesman Problem)を解くために用いられる最近傍アルゴリズムをC++で実装する方法を解説します。このプログラムは、すべてのノードを訪問するために必要な最小コストを、各辺を一度だけ通過するという条件のもとで計算します。必要な関数と擬似コードアルゴリズムの流れBegin Initialize c = 0, cost = 1000; Initialize g[][]. function swap() is used to swap two va
-
C++で拡張ユークリッドの互除法を実装する方法
拡張ユークリッドの互除法(Extended Euclidean Algorithm)は、2つの整数の最大公約数(GCD)を求めるためのもう一つの手法です。通常のユークリッドの互除法と異なり、ベズーの等式 ax + by = gcd(a, b) を満たす係数 x と y を同時に求められる点が大きな特徴です。モジュラ逆数の計算などへの応用も可能で、コンピュータプログラムにおいて非常に効率的な手法として知られています。 アルゴリズムの流れ 拡張ユークリッドの互除法は、再帰呼び出しを利用して以下の手順で実装します。 開始 変数 a、b、x、y を宣言する gcdExtended(int