我尝试用几个XAML Path对象(代码中声明的)创建一个由几条弧线构成的圆,问题是在绘制时,路径最终没有对齐,如下图所示(尝试绘制两条180度的弧线)。
添加的路径越多,情况就越糟,这表明未对准以某种方式累积起来。
我重新检查了几次我的计算。我也试着将x值偏移1个位置,以防错误来自重叠的路径段。也许这是渲染的一个更深层次的问题?
编号
这段代码有点粗糙,但简单地说,我从Angle = 0
开始,加上45度,画一条弧到这一点,然后从上一条弧结束的地方再次重复这一过程,如第二张图所示。
double Angle = 0;
double Radius = 150; //half the width of the yellow square
Point StartPoint = new Point(150, 0);
...
Arcs = new ObservableCollection<Path>(); //used as a source for ItemsControl to bind to
while (Angle < Math.PI*2)
{
Angle += Math.PI / 4;
//subtracting Math.PI/2 to account for starting the first arc at x=150, y=0
double sin = Math.Sin(Angle - Math.PI / 2);
double cos = Math.Cos(Angle - Math.PI / 2);
double nX = Math.Round(cos * Radius + 150);
double nY = Math.Round(sin * Radius + 150);
Point endPoint = new Point(nX, nY);
Path p = CreatePath(StartPoint, endPoint);
StartPoint = endPoint;
Arcs.Add(p);
}
CreatePath
函数主要是XAML填充符,但在这里只是以防万一
private Path CreatePath(Point start, Point end)
{
PathSegment ps = new ArcSegment()
{
Size = new Size(Radius, Radius),
Point = end,
SweepDirection = SweepDirection.Clockwise
};
PathFigure pf = new()
{
StartPoint = start,
IsClosed = false,
IsFilled = false,
Segments = new PathSegmentCollection() { ps }
};
Geometry g = new PathGeometry()
{
Figures = new PathFigureCollection() { pf }
};
Path p = new()
{
Data = g,
Stroke = new SolidColorBrush(Colors.Black),
StrokeThickness = 3
};
return p;
}
还有更好的方法来完成我想做的事情吗?
1条答案
按热度按时间9o685dep1#
问题是在创建多个Path对象时,每个对象都会推动其相邻对象,从而导致轻微但累积的未对齐。我认为有两种解决方案:
1.重构代码,将所有内容都保存在一个父Path对象中,我没有选择这个方法,因为我想在每个Path段上使用不同的Property animations。
1.我选择了更多的hacky解决方案。在创建每个Path对象时,添加一个额外的属性,