WPF,Polygon和Poly

时间:2013-03-29 15:29:04

标签: c# wpf polygon polyline

我正在使用WFP构建应用程序C#,我正在尝试绘制形状,每个形状属于一个类,这样的类包含外部形状的Polygon,以及1到3个折线使其看起来像真正的2D对象,这样我就可以动态改变整个形状的一些属性(颜色,可见性等) 我必须说一些折线是根据所需的高度和宽度由循环创建的

但现在我正面临着一些带有PolyLines渲染的探测器 如果使用paint来表示在调试结束时提取的点,则点位于正确的位置(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);

    }

}

图片显示上面绘制的之字形,以及下面的方式

enter image description here

1 个答案:

答案 0 :(得分: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以指示像素的中心。