三角形填充算法(C实现)

本文详细介绍了图形学中的三角形光栅化过程,特别是通过C语言实现的点在三角形内的判断算法,并探讨了优化策略。学习者将理解如何使用向量运算快速定位并绘制像素,以及如何通过比较三角形边缘的斜率来判断点的位置。
摘要由CSDN通过智能技术生成

算法及优化理论参考文章:

图形学底层探秘 - 更现代的三角形光栅化与插值算法的实现与优化 - 知乎

如何判断一个点在三角形内部_c语言判断点在三角形内_pdcxs007的博客-CSDN博客

代码实现如下:

void FillTriangle(const PointLong v1, const PointLong v2, const PointLong v3, GR_COLOR color)
{
	// 第一步找出XMAX  YMAX  XMIN  YMIN找出最小矩形
	int xMIN, xMAX, yMIN, yMAX;
	xMIN = (v1.x < v2.x ? v1.x : v2.x) < v3.x ? (v1.x < v2.x ? v1.x : v2.x) : v3.x;
	xMAX = (v1.x > v2.x ? v1.x : v2.x) > v3.x ? (v1.x > v2.x ? v1.x : v2.x) : v3.x;
	yMIN = (v1.y < v2.y ? v1.y : v2.y) < v3.y ? (v1.y < v2.y ? v1.y : v2.y) : v3.y;
	yMAX = (v1.y > v2.y ? v1.y : v2.y) > v3.y ? (v1.y > v2.y ? v1.y : v2.y) : v3.y;
	if (yMIN >= SCREEN_HEIGHT)
	{
		return;
	}
	if (yMAX <= 0)
	{
		return;
	}
	if (xMIN >= SCREEN_WIDTH)
	{
		return;
	}
	if (xMAX <= 0)
	{
		return;
	}

	if (yMIN < 0)
	{
		yMIN = 0;
	}
	if (yMAX >= SCREEN_HEIGHT)
	{
		yMAX = SCREEN_HEIGHT - 1;
	}
	if (xMIN < 0)
	{
		xMIN = 0;
	}
	if (xMAX >= SCREEN_WIDTH)
	{
		xMAX = SCREEN_WIDTH - 1;
	}
	float signOfTrig = (v2.x - v1.x) * (v3.y - v1.y) - (v2.y - v1.y) * (v3.x - v1.x);
	float addX1 = (v2.x - v1.x);
	float addY1 = (v2.y - v1.y);
	float addX2 = (v3.x - v2.x);
	float addY2 = (v3.y - v2.y);
	float addX3 = (v1.x - v3.x);
	float addY3 = (v1.y - v3.y);
	float startXAB = addX1 * (yMIN - v1.y) - addY1 * (xMIN - v1.x);
	float startXCA = addX3 * (yMIN - v3.y) - addY3 * (xMIN - v3.x);
	float startXBC = addX2 * (yMIN - v2.y) - addY2 * (xMIN - v2.x);
	for (int i = xMIN; i <= xMAX; ++i)
	{
		bool bStart = false;
		float signOfAB = startXAB;
		float signOfCA = startXCA;
		float signOfBC = startXBC;
		for (int j = yMIN; j < yMAX; j++)
		{
			PointLong p = { i, j };
			bool bInTri = false;

			if (signOfTrig > 0)
			{
				bInTri = (signOfAB >= 0) && (signOfCA >= 0) && (signOfBC >= 0);
			}
			else
			{
				bInTri = (signOfAB <= 0) && (signOfCA <= 0) && (signOfBC <= 0);
			}
			if (bInTri)
			{
				bStart = true;
				MemSetColor(wndbuf + i + j * wndTwidth, color, 1);
			}
			else
			{
				if (bStart)
				{
					break;
				}
			}
			signOfAB += addX1;
			signOfBC += addX2;
			signOfCA += addX3;
		}
		startXAB -= addY1;
		startXBC -= addY2;
		startXCA -= addY3;
	}
}// FillTriangle end
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

imgsq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值