C++ 实现扫描线算法 根据3个以上点计算连线上的点

文章详细描述了C++函数CAreaRegion中两个方法,drawAreaOutline用于根据给定的边界信息绘制区域轮廓,fillAreaRegion则填充边界内的地图数据。通过实例展示了如何使用这两个函数处理特定点数据并生成最终图形。

void CAreaRegion::drawAreaOutline(const AreaDesc area)
{
	INT_PTR i, j, dist, nCount, ax, ay;
	double px, py, dx, dy;
	INT_PTR nX, nY, nMapWidth, nMapHeight;
	PBYTE pData;
	POINT pts[2];

	nMapWidth = m_nMapWdith;
	nMapHeight = m_nMapHeight;
	pData = area.lpMapData;

	nCount = area.nPointCount;
	if (*PINT64(area.lpPoints) == *PINT64(&area.lpPoints[nCount-1]))
		nCount--;
	pts[1] = area.lpPoints[0];

	for (i=1; i<=nCount; ++i)
	{
		pts[0] = pts[1];
		if (i == nCount)
			pts[1] = area.lpPoints[0];
		else pts[1] = area.lpPoints[i];

		dx = (int)pts[1].x - (int)pts[0].x;
		dy = (int)pts[1].y - (int)pts[0].y;
		ax = abs((int)dx);
		ay = abs((int)dy);
		dist = __max(ax, ay);
		px = dx / dist;
		py = dy / dist;

		dx = pts[0].x;
		dy = pts[0].y;
		for (j=dist-1; j>=0;--j)
		{
			nX = (int)(dx + 0.5);
			if (nX < 0) 
				nX = 0;
			else if (nX >= nMapWidth) 
				nX = nMapWidth - 1;

			nY = (int)(dy + 0.5);
			if (nY < 0) 
				nY = 0;
			else
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值