0

構造体のベクトルがあり、値の 1 つに従ってそれらを並べ替える方法について助けが必要です。これら 2 つの値が同じ場合は、別のパラメーターに従って並べ替えます。

これは他の質問と似ていますが、それだけではありません。

私が実装しようとしているのは、走査線ベースのポリゴン塗りつぶしアルゴリズムです。

アクティブ エッジ リストを作成しましたが、各構造体オブジェクトの x 値に基づいて並べ替える必要があります。x 値が同じ場合、各構造体オブジェクトの勾配の逆数に基づいて並べ替える必要があります。

以下は、通常の並べ替えのオーバーライド演算子 < を使用した構造体の定義です。

struct Bucket
{
    // Fields of a bucket list
    int ymax, x, dx, dy, sum;

    // Override the < operator, used for sorting based on the x value
    bool operator < (const Bucket& var) const
    {
        // Check if the x values are the same, if so
        // sort based on the ivnerse of the slope (dx/dy)
        /*if(x == var.x)
            return (dx/dy) < (var.dx/var.dy);
        else*/
            return (x < var.x);
    }
};

if then else ステートメントはコンパイルされるためコメントアウトしましたが、浮動小数点エラーが発生し、プログラムがクラッシュします。正確なエラーは次のとおりです。「浮動小数点例外 (コア ダンプ)」

また、各部門を (int) にキャストしようとしましたが、それもうまくいきませんでした。

私の質問:私が持っている方法と同様の並べ替えを行う方法はありますか、それとも独自の並べ替えメソッドを作成する必要があります。

独自のソート方法を作成する必要がある場合は、役立つ簡単な方法へのリンクまたは何かを提供してください。

ありがとう

4

2 に答える 2

3

You should implement double division, because with integers, when you have for example 5/6 it results in 0, and division by 0 is not possible as we know. That's why the program crashes. SO change the members of the structure to doubles.And then you should take care of some precision issues but at least the program won't crash assuming that you are not allowing 0 value for dy.

于 2012-09-28T19:00:10.023 に答える
1

辞書式比較のためにさまざまな演算子をオーバーライドするタプルを使用できます( http://en.cppreference.com/w/cpp/utility/tuple/operator_cmp )

typedef std::tuple<int, int, int, int, int> Bucket;

しかし、構造体をタプルに変更するのは少し面倒です。タプルを作成するtieを使用できます。

bool operator < (const Bucket& var) const
{
    std::tie(x, dx/dy) < std::tie(var.x, var.dx/var.dy);
}

ただし、このソリューションは参照で機能するため、コンパイルされません

bool operator < (const Bucket& var) const
{
    int slope = dx/dy;
    int var_slope = var.dx/var.dy;  
    std::tie(x, slope) < std::tie(var.x, var_slope);
}

これは最も効率的な解決策ではありませんが、可読性は非常に優れています。もちろん、この例ではまだ 0 による除算があります。

于 2014-02-20T11:23:25.520 に答える