您的位置:首页 > 运维架构

光栅渲染器(四)多边形绘制

2017-10-29 14:30 344 查看
暂时找不到合适绘制多边形的算法,就自己丰衣足食,不当之处希望大家指出。

绘制凸四边形

首先绘制凸四边形,毕竟这个渲染器我最低的要求就是能画个正方体

算法设计:多边形是由多个三角形组合而成。希望通过输入四个顶点绘制多边形,但不能随意指定顶点绘制多边形,否则就是这样



所以我们需要找到不相邻的2个点,通过这2个点,分别跟另外2个点完成2个三角形的绘制,这样就构成了一个多边形



算法实现如下

通过顶点之间的距离确定不相邻的2个顶点

void Drawquadrilateral(point_t v1, point_t v2, point_t v3, point_t v4, color_t c)//绘制凸四边形
{

float maxdis =max(max( vector_distance(v1, v2), vector_distance(v1, v3)), vector_distance(v1, v4));
if (maxdis == vector_distance(v1, v2))
{
DrawTriangle(v1, v4, v3, c);
DrawTriangle(v2, v4, v3, c);
}
else if(maxdis == vector_distance(v1, v3))
{
DrawTriangle(v1, v4, v2, c);
DrawTriangle(v3, v4, v2, c);
}
else
{
DrawTriangle(v1, v3, v2, c);
DrawTriangle(v4, v3, v2, c);
}

}




但这样绘制其他多边形就很不难,不可能为每一种多边形设计算法,所以有了接下来的算法

绘制任意多边形



算法设计:由上图可以发现任何一个多边形都可以以三角形组成,只要按顺序给定关于顶点的数据,我们就可以轻松绘制多边形

首先是给定按顺序的顶点数据

vector<float> vertices = {
10,10,
10,410,
100,410,
150,150,
100,10
};


接下来是判断顶点的数据是否可以完成多边形

int size = vertices.size();
if (size % 2 != 0||size<6) return;//目前只是2d


接下来就是绘制多边形

void DrawPolygon(vector<float> vertices, color_t c)//按顺序输入复杂多边形顶点,绘制多边形
{
int size = vertices.size(); if (size % 2 != 0||size<6) return;//目前只是2d
point_t v1, v2, v3;
v1.x = vertices[0];
v1.y = vertices[1];

size = size / 2;
for (int i = 1; i <= size-2; i++)
{
v2.x = vertices[i*2];
v2.y = vertices[i*2+1];
v3.x = vertices[i*2+2];
v3.y = vertices[i*2+3];
DrawTriangle(v1, v2, v3, c);
}
}


成功了

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息