2

単位を扱うための同じ基本概念に従ういくつかのクラスがあります。

単体テストで使用される簡単な例を次に示します。

    [Test()]
    public void Angle_MathOperatorTest()
    {
        Angle a1 = new Angle(AngleType.Degree, 360);
        Angle a2 = new Angle(AngleType.Radian, Math.PI * 2);

        Angle addedAngle = a1 + a2;
        addedAngle.Degrees.ShouldBeEquivalentTo(720);

        Angle subtractedAngle = a1 - a2;
        subtractedAngle.Radians.ShouldBeEquivalentTo(0);
    }

他の基本的な単位の種類をカバーする、このデモの角度クラスのようないくつかのクラスを作成しました。

精度の問題があることが明らかになった特定のクラスは、長さの単位を処理するクラスの使用でした。Dimension

私は、この Dimension クラスを基本ユニット タイプとして利用する基本的なジオメトリ ライブラリの構築を支援しました。たとえば、Point クラスは次のとおりです。

public class Point
{

    public Dimension X;

    public Dimension Y;

    public Dimension Z;
}

線やその他の形状には、このポイント クラスを使用して構築されたディメンションと端点によって表される長さなどのプロパティがあります。

これらの線がすべて平行かどうかを確認しようとすると、問題が明らかになります。この関数のように:

    /// <summary>
    /// checks to see whether every line is parallel
    /// </summary>
    /// <param name="passedLines">passed List of Lines</param>
    /// <returns></returns>
    public static bool AreAllParallel(this List<Line> passedLines)
    {

        for (int i = 0; i < passedLines.Count - 1; i++)
        {
            if (!passedLines[i].IsParallelTo(passedLines[i + 1]))
            {
                return false;
            }
        }

        return true;
    }

高すぎる精度をチェックしているため、false が返されることがよくあります。ポイントとラインで回転と平行移動を行った後、true を返したいときに、この関数が false を返すようにするのに十分なだけ丸めが加算されます。

そう:

次の選択肢のうち、正しい/より良い選択肢はどれですか?

  • IsParallelTo数値が比較的近い (例: 0.0001 インチ以内)などの関数でチェックを行うだけです。

If(Math.Abs​​(thing.x - thing2.x) < .0001)

  • 構成ファイルから引き出された可変定数を使用して以前のアイデアを改善し、ユーザーが希望する許容偏差を選択できるようにします。

If(Math.Abs​​(thing.x - thing2.x) < Properties.AcceptedDeviationConstant)

  • またはディメンション クラスのルート レベルで問題を軽減します。

同じ戦略を使用できます

//inside Dimension Equals
public override bool Equals(object obj)
{
    return (Math.Abs(this.Inches - ((Dimension)(obj)).Inches)) < Constants.AcceptedEqualityDeviationConstant;
}

実際にはこのようになりますが、上記の方が理解しやすいです

return (Math.Abs​​(this.GetValue(this.InternalUnitType) - ((Dimension)(obj)).GetValue(this.InternalUnitType))) < Constants.AcceptedEqualityDeviationConstant;

または最後に、私の最後のアイデアは、単位クラスのすべてを (寸法、角度など) のDecimal代わりに基本単位に置き換えDouble、どういうわけか (それを調べた後) それが役立つかどうかを判断することです。


クラスの等価演算の精度の一貫性を向上させる方法と場所は?

ps ライブラリはオープンソースであり、見つけることができます (Units hereおよび Geometry here )

4

1 に答える 1

0

e1が線 1の方向と線 2 の方向である場合e2、それらが θ (ラジアン) の勾配許容範囲内で平行であるかどうかを確認するには、次の手順を実行します (疑似コード)。

bool is_parallel = |Cross(e1,e2)| <= |e1|*|e2|*Cos(θ)

ここ|v|で、 はベクトルの大きさで、Cross()はベクトルの外積です。

于 2014-10-03T22:15:56.227 に答える