emgucv 画圆弧
2016-03-25 16:28
731 查看
emgucv中没有根据给定点画圆弧的函数,自己写了一个,在此给出该函数。其中DrawPixel函数是将圆弧中的点标记一下,需要根据自己程序里的函数具体给出。
private void DrawArc( List<Point> points ) //三个点 { double x1 = points[0].X; double x2 = points[1].X; double x3 = points[2].X; double y1 = points[0].Y; double y2 = points[1].Y; double y3 = points[2].Y; double x, y; double r; double a, b, c, d, e, f; a = 2 * (x2 - x1); b = 2 * (y2 - y1); c = x2 * x2 + y2 * y2 - x1 * x1 - y1 * y1; d = 2 * (x3 - x2); e = 2 * (y3 - y2); f = x3 * x3 + y3 * y3 - x2 * x2 - y2 * y2; x = (b * f - e * c) / (b * d - e * a); y = (d * c - a * f) / (b * d - e * a); r = Math.Sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1)); double startAngle = Math.Atan2( points[0].Y-y, points[0].X-x ); double endAngle = Math.Atan2(points[2].Y - y, points[2].X - x); double midAngle = Math.Atan2(points[1].Y - y, points[1].X - x); double xi, yi; //循环过程中实时的点 double minAngle = startAngle <= endAngle ? startAngle : endAngle; double maxAngle = startAngle <= endAngle ? endAngle : startAngle; if (midAngle < minAngle || midAngle > maxAngle) //所需要画的弧穿越了二三象限的交线,需要分成2部分来画 { xi = (r * Math.Cos(minAngle)); yi = (r * Math.Sin(minAngle)); do { if ((int)(x + xi + 0.5) >= 0 && (int)(x + xi + 0.5) < currentImage.Width && (int)(y + yi + 0.5) >= 0 && (int)(y + yi + 0.5) < currentImage.Height) { ps.Add(new Point((int)(x + xi + 0.5), (int)(y + yi + 0.5))); currentImage[ps[ps.Count - 1].Y, ps[ps.Count - 1].X] = new Gray(255); } minAngle -= 0.001; xi = (r * Math.Cos(minAngle)); yi = (r * Math.Sin(minAngle)); } while (minAngle >= -Math.PI); minAngle = maxAngle; xi = (r * Math.Cos(minAngle)); yi = (r * Math.Sin(minAngle)); do { if ((int)(x + xi + 0.5) >= 0 && (int)(x + xi + 0.5) < currentImage.Width && (int)(y + yi + 0.5) >= 0 && (int)(y + yi + 0.5) < currentImage.Height) { drawPixel((int)(y + yi + 0.5) , (int)(x + xi + 0.5)); } minAngle += 0.001; xi = (r * Math.Cos(minAngle)); yi = (r * Math.Sin(minAngle)); } while (minAngle <= Math.PI); } else //记录的三个点在圆上的点是按照从小到大的顺序排列的,从小到的顺序即可画完 { xi = (r * Math.Cos(minAngle)); yi = (r * Math.Sin(minAngle)); do { if ((int)(x + xi + 0.5) >= 0 && (int)(x + xi + 0.5) < currentImage.Width && (int)(y + yi + 0.5) >= 0 && (int)(y + yi + 0.5) < currentImage.Height) { drawPixel((int)(y + yi + 0.5) , (int)(x + xi + 0.5)); } minAngle += 0.001; xi = (r * Math.Cos(minAngle)); yi = (r * Math.Sin(minAngle)); } while (minAngle <= maxAngle); } }
相关文章推荐
- C#实验2.4
- static 和const关键字的用法总结
- POJ 2452 Sticks Problem
- Tomcat启动报Error listenerStart错误
- JVM划分Eden Space、Survivor Space、Tenured Gen,Perm Gen
- oracle拆分逗号分隔字符串 实现split
- 标准化组织 相关术语
- js高级程序设计(七)函数表达式
- Oracle 删除重复数据只留一条
- Git命令
- 数据仓库专题23-原则!原则!原则!
- preempt_enable 和 preempt_disable
- 获取info
- DICOM文件下载
- jvm最终配置
- java 集合框架
- bzoj2150部落战争 最小路径覆盖
- HDU 1224 Free DIY Tour(DP求最短路)
- 展示组织机构的树形组件
- 批处理