オブジェクト指向プログラミングで複雑なものを実装することもできますが、物事を単純にするために、すべての異なるタイプの座標を構造体として格納することを提案します。構造体はすべてtype
メンバーと、その特定のタイプの座標に必要なその他のメンバーを持ちます。
次に、単一のステップを実行するすべての変換関数を定義して、すべてが同じ関数シグネチャを持つようにすることができます。次にfunction out_coord = A2B(in_coord)
例を示します。
function cart = sphere2cart(sphere)
assert(strcmp(sphere.type, 'sphere')) % make sure input is correct type
cart.type = 'cart';
cart.x = sphere.R * sin(sphere.theta) * cos(sphere.omega);
cart.y = sphere.R * sin(sphere.theta) * sin(sphere.omega);
cart.z = sphere.R * cos(sphere.theta);
convert
これらの関数は、次のように 1 つのユニバーサル関数から呼び出すことができます。
function output_coord = convert(input_coord, target_type)
output_coord = input_coord;
while ~strcmp(output_coord.type, target_type)
func = get_next_conversion_func(input_coord.type, target_type);
output_coord = func(output_coord);
end
output_coord
正しい型になるまで、一度に 1 つの変換ステップを実行します。唯一欠けているステップは、現在の型とターゲットの型に基づいて、次に行う変換を決定する関数です。「線形」変換チェーンの場合、これはそれほど難しくありません。タイプが複雑なグラフで接続されている、より複雑なケースでは、最短パス アルゴリズムが必要になる場合があります。残念ながら、これを Matlab で実装するのは少し面倒ですが、ハードコードされたソリューションの 1 つとして次のようなものがあります。
function func = get_next_conversion_func(current_type. target_type);
switch current_type
case 'A'
func = @A2B;
case 'B'
switch target_type
case 'A'
func = @B2A;
case {'C','D','E'}
func = @B2C;
end
case 'C'
switch target_type
case {'A','B'}
func = @C2B;
case {'D','E'}
func = @C2D;
end
...
end
確かに、これを実装するよりスマートな方法があります。これは基本的に、現在の型とターゲット型に基づいてどの方向に進むべきかを示すディスパッチ テーブルです。
編集
すべての変換を 1 つの中心的な型 (たとえば ) を介して行うという Jonas の提案に従ってC
、これらすべてを単純化して
function output_coord = convert(input_coord, target_type)
output_coord = input_coord;
if strcmp(output_coord.type, target_type)
return % nothing to convert
end
if ~strcmp(output_coord.type, 'C')
switch output_coord.type
case 'A'
output_coord = A2C(output_coord)
case 'B'
output_coord = B2C(output_coord)
case 'D'
output_coord = D2C(output_coord)
case 'E'
output_coord = E2C(output_coord)
end
end
assert(strcmp(output_coord.type, 'C'))
if ~strcmp(output_coord.type, target_type)
switch target_type
case 'A'
output_coord = C2A(output_coord)
case 'B'
output_coord = C2B(output_coord)
case 'D'
output_coord = C2D(output_coord)
case 'E'
output_coord = C2E(output_coord)
end
end