1. 先给定三角形的三个顶点坐标:

Vec2i是一个自定义类型,是int型二维向量的意思,由头文件geometry.h给出。

如果没印象可以查看向VS工程导入3个文件[202302131847]

Vec2i p0, // 顶点1
Vec2i p1, // 顶点2
Vec2i p2  // 顶点3

Untitled

  1. 接着按照y值的大小给三个顶点排序,将y值最大的点标记为P0,最小的标记为P2,中间的标记为P1

Untitled

将排序步骤翻译成代码:

// 保证p0是最高的点
if (p1.y > p0.y) swap(p1, p0);
if (p2.y > p0.y) swap(p2, p0);
// 保证p1在中间
if (p2.y > p1.y) swap(p2, p1);

为了接下来的叙述更加直观,将三点连接成三角形:

Untitled

计算出三角形三条边的直线方程,也就是直线P0P1,直线P1P2和直线P0P2。

这里以P1P2为例:

1.设直线P1P2: y = kx + b

2.代入两点的坐标 P1(x1,y1),P2(x2,y2),得
y1 = kx1 + b             (a)
y2 = kx2 + b             (b)

3.用方程(a)-(b),得到:
kx1 - kx2 = y1 - y2
k(x1-x2)  = y1-y2
**k         = (y1-y2)/(x1-x2)**

4.将k的表达式代入(a)方程,得到b的表达式:
**b = y1 - k * x1**

翻译成代码:

// 声明直线方程的两个变量k,b。
float k_p1p2, b_p1p2;
// 求直线P1P2方程式
k_p1p2 = 1.0 * (p1.y - p2.y) / (p1.x - p2.x);// float型表达式的计算需要乘以1.0
b_p1p2 = p1.y - k_p1p2 * p1.x;

其他两个直线方程同理:

// 求直线P0P2方程式
k_p0p2 = 1.0 * (p0.y - p2.y) / (p0.x - p2.x);
b_p0p2 = p2.y - k_p0p2 * p2.x;

// 求直线P0P1方程式
k_p0p1 = 1.0 * (p0.y - p1.y) / (p0.x - p1.x);
b_p0p1 = p0.y - k_p0p1 * p0.x;

现在以中间点P1作一条水平线,将三角形分割成两个三角形。