2014-10-29 32 views
0

我正在製作餅圖程序,並使用「gluPartialDisks」創建餅圖片段。但是,我還想檢查一個點是否位於其中一個磁盤的區域內(問題點是我的鼠標光標)。我知道如何找到鼠標光標的位置,但是如何檢查它是否在磁盤區域內?檢查一個點是否在「gluPartialDisk」(OpenGL和C++)中

的代碼快速片段:

glTranslatef(-0.3, 0, 0); 

gluPartialDisk(gluNewQuadric(), 0, 0.65, 10, 1, 
       ((2 * 3.141592654 * 0.65) * (/*Specific angle*/) - (/*Specific angle*/ * 5), 
       /*Different angle*/ * 360); 

回答

1

只要你的部分磁盤平行於屏幕,並用平行投影渲染,最簡單的方法就是在不涉及OpenGL的情況下進行數學運算。

說你是繪畫的部分磁盤中:

glTranslatef(xPos, yPos, 0.0f); 
gluPartialDisk(quadric, innerRad, outerRad, slices, loops, startAng, sweepAng); 

現在,如果你想測試點(x0, y0),你減去平移矢量,然後計算出極座標:

x0 -= xPos; 
y0 -= yPos; 
float dist = sqrt(xPos * xPos + yPos * yPos); 
float ang = atan2(yPos, xPos); 

要在部分磁盤內部,到中心的距離必須在半徑範圍內:

if (dist < innerRad || dist > outerRad) { 
    // it's outside! 
} 

角度稍微複雜一點,因爲它環繞。而且,atan2()結果爲以弧度爲單位測得的在一個範圍[-PI,PI],而參數gluPartialDisk()是在度x軸逆時針,和從Y軸順時針測量。具有範圍startAngsweepAng [0.0,360.0]度時,間隔測試邏輯可能看起來像這樣(未測試):

ang *= 180.0f/PI; // convert to degrees 
ang = 90.0f - ang; // make clockwise, relative to y-axis 
if (ang < 0.0f) { 
    ang += 360.0f; // wrap into range [0.0, 360.0] 
} 
ang -= startAng; // make relative to startAng 
if (ang < 0.0f) { 
    ang += 360.0f; // ... and back into range [0.0, 360.0] 
} 
if (ang > sweepAng) { 
    // it's outside! 
} else { 
    // it's inside! 
} 
1

的OpenGL是不會爲你做這個,很遺憾。

您可以爲磁盤計算邊界區域,然後執行點邊界區域相交測試(對於這樣的形狀會很複雜),也可以實施顏色拾取。

由於這是一個製圖程序,它可能是非常有用的去與latter approach。想法是爲場景中的每個對象分配一個唯一的顏色代碼,繪製場景,然後在光標位置讀回顏色。這種方法像素完美,對於大多數應用來說太慢,但對於簡單的製圖程序來說,它是完美的。

相關問題