gpt4 book ai didi

c# - 三点角的圆弧怎么画?

转载 作者:行者123 更新时间:2023-11-30 21:05:54 33 4
gpt4 key购买 nike

我正在创建一个可以绘制角度的控件。我有三个依赖对象。

  • 半径:直线的长度
  • StartAngle:我应该从什么角度开始
  • 角度

这是程序当前绘制的屏幕截图(红线是我要绘制的)。

enter image description here

所以我还没有完成的是弧线。我需要一些帮助来画它。这是我的。

public class AngleControl2 : Control
{
static AngleControl2()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(AngleControl2), new FrameworkPropertyMetadata(typeof(AngleControl2)));
}

public double Angle
{
get { return (double)base.GetValue(AngleProperty); }
set { base.SetValue(AngleProperty, value); }
}

public static readonly DependencyProperty AngleProperty =
DependencyProperty.Register("Angle", typeof(double), typeof(AngleControl2), new PropertyMetadata(90.0, new PropertyChangedCallback(AngleChanged)));

public double StartAngle
{
get { return (double)base.GetValue(StartAngleProperty); }
set { base.SetValue(StartAngleProperty, value); }
}

public static readonly DependencyProperty StartAngleProperty =
DependencyProperty.Register("StartAngle", typeof(double), typeof(AngleControl2), new PropertyMetadata(0.0, new PropertyChangedCallback(AngleChanged)));

public double Radius
{
get { return (double)base.GetValue(RadiusProperty); }
set { base.SetValue(RadiusProperty, value); }
}

public static readonly DependencyProperty RadiusProperty =
DependencyProperty.Register("Radius", typeof(double), typeof(AngleControl2), new PropertyMetadata(100.0));

static void AngleChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
AngleControl2 c = (AngleControl2)property;

Line line1 = c.GetTemplateChild("PART_Line1") as Line;
Line line2 = c.GetTemplateChild("PART_Line2") as Line;

if (line1 != null)
{
line1.X2 = Math.Cos((c.StartAngle + c.Angle) * (Math.PI / 180)) * c.Radius;
line1.Y2 = Math.Sin((c.StartAngle + c.Angle) * (Math.PI / 180)) * c.Radius;
}

if (line2 != null)
{
line2.X2 = Math.Cos(c.StartAngle * (Math.PI / 180)) * c.Radius;
line2.Y2 = Math.Sin(c.StartAngle * (Math.PI / 180)) * c.Radius;
}
}
}

最佳答案

用 Path 代替 Line 会更容易。例如,如果您有以下模板

<Canvas Width="200" Height="200">
<Path x:Name="PART_Path" Stroke="Green" StrokeThickness="3" Canvas.Left="100" Canvas.Top="100"/>
</Canvas>

然后您可以在 AngleChanged 事件中使用此代码:

Path path = c.GetTemplateChild("PART_Path") as Path;

if (path != null)
{
Point p = new Point(
Math.Cos((this.StartAngle + this.Angle) * (Math.PI / 180)) * this.Radius,
Math.Sin((this.StartAngle - this.Angle) * (Math.PI / 180)) * this.Radius);

Point q = new Point(
Math.Cos((this.StartAngle) * (Math.PI / 180)) * this.Radius,
Math.Sin((this.StartAngle) * (Math.PI / 180)) * this.Radius);

path.Data = new PathGeometry()
{
Figures = new PathFigureCollection()
{
new PathFigure()
{
StartPoint = new Point(0, 0),
Segments = new PathSegmentCollection()
{
new LineSegment() { Point = p }
}
},
new PathFigure()
{
StartPoint = new Point(0, 0),
Segments = new PathSegmentCollection()
{
new LineSegment() { Point = q }
}
},
new PathFigure()
{
StartPoint = new Point(p.X/3, p.Y/3),
Segments = new PathSegmentCollection()
{
new ArcSegment()
{
IsLargeArc = (Math.Abs(this.Angle) % 360) > 180,
RotationAngle = Math.Abs(this.Angle) * (Math.PI / 180),
SweepDirection = this.Angle < 0 ? SweepDirection.Counterclockwise : SweepDirection.Clockwise,
Point = new Point(q.X/ 3, q.Y/ 3),
Size = new Size(this.Radius / 3, this.Radius/3)
}
}
},
}
};
}

注意,像这样在 OnApplyTemplate() 中调用 AngleChanged 处理程序也是一个更好的主意,这样视觉对象就会在启动时显示。

protected override void OnApplyTemplate()
{
base.OnApplyTemplate();
AngleChanged(this, null);
}

关于c# - 三点角的圆弧怎么画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11441793/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com