0

私は現在、結果を画像として表現したい3Dビンパッキング問題に取り組んでいます。

次のように、結果をパッキングオブジェクトのリストとして保存しています。

public class LoadedPackage
{
     private PackingObject packingObject;
     private int xloc, yloc, zloc;
     private bool flipped = false;
}

public class PackingObject
{
     private int ID, checkerMaster, height, width, depth, number;
}

xloc、yloc、zloc、およびディメンションを使用して、一度に1つずつパッケージを描画し、イメージを作成したいと思います。これを行うためのある種の画像ライブラリの方法はありますか、それとも単純な画像だけでは少しやり過ぎのように見えるopenGLソリューションを使用することを余儀なくされますか?

私は多分2dgdilibを使用して等尺性の方法を使用することを考えていました

4

1 に答える 1

0

最終的に、私はアイソメトリック アプローチを選択し、各パッケージに 3D 座標からアイソメトリックに変換するメソッドを追加しました。次のコードが、同様の苦境にある他の誰かに役立つことを願っています!

アイソメトリック キューブには 6 つのポイントがあるため、6 つのポイントの配列を返します。実際には、3 つのサブメソッドを使用して、GDI lib が処理する 3 つのアイソメトリック ポリゴンを返しますが、この回答のために、より一般的な 6 ポイント メソッドを投稿します。

    public PointF[] convertCoords()
    {
        float x;
        float y;
        PointF p;
        PointF[] pointFs = new PointF[7];
        int x1 = 0;
        int y1 = 0;
        int z1 = 0;

        double rads = Helpers.DegreeToRadian(30);

        //point 0 in iso
        x = ((float)Math.Cos(rads) * xloc) + ((float)Math.Cos(rads) * yloc);
        y = ((float)Math.Sin(rads) * yloc) + zloc - ((float)Math.Sin(rads) * xloc);
        y = (-y) + 250;

        p = new PointF(x,y);
        pointFs[0] = new PointF(p.X,p.Y);
        //point 1 in iso
        x1 = xloc + packingObject.Depth;
        y1 = yloc;
        z1 = zloc;

        x = ((float)Math.Cos(rads) * x1) + ((float)Math.Cos(rads) * y1);
        y = ((float)Math.Sin(rads) * y1) + z1 - ((float)Math.Sin(rads) * x1);
        y = (-y) + 250;

        p = new PointF(x, y);
        pointFs[1] = new PointF(p.X, p.Y);
        //point 2 in iso
        x1 = xloc + packingObject.Depth;
        y1 = yloc;
        z1 = zloc + packingObject.Height;

        x = ((float)Math.Cos(rads) * x1) + ((float)Math.Cos(rads) * y1);
        y = (-((float)Math.Sin(rads) * x1)) + ((float)Math.Sin(rads) * y1) + z1;
        y = (-y) + 250;

        p = new PointF(x, y);
        pointFs[2] = new PointF(p.X, p.Y);
        //point 3 in iso
        x1 = xloc;
        y1 = yloc;
        z1 = zloc + packingObject.Height;

        x = ((float)Math.Cos(rads) * x1) + ((float)Math.Cos(rads) * y1);
        y = (-((float)Math.Sin(rads) * x1)) + ((float)Math.Sin(rads) * y1) + z1;
        y = (-y) + 250;

        p = new PointF(x, y);
        pointFs[3] = new PointF(p.X, p.Y);
        //point 4 in iso
        x1 = xloc;
        y1 = yloc + packingObject.Width;
        z1 = zloc + packingObject.Height;

        x = ((float)Math.Cos(rads) * x1) + ((float)Math.Cos(rads) * y1);
        y = (-((float)Math.Sin(rads) * x1)) + ((float)Math.Sin(rads) * y1) + z1;
        y = (-y) + 250;

        p = new PointF(x, y);
        pointFs[4] = new PointF(p.X, p.Y);
        //point 5 in iso
        x1 = xloc + packingObject.Depth;
        y1 = yloc + packingObject.Width;
        z1 = zloc + packingObject.Height;

        x = ((float)Math.Cos(rads) * x1) + ((float)Math.Cos(rads) * y1);
        y = (-((float)Math.Sin(rads) * x1)) + ((float)Math.Sin(rads) * y1) + z1;
        y = (-y) + 250;

        p = new PointF(x, y);
        pointFs[5] = new PointF(p.X, p.Y);
        //point 6 in iso
        x1 = xloc + packingObject.Depth;
        y1 = yloc + packingObject.Width;
        z1 = zloc;

        x = ((float)Math.Cos(rads) * x1) + ((float)Math.Cos(rads) * y1);
        y = (-((float)Math.Sin(rads) * x1)) + ((float)Math.Sin(rads) * y1) + z1;
        y = (-y) + 250;

        p = new PointF(x, y);
        pointFs[6] = new PointF(p.X, p.Y);

        return pointFs;
    }
于 2012-09-03T07:54:07.010 に答える