在网上找了好多好像没有看到有些圆角矩形的,只看到一个绘制圆形矩形(类似学习操场的跑道);根据那个写了一个求圆角矩形的函数
void arrayVac(double v[90][2],double x=0,double y=0)//v 顶点数组、x,y 鼠标点击位置
{
double r=0.5;//圆角半径
double angle0=0.f; //圆角度 右上
double angle1=osg::PI/2; //圆角度 左上
double angle2=osg::PI; //圆角度 左下
double angle3=3*osg::PI/2; //圆角度 右下
for (int i=0;i<90;i++)
{
//矩形部分
switch (i)
{
case 2://0
v[i][0]=0.5+x;
v[i][1]=-0.6+y;
break;
case 1://1
v[i][0]=0+x;
v[i][1]=0+y;
break;
case 0://2
v[i][0]=1.5+x;
v[i][1]=-0.6+y;
break;
case 89://3
v[i][0]=2.5+x;
v[i][1]=-0.6+y;
break;
case 67://24
v[i][0]=3+x;
v[i][1]=-1.1+y;
break;
case 66://25
v[i][0]=3+x;
v[i][1]=-2.1+y;
break;
case 45://46
v[i][0]=2.5+x;
v[i][1]=-2.6+y;
break;
case 44://47
v[i][0]=0.5+x;
v[i][1]=-2.6+y;
break;
case 23://68
v[i][0]=0+x;
v[i][1]=-2.1+y;
break;
case 22://69
v[i][0]=0+x;
v[i][1]=-1.1+y;
break;
}
//右上
if (i>67&&i<89)
{//(2.5,-1.1)
v[i][0]=r*cosf(angle0)+2.5+x; //circle1[i][0] = radius * cosf(angle);
v[i][1]=r*sinf(angle0)-1.1+y; //circle1[i][1] = radius * sinf(angle);
angle0+= 2.0*osg::PI/80; //angle += 2.0*osg::PI / 35.0;
}
//左上
if (i>2&&i<22)
{//(0.5,-1.1)
v[i][0]=r*cosf(angle1)+0.5+x;
v[i][1]=r*sinf(angle1)-1.1+y;
angle1+= 2.0*osg::PI/80;
}
//左下
if (i>23&&i<44)
{//(0.5,-2.1)
v[i][0]=r*cosf(angle2)+0.5+x;
v[i][1]=r*sinf(angle2)-2.1+y;
angle2+= 2.0*osg::PI/80;
}
//右下
if (i>45&&i<66)
{//(2.5,-2.1)
v[i][0]=r*cosf(angle3)+2.5+x;
v[i][1]=r*sinf(angle3)-2.1+y;
angle3+= 2.0*osg::PI/80;
}
//std::cout<<angle*180/3.14<<std::endl;
//计算纹理坐标
coord[i][0]=(vertex[i][0]-x)/(3.0);
coord[i][1]=(vertex[i][1]-y)/(-2.6);
}
}
其中圆角部分我都是按照四分之一的扇形绘制的,之前由于绘制没注意顺序一直绘制不出来,后来发现要逆时针绘制,并且还要计算好点号;特别是矩形部分点号与扇形区域点号
每个扇形我分成20分,一个圆就是80份,所以在求angle的时候除以80,其实没必要分成angle0、1、2、3,不过我是刚开始实验,后面加减的x、y是希望以后添加鼠标点击位置显示。
调用函数计算几何坐标以及纹理坐标:
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();//多边形绘制
osg::ref_ptr<osg::Texture2D>tex=new osg::Texture2D();//纹理
osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array();//顶点
osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array();//法线
osg::ref_ptr<osg::Geode> geode = new osg::Geode(); //组节点
//圆角矩形顶点坐标
arrayVac(vertex);
for (int i=0;i<90;i++)
{
v->push_back(osg::Vec3(vertex[i][0],vertex[i][1],0.0));
}
//设置纹理坐标
osg::ref_ptr<osg::Vec2Array>coord1 = new osg::Vec2Array;
//圆角矩形纹理坐标
for (int i=0;i<90;i++)
{
coord1->push_back(osg::Vec2(coord[i][0],coord[i][1]));
}
将坐标添加到geom(Geometry)就OK啦。