2016-09-29 5 views
0

これは、OpenGLを使用して線を描画する必要がありますが、GL_POINTSを使用する必要があります。OpenGL:GL_POINTSのみを使用して線を描画する

Iは、水平線とP1(-1、-1)にP2(1、-1)それをテストしています。

void line2(double x1, double y1, double x2, double y2, double precision, int r, int g, int b){ 


double m = 0.0;    // slope 
double c = (y1 - m*x1);  // constant 
double j = y1;    // starting y value 

// check division by 0 
if (x2-x1 == 0) 
    m = 0; 
else 
    m = (y2-y1)/(x2-x1); 

glColor3f(r,g,b); 

glBegin(GL_POINTS); 
    for (double i = x1; i < x2; i+=precision){ 
     j = m*i + c;  // result of y from line function 
     glVertex2f(i,j); 
    } 
glEnd(); 

}

でそれを呼び出す:

line2(-1,-1,1,-1,0.000001, 102, 102, 255); 

は私に水平の破線を与える

My機能は、ライン関数y = MX + Cを使用しています。それは連続していません。精度を増やすと、メモリが原因でプログラムがハングする可能性があります。

更新:私が気づいたのは、複数の行をレンダリングすることです。最初の行が点滅します。だから、私がline()を何度も呼び出すと、パラメータに関わらず、1行目は常に点滅し、他は完璧です。

行を表示するには、より良い方法(数式またはループ)がありますか?

ありがとうございました!

+0

は、複数の描画呼び出しを使用してみてください(ただし、小さな例えば<40をそれらを保ちます)。頂点の作成を分割(頂点の数/ 40)し、問題ごとに描画コールを発行します。あなたは主に頂点バッファとシェーダを経由してこれを行うのOpenGL 3.3+で あなたはfollingを行うことができるかもしれない: 1.追加の頂点を追加するために頂点バッファを経由して 2.コールジオメトリシェーダをあなたのスタートとエンドポイントを提出してください。精度を一定の変数(CPUからGPUにメモリをプッシュするために使用)として渡します。 3.レンダリング: – somnium

+0

最初に値のベクトルを作成してから頂点属性として渡す – Charlie

+0

jの増分も一定であるため、毎回 'j'を計算することを避けることもできます: ' double jInc = m * precision' ループを以下のように変更してください: 'for(double i = x1、j = y1; i JMA

答えて

1
double m = 0.0;    // slope 
double c = (y1 - m*x1);  // constant 
double j = y1;    // starting y value 

// check division by 0 
if (x2-x1 == 0) 
    m = 0; 
else 
    m = (y2-y1)/(x2-x1); 

あなたはm==0cを計算しているので、cは常にjに等しいです。 mを計算した後に、cの計算を行に移動してみてください。

x2-x1 == 0の場合は、傾きは正または負の無限大でなく0でなければなりません。infは使いにくいので、縦線を描画するために特殊なケースが必要な場合があります。他の方法は、画素からの線を描画するために、あなたはブレゼンハム線と間違って行くことができないとして

https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm

+0

あまりに早くcを計算する。私たちは、Bresenhamが直線/垂直線を描くのに効率的でないことを学びました。したがって、普通の古い行関数でそれをしようとしています。 私が今気づいたのは、私が2行を描くと、最初のものが点在しているということです!だから、私がline()を何度も呼び出すと、パラメータに関わらず、1行目は常に点滅し、他は完璧です。 – OverAir