2016-12-23 118 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; 
    } 
}