Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建椭圆和直线的组合几何_C#_Wpf - Fatal编程技术网

C# 如何创建椭圆和直线的组合几何

C# 如何创建椭圆和直线的组合几何,c#,wpf,C#,Wpf,我想在里面画一个不包括十字架的椭圆。我怀疑我需要使用不透明遮罩。以下是我如何努力做到这一点 Color grey = Color.FromArgb(128, Colors.Gray.R, Colors.Gray.G, Colors.Gray.B); double radius = Math.Min(ActualWidth, ActualHeight) / 2; Brush ellipse_brush = new SolidColorBrush(grey); CombinedGeometry c

我想在里面画一个不包括十字架的椭圆。我怀疑我需要使用不透明遮罩。以下是我如何努力做到这一点

Color grey = Color.FromArgb(128, Colors.Gray.R, Colors.Gray.G, Colors.Gray.B);
double radius = Math.Min(ActualWidth, ActualHeight) / 2;
Brush ellipse_brush = new SolidColorBrush(grey);

CombinedGeometry cg = new CombinedGeometry();

Drawing maskDrawing = new GeometryDrawing(Brushes.Lime, null, cg);
DrawingBrush mask = new DrawingBrush(maskDrawing);

dc.PushOpacityMask(mask);
dc.DrawEllipse(ellipse_brush, new Pen(ellipse_brush, 0), new Point(radius, radius), radius, radius);
dc.Pop();

问题是我不知道如何为椭圆和两条直线创建组合几何。或者我走错了路?

您不需要将不透明度遮罩与
组合几何测量结合使用

使用两条线和一支合适的笔从
几何体组创建交叉轮廓几何体,然后将其与椭圆几何体组合,并绘制结果:

var radius = Math.Min(ActualWidth, ActualHeight) / 2;
var crossSize = 0.8 * radius;
var crossThickness = 0.3 * radius;
var centerPoint = new Point(radius, radius);
var ellipseGeometry = new EllipseGeometry(centerPoint, radius, radius);
var crossGeometry = new GeometryGroup();

crossGeometry.Children.Add(new LineGeometry(
    new Point(centerPoint.X - crossSize / 2, centerPoint.Y - crossSize / 2),
    new Point(centerPoint.X + crossSize / 2, centerPoint.Y + crossSize / 2)));
crossGeometry.Children.Add(new LineGeometry(
    new Point(centerPoint.X - crossSize / 2, centerPoint.Y + crossSize / 2),
    new Point(centerPoint.X + crossSize / 2, centerPoint.Y - crossSize / 2)));

var crossPen = new Pen
{
    Thickness = crossThickness,
    StartLineCap = PenLineCap.Round,
    EndLineCap = PenLineCap.Round
};

var crossOutlineGeometry = crossGeometry.GetWidenedPathGeometry(crossPen);
var combinedGeometry = new CombinedGeometry(GeometryCombineMode.Xor,
                                            ellipseGeometry, crossOutlineGeometry);

dc.DrawGeometry(Brushes.Gray, null, combinedGeometry);

您不需要将不透明度遮罩与
组合几何测量法结合使用

使用两条线和一支合适的笔从
几何体组创建交叉轮廓几何体,然后将其与椭圆几何体组合,并绘制结果:

var radius = Math.Min(ActualWidth, ActualHeight) / 2;
var crossSize = 0.8 * radius;
var crossThickness = 0.3 * radius;
var centerPoint = new Point(radius, radius);
var ellipseGeometry = new EllipseGeometry(centerPoint, radius, radius);
var crossGeometry = new GeometryGroup();

crossGeometry.Children.Add(new LineGeometry(
    new Point(centerPoint.X - crossSize / 2, centerPoint.Y - crossSize / 2),
    new Point(centerPoint.X + crossSize / 2, centerPoint.Y + crossSize / 2)));
crossGeometry.Children.Add(new LineGeometry(
    new Point(centerPoint.X - crossSize / 2, centerPoint.Y + crossSize / 2),
    new Point(centerPoint.X + crossSize / 2, centerPoint.Y - crossSize / 2)));

var crossPen = new Pen
{
    Thickness = crossThickness,
    StartLineCap = PenLineCap.Round,
    EndLineCap = PenLineCap.Round
};

var crossOutlineGeometry = crossGeometry.GetWidenedPathGeometry(crossPen);
var combinedGeometry = new CombinedGeometry(GeometryCombineMode.Xor,
                                            ellipseGeometry, crossOutlineGeometry);

dc.DrawGeometry(Brushes.Gray, null, combinedGeometry);

十字架不应该被填满,也就是说画成透明的?@Clemens:是的,就像cutout@Clemens非常感谢。抱歉耽搁了。十字架不应该被填满,也就是说画成透明的?@Clemens:是的,就像cutout@Clemens非常感谢。抱歉耽搁了。