3

私は数学があまり得意ではないので、数式をコードに変換するのに非常に苦労しており、既成のグーグルを見つけることができません。私はたくさんの小さな長方形を含む大きな長方形を持っています...そして私がする必要があるのは最大の空の長方形を計算することだけです。Anyonneは私を助けることができますか?

これが私が思いついたものです...言うまでもなく、それは大きな失敗です。

Rect result = new Rect();

for (Double l = 0; l < bigRect.Width; ++l)
{
    for (Double t = 0; t < bigRect.Height; ++t)
    {
        Double h = 0;
        Double w = 0;

        while ((h <= bigRect.Width) && (w <= bigRect.Height))
        {
            Rect largestEmpty = new Rect(l, t, w, h);

            if (smallRects.TrueForAll(smallRect => !smallRect.IntersectsWith(largestEmpty)) && ((largestEmpty.Height * largestEmpty.Width) > (result.Height * result.Width)))
                result = largestEmpty;
            else
                break;

            ++h;
            ++w;
        }
    }
}
4

1 に答える 1

0

Perdue Docs リンクからBig Rectにはポイントのセット(ASDと呼びましょう)があり、セットASDのポイントを含まない最大のRectを見つける必要があります。あなたのコードを見ると、これらの点を (直接) 組み込んでいないようです。小さい Rects ans create セット ASD からポイントを抽出します。タイプdoubleで作業しているため、ポイントにアクセスできる必要があります。そうしないと、特定の範囲(Big Rect全体)で可能なすべてのdoubleをチェックする必要があるため、アルゴリズムの実行時間が大幅に長くなります。ポイントを使用して、互いに最短距離のポイント (sqrt(dx^2+ dy^2)) を見つけようとします (最短にはポイントを含めないでください)。含まれているなど。つまり、すべての組み合わせの順序リストを作成します(順列ではなく、(a、b)から(c、d) == (c, d) から (a,b)) を、それらの間の距離で並べる必要があります。最適ではないかもしれませんが、仕事は完了します。

編集: 小さい Rects は連結されるべきではないため、小さい Rects の対角線以外のすべての順序ペアは順序リストに含まれている必要があります。同じ x または y 値を持つペアを除外することもできます。

于 2013-03-16T16:23:18.987 に答える