基于CE平台下调用底层API画圆弧?希望给予指导~~
2011-03-12 11:35
288 查看
在windows PC下GDI32.dll中有arc或者是ArcTo这个画圆弧函数,但是基于windows CE下没有,本人利用的就算计图形学画的圆弧,有什么不当的地方请指出,O(∩_∩)O谢谢(这里只考虑了画圆~而不是椭圆)
代码如下:
这里要说明一下,基于GDI32.dll中的画圆弧中的顺序是逆时针,请留意,不过将起始点和终止点互换就能达到顺时针了。
代码如下:
/// <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中的画圆弧中的顺序是逆时针,请留意,不过将起始点和终止点互换就能达到顺时针了。
相关文章推荐
- 基于Restful接口的网络API接口调用方法
- 基于华为CMPP2.0 API开发短信平台
- python在线调用AI平台API的几种方法
- 在云平台上基于Go语言+Google图表API提供二维码生成应用
- Java Sound API是javaSE平台提供底层的(low-level)处理声音接口。
- B2B2C网上商城开发指南——基于SaaS和淘宝API开放平台
- 即时通讯开发之调用API接口快速在IOS平台的即时通讯应用开发
- OpenJWeb平台数据库API调用手册(Spring+Hibernate)
- 调用阿里云短信服务平台API实现ERP系统短信发送功能
- Microsoft Windows 平台下 API调用与单片机进行串口通信
- Anyka云平台调用api
- CE下基于Zylonite硬件平台的SD卡驱动开发
- Regan_API_SpringBoot 一个基于注释生成JAVA API文档的接口平台
- 基于java底层api实现的nio
- 即时通讯开发之调用API接口快速在IOS平台的即时通讯应用开发
- 暴强贴:从.NET平台调用Win32 API
- 从.NET平台调用Win32 API
- Python Web中REST API使用示例——基于云平台+云服务打造自己的在线翻译工具
- 基于Metaweblog API 接口一键发布到国内外主流博客平台
- Android平台调用WebService详解(基于SOAP协议)