您的位置:首页 > 其它

基于CE平台下调用底层API画圆弧?希望给予指导~~

2011-03-12 11:35 288 查看
在windows PC下GDI32.dll中有arc或者是ArcTo这个画圆弧函数,但是基于windows CE下没有,本人利用的就算计图形学画的圆弧,有什么不当的地方请指出,O(∩_∩)O谢谢(这里只考虑了画圆~而不是椭圆)

代码如下:

/// <summary>
/// 获取圆弧上的点(中点画圆法)
/// </summary>
/// <param name="x0">中心点X坐标</param>
/// <param name="y0">中心点Y坐标</param>
/// <param name="r">半径</param>
/// <returns>所有圆上的点</returns>
private List<Point> Bresebhan(int x0, int y0, int r)
{
List<Point>[] pts = new List<Point>[4];
for (int i = 0; i < 4; i++)
{
pts[i] = new List<Point>();
}
int x = r; int y = 0;
int delta = 2 * (1 - r);
int delta1 = 0;
int delta2 = 0;
byte direction = 0;
//添加起点
pts[0].Add(new Point(x + x0, y + y0));
while (x >= 0)
{

if (delta < 0)
{
delta1 = 2 * (delta + x) - 1;
if (delta1 <= 0) direction = 1;
else direction = 2;
}
else if (delta > 0)
{
delta2 = 2 * (delta - y) - 1;
if (delta2 <= 0) direction = 2;
else direction = 3;
}
else direction = 2;
switch (direction)
{
case 1: y++; delta += 2 * y + 1; break;
case 2: y++; x--; delta += 2 * (y - x + 1); break;
case 3: x--; delta += (-2 * x + 1); break;
}
pts[0].Add(new Point(x + x0, y + y0));
pts[1].Add(new Point(x0 - y, y0 + x));
pts[2].Add(new Point(x0 - x, y0 - y));
pts[3].Add(new Point(y + x0, y0 - x));
}
//pts[1].Reverse();
//pts[3].Reverse();
List<Point> lines = new List<Point>();
lines.AddRange(pts[0]);
lines.AddRange(pts[1]);
lines.AddRange(pts[2]);
lines.AddRange(pts[3]);
return lines;
}
/// <summary>
/// 判断距离该点最近的点
/// </summary>
/// <param name="X">判断点的X坐标</param>
/// <param name="Y">判断点的Y坐标</param>
/// <param name="pt">所有判断点</param>
/// <returns>最近点的位置</returns>
private int GetClosePoint(int X, int Y, Point[] pt)
{
for (int i = 0; i < pt.Length; i++)
{
if ((Math.Abs(X - pt[i].X) + Math.Abs(Y - pt[i].Y)) < 3)
{
return i;
}
}
return -1;
}
/// <summary>
/// 获取圆弧坐标库
/// </summary>
/// <param name="x0">中心点X坐标</param>
/// <param name="y0">中心点Y坐标</param>
/// <param name="r">半径</param>
/// <param name="start_angel">起始角度(度)</param>
/// <param name="end_angel">终止角度(度)</param>
/// <returns>圆弧坐标库</returns>
private Point[] GetArcPoints(int x0, int y0, int r, double start_angel, double end_angel)
{
List<Point> temp = new List<Point>();
List<Point> pts = Bresebhan(x0, y0, r);
//将度转换成弧度
start_angel = start_angel * Math.PI / 180;
end_angel = end_angel * Math.PI / 180;
//计算始末点坐标
int startx = (int)(x0 + r * Math.Cos(start_angel));
int starty = (int)(y0 + r * Math.Sin(start_angel));
int endx = (int)(x0 + r * Math.Cos(end_angel));
int endy = (int)(y0 + r * Math.Sin(end_angel));
temp.Add(new Point(startx, starty));
//开始点指针
int start_index = GetClosePoint(startx, starty, pts.ToArray());
//结束点指针
int end_index = GetClosePoint(endx, endy, pts.ToArray());
//判断方向
if (start_index < end_index)
{
pts.RemoveRange(end_index, pts.Count - end_index);
pts.RemoveRange(0, start_index);
temp = pts;
}
else if (start_index > end_index)
{

// temp = pts;
temp.AddRange(pts.GetRange(start_index, pts.Count - start_index - 1));
temp.AddRange(pts.GetRange(0, end_index));
}
//pts.Insert(0,new Point(startx, starty));
//加末点
pts.Add(new Point(endx, endy));
return temp.ToArray();
}


这里要说明一下,基于GDI32.dll中的画圆弧中的顺序是逆时针,请留意,不过将起始点和终止点互换就能达到顺时针了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: