emgucv 원호 그리기
3420 단어 EmguCV
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);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
emgucv 원호 그리기텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.