2016-12-23 2 views
-4

프로젝트에 필요하지만 유용한 것은 없습니다. 내가 찾은 최고의 기능은 opencv의 그리기 기능이지만 이전에 그린 원은 그대로 유지되므로 원을 왼쪽에서 오른쪽으로 이동하려면 선으로 끝납니다. 우리는 또한 아마도 뭔가 도움이 OpenGL을 사용합니다. 그리고 그것을 다른 이미지와 비교하기 위해 매트로 저장해야합니다.원을 만들려면 opencv 또는 opengl을 사용하여 원을 움직이거나 움직이십시오.

+0

당신은 사용해 볼 수 있습니다 [이] (http://docs.opencv.org/2.4/doc/tutorials/introduction/display_image/display_image.html). 원 크기를 늘리거나 줄이는 창에 슬라이딩 바를 추가 할 수 있습니다. –

+0

하지만 서클을 옮겨서 크기를 조정하지 않겠습니다. – Dario

+0

그런 다음 [this] (http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html#circle)을 사용하고 슬라이딩 바를 사용하여 센터를 변경하십시오. –

답변

0

OpenGL과 관련하여 사용중인 OS 및 API에 대해 언급하지 않았습니다. 또한 반드시 필요한, 당신은 당신이 사용하는 OpenGL 버전을 언급하지 않았다. 아시다시피, 현대적인 접근 방식은 셰이더를 사용하는 것입니다. 내 대답은 간단하고 명료하게하기 위해 GLUT API를 사용하여 오래된 OpenGL을 사용합니다. 먼저 아무것도없는 원하지만 다음의 식

(Xcenter + radius*cos(angle), Ycenter + radius*sin(angle))

에 따라 점의 무리를 생성 할 필요는 OpenGL에서 원 운동을 애니메이션하려면 키보드의 키에 의해인지 원을 이동하려는 경우 또는 다른 방법을 사용한다면 원의 중심 (예 : Xcenter 및 Ycenter)을 업데이트해야합니다. 다음 예제에서는 키보드 화살표 키에 따라 원을 이동합니다.

enter image description here

는 그리고 이것은 코드입니다.

#include <cmath> 
#include <vector> 
#include "glut.h" 


class Circle 
{ 
public: 
    Circle(); 
    void draw() const; 
    inline void moveUP() { m_cenY += 0.05f; refillCircPoints(); } 
    inline void moveDOWN() { m_cenY -= 0.05f; refillCircPoints(); } 
    inline void moveLEFT() { m_cenX -= 0.05f; refillCircPoints(); } 
    inline void moveRIGHT() { m_cenX += 0.05f; refillCircPoints(); } 
private: 
    float m_cenX, m_cenY, m_radius; 
    std::vector<float> circlePoints; 
    void refillCircPoints(); 
}; 

Circle::Circle() : m_cenX(0.0f), m_cenY(0.0f), m_radius(0.1f) 
{ 
    for (float angle(0); angle < 0.0174533f*360.0f; angle += 0.0174533f*0.1f){ 
     circlePoints.push_back(m_cenX + m_radius*cos(angle)); 
     circlePoints.push_back(m_cenY + m_radius*sin(angle)); 
    } 
} 

void Circle::refillCircPoints() 
{ 
    circlePoints.clear(); 
    for (float angle(0); angle < 0.0174533f*360.0f; angle += 0.0174533f*0.1f){ 
     circlePoints.push_back(m_cenX + m_radius*cos(angle)); 
     circlePoints.push_back(m_cenY + m_radius*sin(angle)); 
    } 
} 

void Circle::draw() const 
{ 
    for (unsigned int i(0); i < circlePoints.size(); i+=2){ 
     glBegin(GL_POINTS); 
      glVertex3f(circlePoints[i],circlePoints[i+1],0.0); 
     glEnd(); 
    } 
} 

Circle myCircle; 

void display(void) { 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    myCircle.draw(); 

    glutSwapBuffers(); 
} 

void glutSpecialInput(int key, int x, int y); 
void glutIdle(); 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 

    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); 
    glutInitWindowPosition(100,100); 
    glutInitWindowSize(320,320); 
    glutCreateWindow("GLUT Window"); 
    glutDisplayFunc(display); 
    glutSpecialFunc(glutSpecialInput); 
    glutIdleFunc(glutIdle); 
    glutMainLoop(); 


    return 0; 
} 

void glutIdle() 
{ 
    glutPostRedisplay(); 
} 

void glutSpecialInput(int key, int x, int y) 
{ 
    switch(key) 
    { 
     case GLUT_KEY_UP: 
      myCircle.moveUP(); 
     break; 
     case GLUT_KEY_DOWN: 
      myCircle.moveDOWN(); 
     break; 
     case GLUT_KEY_LEFT: 
      myCircle.moveLEFT(); 
     break; 
     case GLUT_KEY_RIGHT: 
      myCircle.moveRIGHT(); 
     break; 
    } 
} 
관련 문제