🔧 角度/高度选择器控件 for .NET
Conmajia © 2012
Updated on Mar. 5, 2018
简介
Adobe Photoshop

这么可爱的控件
基础知识
勾股定理
勾股定理是老祖宗传下的数学神器. 以图

单位圆
如图

三角函数
三个基本的三角函数用于从角度计算各边比值
实现
点和角度的函数
下面这两个函数用于计算点和角度
第一个函数 DegreesToXY
private PointF DegreesToXY(float degrees, float radius, Point origin)
{
PointF xy = new PointF();
double radians = degrees * Math.PI / 180.0;
xy.X = (float)Math.Cos(radians) * radius + origin.X;
xy.Y = (float)Math.Sin(-radians) * radius + origin.Y;
return xy;
}
注意
代码中用到的是
第二个函数 XYToDegrees
private float XYToDegrees(Point xy, Point origin)
{
double angle = 0.0;
if (xy.Y < origin.Y)
{
if (xy.X > origin.X)
{
angle = (double)(xy.X - origin.X) / (double)(origin.Y - xy.Y);
angle = Math.Atan(angle);
angle = 90.0 - angle * 180.0 / Math.PI;
}
else if (xy.X < origin.X)
{
//如此这般
}
}
else if (xy.Y > origin.Y)
{
//如此这般
}
if (angle > 180) angle -= 360; //控制角度范围
return (float)angle;
}
这个函数通过检查鼠标相对中心点的位置
绘制控件
这两个控件的背景相同
- 用宽度为
Pen
- 用 40% 不透明度的白色填充
- 控件中心是 3×3 像素的正方形
protected override void OnPaint(PaintEventArgs e)
{
//...
//Draw
g.SmoothingMode = SmoothingMode.AntiAlias;
g.DrawEllipse(outline, drawRegion);
g.FillEllipse(fill, drawRegion);
//...
g.SmoothingMode = SmoothingMode.HighSpeed;
g.FillRectangle(Brushes.Black, originSquare);
//...
}
在绘制圆圈时把SmoothMode
AntiAlias
SmoothMode
HighSpeed
DegreesToXY
处理用户点击
有了XYToDegrees
MouseDown
MouseMove
private int findNearestAngle(Point mouseXY)
{
int thisAngle = (int)XYToDegrees(mouseXY, origin);
if (thisAngle != 0)
return thisAngle;
else
return -1;
}
高度控件需要额外的处理
private int findAltitude(Point mouseXY)
{
float distance = getDistance(mouseXY, origin);
int alt = 90 - (int)(90.0f * (distance / origin.X));
if (alt < 0) alt = 0;
return alt;
}
在
自定义事件
为了让控件更加专业
public delegate void AngleChangedDelegate();
public event AngleChangedDelegate AngleChanged;
每次变更Angle
AngleChanged()
下载
Demo
源代码
The End.
if(jQuery('#no-reward').text() == 'true') jQuery('.bottom-reward').addClass('hidden');
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?