2. 實現
3. 參考
這個問題其實涉及到osg中的兩個問題:多邊形分格化和幾何圖元遍歷。
在opengl/osg中,由於效率的原因,預設是直接顯示的簡單的凸多邊形。如果直接強行顯示凹多邊形,渲染結果是不確定的。所以對於複雜的凹多邊形,需要將其分解成簡單的凸多邊形,這個過程就是多邊形分格化。在osg中是通過osgutil::tessellator類來實現多邊形分格化的。
對於二維的凹多邊形,可以有辦法計算其面積。但是對於三維空間的凹多邊形,計算其面積卻很困難。這是因為三維空間凹多邊形甚至都有可能不是共面的。而我們知道,任何複雜的圖形都是通過分解成三角形進行繪製的,只要獲取分解成的三角形,計算其面積並相加(空間三角形的面積計算比較簡單),就可以得到凹多邊形的總面積。
在osg中提供了乙個用來訪問圖元的類:osg::primitivefunctor,其繼承類osg::********functor可以獲取其三角面圖元。幾何體類osg::geometry提供了遍歷幾何圖元的訪問器介面。
其具體實現如下。注意在查詢多邊形分格化的資料的時候,提到了環繞數和環繞規則的概念。在osg裡面也有相應的引數設定。可惜這一段沒有看明白,只能根據仿照例子來設定了。
#include #include #include #include #include #include using namespace std;
using namespace osg;
osg::ref_ptrredpolygon;
//計算空間三角形的面積
double cal********area(const osg::vec3& a, const osg::vec3& b, const osg::vec3& c)
//三角麵片訪問器
struct ********areafunctor
~********areafunctor() }
void operator() (const osg::vec3& v1, const osg::vec3& v2, const osg::vec3& v3) const
double getsumarea()
protected:
double *sumarea = nullptr;
};//
ref_ptrcreatepolygon()
, ,
, ,
, }; //
ref_ptrgeode = new geode();
redpolygon = new osg::geometry;
//osg::ref_ptrredvex = new osg::vec3array;
redpolygon->setvertexarray(redvex);
for (int i = 0; i< 6; i++)
redpolygon->addprimitiveset(new osg::drawarrays(osg::primitiveset::polygon, 0, 6));
//設定顏色陣列
osg::ref_ptrredcolors = new osg::vec4array;
redcolors->push_back(osg::vec4(1.0, 0.0, 0.0, 0.5));
redpolygon->setcolorarray(redcolors);
redcolors->setbinding(osg::array::bind_per_primitive_set);
//如果需要透明,則加入這個
redpolygon->getorcreatestateset()->setmode(gl_blend, osg::stateattribute::on);
redpolygon->getorcreatestateset()->setrenderinghint(osg::stateset::transparent_bin);
//建立分格化物件(支援凹多邊形)
osg::ref_ptrtscx = new osgutil::tessellator;
//設定分格型別為幾何體
tscx->settessellationtype(osgutil::tessellator::tess_type_geometry);
//設定只顯示輪廓線為false。設定環繞規則,這裡不太懂
tscx->setwindingtype(osgutil::tessellator::tess_winding_odd);
//使用分格化
tscx->retessellatepolygons(*(redpolygon.get()));
geode->adddrawable(redpolygon);
return geode;
}int main()
渲染結果如下:
osg學習筆記(三)之如何將非三角面轉換為三角面
osg幾何體的圖元的遍歷
osg計算並繪製模型中每乙個三角麵片的法向量
osg(openscenegraph)基礎學習9:osg多邊形分格化
canvas繪製多邊形並填充
let canvas document.getelementbyid canvas canvas.width 800 畫布寬度 canvas.height 800 畫布高度 let context canvas.getcontext 2d canvasmonth context,100,100,40...
求任意多邊形面積(凹多邊形和凸多邊形)
遇到問題 已知多邊形的各個左邊點,要求多邊形的面積 然後我搜尋了下看到這篇文章 這個人說的不多,但是簡單明瞭 首先已知各定點的座標分別為 x1,y1 x2,y2 x3,y3 xn,yn 則該多邊形的面積公式為 s 1 2 x1 y2 x2 y1 x2 y3 x3 y2 xk yk 1 xk 1 yk...
直線切割凹多邊形
一,演算法原理 以上圖為例,直線 start,end 切割凹多邊形abcdefghijklmnop。記切割線divline start,end 多邊形頂點序列vertexlist a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p 邊序列edgelist ab,bc,cd,de,ef,f...