2011-11-24 12 views
2

このコードでは、OpenGLでマウスポインタを使用して多角形を描画します。今度はこれを描画した後、ポリゴンを塗りつぶしてからポリゴンがポリゴンの内側か外側かで塗りつぶされているかどうかを調べるための巻き取りルールを実装するようにしたいと思います。どのように私はこれを達成することができます誰も教えてくれますか?OpenGLで巻線ルールを実装する

#include <cstdlib> 
#include <iostream> 
#include<GL/glut.h> 
GLsizei winWidth=400,winHeight=300; 
GLint endPtCtr=0; 
using namespace std; 

class scrPt 
{ 
public: 
    GLint x,y; 
}; 
void init(void) 
{ 
    glClearColor(0.0,0.0,1.0,1.0); 
    glMatrixMode(GL_PROJECTION); 
    gluOrtho2D(0.0,200.0,0.0,150.0); 
} 
void displayFcn(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
} 
void winReshapeFcn(GLint newWidth,GLint newHeight) 
{ 
    glViewport(0,0,newWidth,newHeight); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0.0,GLdouble(newWidth),0.0,GLdouble(newHeight)); 
    winWidth=newWidth; 
    winHeight=newHeight; 
} 
void drawLineSegment(scrPt endPt1,scrPt endPt2) 
{ 
    glBegin(GL_LINES); 
    glVertex2i(endPt1.x,endPt1.y); 
    glVertex2i(endPt2.x,endPt2.y); 
    glEnd(); 
} 
void polyLine(GLint button,GLint action,GLint xMouse,GLint yMouse) 
{ 
    static scrPt endPt1,endPt2; 
    if(endPtCtr==0) 
    { 
     if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN) 
     { 
      endPt1.x=xMouse; 
      endPt1.y=winHeight-yMouse; 
      endPtCtr=1; 
     } 
     else 
      if(button==GLUT_RIGHT_BUTTON) 
       exit(0); 
    } 
    else 
     if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN) 
     { 
      endPt2.x=xMouse; 
      endPt2.y=winHeight-yMouse; 
      drawLineSegment(endPt1,endPt2); 
      endPt1=endPt2; 
     } 
     else 
      if(button==GLUT_RIGHT_BUTTON) 
       exit(0); 
    glFlush(); 
} 
int main(int argc,char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
    glutInitWindowPosition(100,100); 
    glutInitWindowSize(winWidth,winHeight); 
    glutCreateWindow("Draw Interactive Polylines"); 
    init(); 
    glutDisplayFunc(displayFcn); 
    glutReshapeFunc(winReshapeFcn); 
    glutMouseFunc(polyLine); 
    glutMainLoop(); 
} 
+0

この質問は直接OpenGLに関連していません。あなたは、その目的のために(おそらくベクトル代数を使って)グラフィックスアルゴリズムを実装する必要があります。次に、別の問題は、OpenGLがそれを表示できるように、あなたのルールに従ってポリゴンを三角形分割することです。 – Kos

答えて

4

おそらく、OpenGLユーティリティライブラリ( 'GLU')が提供するテッセレータを使用することをお勧めします。 gluTessPropertyを使用して、奇数、零、負、正、または2以上の任意の値で巻線規則を指定できます。テッセレーションには、ユーザが記述したポリゴンなどの任意のポリゴンを、OpenGLがレンダリングできる凸ポリゴンのセットに変換する効果があります。

GLUはWindows上でa system libraryとして提供されていますが、通常Linux派生OSで利用でき、そのすべてではMESA実装をプロジェクトに直接簡単に組み込むことができます。私はそれを例えばiPadアプリケーションに配備しました。

追加:Dev Cを使用している場合は、すでにlibglu32.aライブラリが必要です。おそらく-lglu32経由でリンクしてください。 here(特に巻取規則の終わりの注記)またはhereに記載されているコードとガイダンスを使用することができます。

+0

私はこれをdev c + windowsでopenglを使って実装することができますか?より具体的に私に案内してください...またはできる場合は私にサンプルコードを提供してください。 – james

+0

悲しいことに私はWindowsの人ではありません特に具体的なものではありませんが、私はGLUの動作をスピードアップするためのリンクをいくつか追加しました.Dev Cには関連するDLLへのリンク用の正しいライブラリが付属しています。 – Tommy

関連する問題