WPF、多边形和多边形联合体

3
我正在使用WPF构建一个C#应用程序,我想要绘制形状。每个形状都属于一个类,该类包含一个多边形作为外形,以及1到3条折线使其看起来像真正的2D对象。这样,我可以在运行时更改整个形状的某些属性(颜色、可见性等)。需要注意的是,有些折线是根据所需的高度和宽度创建的循环。
但是现在我遇到了一些渲染PolyLines的问题。如果使用画图工具表示调试结束后提取的点,则点的位置(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);

    }

}

这张图片展示了上面绘制的锯齿形状,应该在下面看起来像这样。
1个回答

3

坐标系统的原点位于左上角的左上像素。要命中中间的像素,必须指定像素坐标,如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,以表示像素的中心。


非常感谢您的解释,速度非常快。我喜欢代码可以缩短的方式,虽然在应用程序的其他部分可能没有用处,但它仍然很有用。 - Jorge Muñoz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接