2017-07-15 4 views
0

Ich frage mich, ob es einen Weg in OpenCv gibt, einen circle mit einem gegebenen Radius zu einem polygon (z. B. Fünfeck oder Sechseck oder so ähnlich) zu konvertieren?OpenCv konvertiert Kreis zu Polygon

Kreis ist recht einfach:

cv::circle(myMat, center_point, radius, colour, 2, 16); 

und Polygon ist einfach wie gut:

cv::polylines(myMat, points, isClosed, colour, 2, 16); 

Mein Ansatz ist die folgende:

int length = 150; 
Point center_point(500, 500); 

Point P1; 
P1.x = (int)round(center_point.x + length * cos(0 * CV_PI/180.0)); 
P1.y = (int)round(center_point.y + length * sin(0 * CV_PI/180.0)); 

Point P2; 
P2.x = (int)round(center_point.x + length * cos(45 * CV_PI/180.0)); 
P2.y = (int)round(center_point.y + length * sin(45 * CV_PI/180.0)); 

Point P3; 
P3.x = (int)round(center_point.x + length * cos(90 * CV_PI/180.0)); 
P3.y = (int)round(center_point.y + length * sin(90 * CV_PI/180.0)); 

Point P4; 
P4.x = (int)round(center_point.x + length * cos(135 * CV_PI/180.0)); 
P4.y = (int)round(center_point.y + length * sin(135 * CV_PI/180.0)); 

Point P5; 
P5.x = (int)round(center_point.x + length * cos(180 * CV_PI/180.0)); 
P5.y = (int)round(center_point.y + length * sin(180 * CV_PI/180.0)); 

Point P6; 
P6.x = (int)round(center_point.x + length * cos(225 * CV_PI/180.0)); 
P6.y = (int)round(center_point.y + length * sin(225 * CV_PI/180.0)); 

Point P7; 
P7.x = (int)round(center_point.x + length * cos(270 * CV_PI/180.0)); 
P7.y = (int)round(center_point.y + length * sin(270 * CV_PI/180.0)); 

Point P8; 
P8.x = (int)round(center_point.x + length * cos(315 * CV_PI/180.0)); 
P8.y = (int)round(center_point.y + length * sin(315 * CV_PI/180.0)); 

cv::polylines(myMat, {P1,P2,P3,P4,P5,P6,P7,P8}, isClosed, colour, 2, 16); 

, die arbeitet, aber ich war sich fragen, ob es einen schlaueren Weg gibt, es zu tun?

Antwort

1

Natürlich gibt es einen schlaueren Weg - benutzen Sie Array und Loops.

for(i=0;i<N;i++) { 
    P[i].x = (int)round(center_point.x + length * cos(i * 2 * CV_PI/N)); 
    P[i].y = (int)round(center_point.y + length * sin(i * 2 * CV_PI/N)); 
} 
+0

gut so einfach. Dank dafür – user1234

Verwandte Themen