3

私は WFP でアプリケーション C# を構築しています。形状を描画しようとしています。各形状はクラスに属し、そのようなクラスには外側の形状のポリゴンと、実際の 2D オブジェクトのように見せるための 1 ~ 3 つのポリラインが含まれています。その場で形状全体のいくつかのプロパティ(色、可視性など)を変更できる方法 希望の高さと幅に応じて、ループによっていくつかのポリラインが作成されると言わざるを得ません

しかし、現在、いくつかのポリラインのレンダリングで問題に直面しています。デバッグの最後に抽出されたポイントを表すためにペイントを使用すると、ポイントは正しい位置 (x、y) にありますが、最終的な画像はあまり正確ではありません。最終結果が、影、ぼかし、またはエッジ効果のないビットマップ ピクセルのように見えるようにしたい..

これは一例です (Panel はグリッドに付けられた名前です)

 public partial class Window1 : Window {

    private Polyline zigzag;

    public Window1() {
        InitializeComponent();
        PointCollection points = new PointCollection();
        ArrayList axisX = new ArrayList();
        ArrayList axisY = new ArrayList();

        zigzag = new Polyline();
        zigzag.Stroke = Brushes.Black;

        int count = 1;
        Boolean increase = true;
        //the number 60 in this loop is to represent the width of the main shape
        for (int p = 3; p < 60 - 3; p++) {
            if (count == 1) {
                axisX.Add(p);
                axisY.Add(5);
                increase = true;
            }
            if (count == 4) {
                axisX.Add(p);
                axisY.Add(2);
                increase = false;
            }
            if (increase) {
                count++;
            }
            else {
                count--;
            }
        }

        for (int i = 0; i < axisX.Count; i++) {
            //the number 10 is to represent the position where the Poliline is to be placed
            int tmpx = 10 + (int)axisX[i];
            int tmpy = 10 + (int)axisY[i];
            points.Add(new Point(tmpx, tmpy));
        }

        this.zigzag.Points = points;
        RenderOptions.SetEdgeMode(Panel , EdgeMode.Aliased);
        Panel.Children.Add(zigzag);

    }

}

図は、上に描かれたジグザグを示し、下にどのように見えるかを示しています

ここに画像の説明を入力

4

1 に答える 1

2

座標系の原点は、左上のピクセルの左上隅にあります。中央のピクセルをヒットするには、3.5 などの座標を指定する必要があります。

コードを少し短くしましたが、気にしないでください。(まだ同じことをしますが、行数が少ないだけです)

PointCollection points = new PointCollection();

zigzag = new Polyline();
zigzag.Stroke = Brushes.Black;

for (int i = 1; i < 60 - 3; i = i + 3)
{
    points.Add(
        new Point(
            10.5f + i,
            10.5f + (i % 2 == 0 ? 2 : 5)
         ));
}

this.zigzag.Points = points;
RenderOptions.SetEdgeMode(Panel1, EdgeMode.Aliased);
Panel1.Children.Add(zigzag);

両方向の平行移動を 10 から 10.5 に増やしました。小数部分は、ピクセルの中心を示すために 0.5 にする必要があります。

于 2013-03-29T16:16:37.890 に答える