私はC++で次のようなことを達成しようとしています:
class MyVector; // 3 component vector class
MyVector const kA = /* ... */;
MyVector const kB = /* ... */;
MyVector const kC = /* ... */;
MyVector const kD = /* ... */;
// I'd like to shorten the remaining lines, ideally making it readable but less code/operations.
MyVector result = kA;
MyVector const kCMinusD = kC - kD;
if(kCMinusD.X <= 0)
{
result.X = kB.X;
}
if(kCMinusD.Y <= 0)
{
result.Y = kB.Y;
}
if(kCMinusD.Z <= 0)
{
result.Z = kB.Z;
}
コードを英語に言い換えると、4 つの「既知の」ベクトルがあります。2 つのベクトルには、結果に必要な値と不要な値があり、必要かどうかは、他の 2 つのベクトルのコンポーネントに基づく分岐に依存します。
いくつかの行列演算とマスキングを使用してこのコードを単純化できるはずだと思いますが、頭を包むことはできません。
今のところ、私はブランチを使用していますが、それでも理解しやすく、コードの冗長性が少ないより良い方法があるかどうかを知りたいと思っています。
編集:
マークのコメントを参照して、ここで何をしようとしているのかを説明します。
このコードは、私が取り組んでいる春の物理学からの抜粋です。コンポーネントは次のとおりです。
kC は現在のスプリングの長さ、kD は最小のスプリング長です。
kA と kB は 2 セットのばね張力であり、その各構成要素は構成要素ごとに一意である可能性があります (つまり、X、Y、または Z に沿った異なるばね張力)。kA は完全に圧縮されていない場合のスプリングの張力であり、kB は完全に圧縮されている場合のスプリングの張力です。
ばねが圧縮されているかどうかに応じて、単純に kC と kD の融合である結果の「ベクトル」を構築したいと思います。