2016-12-23 115 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,你没有提到你正在使用的操作系统和API。此外,这是必要的,你没有提到你使用的是哪个OpenGL版本。如你所知,现代的方法是利用着色器。在我的回答中,为了简单和清晰起见,我使用了带有GLUT API的旧版OpenGL。 要在OpenGL动画一个圆圈运动,首先你需要生成一个圆,不过是根据以下公式

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

一个点的一堆如果您想通过键盘上的按键来移动圆圈是否或其他方式,那么你需要更新你的圈子的中心(即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; 
    } 
}