线段余弦角+凸包算法
2016-06-06 11:42
381 查看
/// /// 根据余弦定理求两个线段夹角 /// /// 端点 /// start点 /// end点 /// double Angle(PointF o, PointF s, PointF e) { double cosfi = 0, fi = 0, norm = 0; double dsx = s.X - o.X; double dsy = s.Y - o.Y; double dex = e.X - o.X; double dey = e.Y - o.Y; cosfi = dsx * dex + dsy * dey; norm = (dsx * dsx + dsy * dsy) * (dex * dex + dey * dey); cosfi /= Math.Sqrt(norm); if (cosfi >= 1.0) return 0; if (cosfi <= -1.0) return Math.PI; fi = Math.Acos(cosfi); if (180 * fi / Math.PI < 180) { return 180 * fi / Math.PI; } else { return 360 - 180 * fi / Math.PI; } } /// <summary> /// 凸包算法 /// </summary> /// <param name="_list"></param> /// <returns></returns> private List<TuLine> BruteForceTu(List<Info> _list) { //记录极点对 List<TuLine> role = new List<TuLine>(); //遍历 for (int i = 0; i < _list.Count - 1; i++) { for (int j = i + 1; j < _list.Count; j++) { double a = _list[j].Y - _list[i].Y; double b = _list[i].X - _list[j].X; double c = _list[i].X * _list[j].Y - _list[i].Y * _list[j].X; int count = 0; //将所有点代入方程 for (int k = 0; k < _list.Count; k++) { double result = a * _list[k].X + b * _list[k].Y - c; if (result > 0) { count++; } else if (result < 0) { count--; } } //是极点,则将连线记录下来 if (Math.Abs(count) == _list.Count - 2) { TuLine line = new TuLine(); IPoint pi = new PointClass(); pi.X = _list[i].X; pi.Y = _list[i].Y; line.Begin = pi; IPoint Pj = new PointClass(); Pj.X = _list[j].X; Pj.Y = _list[j].Y; line.End = Pj; role.Add(line); } } } return role; }
相关文章推荐
- ThinkPHP中简单的CURD操作
- 详解C中volatile关键字(转)
- Android性能优化总结
- C++Primer Chapter3课后习题
- javascript中this执行上下文的改变
- C 程序的存储空间布局
- NIO 入门
- Hibernate学习及问题记录(1)——纠结的第一战
- 巧用screenrecord,复现bug好帮手
- 微信公众号开发小计
- mac端的优秀抓包工具——Charles使用
- 从Heron看实时计算系统差异对比
- fflush(stdin)与fflush(stdout)
- spring(5)构建 spring web 应用程序
- js的offsetLeft,scrollLeft,offsetTop,scrollTop等等的用法
- Echarts 定时刷新
- centos node卸载
- fflush(stdin)与fflush(stdout)
- Python案例-开发之路-文件内容查找并修改
- 让gradle执行cmd 或者其他exe命令的方法