我想做的是创建这个旋转圆锥体的视觉效果,就像我几年前做的那样,但没有使用direct。回到那个时候,我使用了一个非常旧的directx dll文件。
到目前为止,我已经尝试过:
即使IM将刻度改变为50或更大,电弧仍然没有被填充。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
pictureBox1.Invalidate();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
var g = e.Graphics;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
var center = new Point(pictureBox1.Width / 2, pictureBox1.Height / 2);
var innerR = 30;
var thickness = 20;
var startAngle = 0;
var arcLength = 360;
var outerR = innerR + thickness;
var outerRect = new Rectangle
(center.X - outerR, center.Y - outerR, 2 * outerR, 2 * outerR);
var innerRect = new Rectangle
(center.X - innerR, center.Y - innerR, 2 * innerR, 2 * innerR);
using (var p = new GraphicsPath())
{
p.AddArc(outerRect, startAngle, arcLength);
p.AddArc(innerRect, startAngle + arcLength, -arcLength);
p.CloseFigure();
e.Graphics.FillPath(Brushes.Green, p);
e.Graphics.DrawPath(Pens.Green, p);
}
}
}
如果厚度是20或更小,我希望能够填充弧。同样,如果半径innerR是更大或更小,能够填充它。
目标是能够在任何情况下填充弧。
1条答案
按热度按时间u3r8eeie1#
这里有一种绘制圆锥体的方法。
它看起来像雷达扫描,因此您可能需要定义扫描Angular 和旋转速度(根据计时器的间隔,当前旋转Angular 增加了多少)。
使用标准的System.Windows.Forms.Timer使包含图像的画布无效。
它是用
LinearGradientBrush
填充的,靠近中心的部分比靠近边界的部分透明度低;按需调整每次旋转Angular 达到
360°
时,都会重置为0
。这将委托给计时器的
Tick
事件处理程序=〉使用.Net 7构建,但如果您需要将其适配到.Net Framework,则只需更改
using
块的语法,从此处删除空值宽容运算符:canvas!.ClientRectangle
和可空引用类型(例如,将object?
更改为object
)它是这样工作的: