已知两点,求画出这条两点直线!

sunyanbiao_12 2016-06-17 12:02:19
int DrawLine(SDL_Renderer *rend,int x, int y, int x1, int y1)
{
..........
}
...全文
301 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2016-06-17
  • 打赏
  • 举报
回复
1 bresenham

//
void CDrawLinesView::Line_Bresenham(POINT p1, POINT p2,CDC *pDC)
{
	int i;
	if(p1.x==p2.x)
	{// Vertical
		if(p1.y<=p2.y)	for(i=p1.y;i<=p2.y;i++) pDC->SetPixel(p1.x,i,m_lPenColor);
		else			for(i=p2.y;i<=p1.y;i++) pDC->SetPixel(p1.x,i,m_lPenColor);
		return;
	}
	if(p1.y==p2.y)
	{// Horizon
		if(p1.x<=p2.x)	for(i=p1.x;i<=p2.x;i++) pDC->SetPixel(i,p1.y,m_lPenColor);
		else			for(i=p2.x;i<=p1.x;i++) pDC->SetPixel(i,p1.y,m_lPenColor);
		return;
	}
// oblique
	float m=(p2.y-p1.y)*1.0/(p2.x-p1.x);
	float p;

	p=2*m-1;
	if(m>0 && m<=1)
	{
		if(p1.x<p2.x)
		{
			while(p1.x<=p2.x)
			{
				pDC->SetPixel(p1.x++,p1.y,m_lPenColor);
				if(p>=0)
				{
					p+=2*m-2;
					p1.y++;
				}
				else
				{
					p+=2*m;
				}
			}
		}
		else
		{
			while(p2.x<=p1.x)
			{
				pDC->SetPixel(p2.x++,p2.y,m_lPenColor);
				if(p>=0)
				{
					p+=2*m-2;
					p2.y++;
				}
				else
				{
					p+=2*m;
				}
			}
		}
		return;
	}
//
	p=-2*m-1;
	if(m<0 && m>=-1)
	{
		if(p1.x<p2.x)
		{
			while(p1.x<=p2.x)
			{
				pDC->SetPixel(p1.x++,p1.y,m_lPenColor);
				if(p>=0)
				{
					p+=-2*m-2;
					p1.y--;
				}
				else
				{
					p+=-2*m;
				}
			}
		}
		else
		{
			while(p2.x<=p1.x)
			{
				pDC->SetPixel(p2.x++,p2.y,m_lPenColor);
				if(p>=0)
				{
					p+=-2*m-2;
					p2.y--;
				}
				else
				{
					p+=-2*m;
				}
			}
		}
		return;
	}
//
	p=2/m-1;
	if(m>1)
	{
		if(p1.y<p2.y)
		{
			while(p1.y<=p2.y)
			{
				pDC->SetPixel(p1.x,p1.y++,m_lPenColor);
				if(p>=0)
				{
					p+=2/m-2;
					p1.x++;
				}
				else
				{
					p+=2/m;
				}
			}
		}
		else
		{
			while(p2.y<=p1.y)
			{
				pDC->SetPixel(p2.x,p2.y++,m_lPenColor);
				if(p>=0)
				{
					p+=2/m-2;
					p2.x++;
				}
				else
				{
					p+=2/m;
				}
			}
		}
		return;
	}
//
	p=-2/m-1;
	if(p1.y<p2.y)
	{
		while(p1.y<=p2.y)
		{
			pDC->SetPixel(p1.x,p1.y++,m_lPenColor);
			if(p>=0)
			{
				p+=-2/m-2;
				p1.x--;
			}
			else
			{
				p+=-2/m;
			}
		}
	}
	else
	{
		while(p2.y<=p1.y)
		{
			pDC->SetPixel(p2.x,p2.y++,m_lPenColor);
			if(p>=0)
			{
				p+=-2/m-2;
				p2.x--;
			}
			else
			{
				p+=-2/m;
			}
		}
	}
}
2.DDA void DDAline(int x1, int y1, int x2, int y2, CDC* pDC) { int wndWidth=480; int wndHeight=640; int steps; steps=abs(x2-x1) >= abs(y2-y1) ? abs(x2-x1):abs(y2-y1);//步数 afxDump << steps << "\n";// 250 float x,y,dx,dy; // start point at middle x=(float)(x1 + wndWidth/2+0.5); y=(float)(y1 + wndHeight/2+0.5);//起点 // dx=((float)x2-(float)x1)/steps; afxDump << dx << " =dx\n"; dy=((float)y2-(float)y1)/steps;//每步增长值 afxDump << dy << " =dy\n"; COLORREF color=RGB(255,0,0); for(int i=0;i<=steps;i++) { pDC->SetPixel((int)x,(int)y,color); x+=dx; y+=dy; }// end for }// end DDALine DDAline(0, 0, 250, 70, &dc);
叶恭介叶恭介 2016-06-17
  • 打赏
  • 举报
回复
SDL_RenderDrawLine(rend, x, y, x1, y1);
usecf 2016-06-17
  • 打赏
  • 举报
回复
HDC hDC=::GetDC(NULL); ::MoveToEx(hDC,0,0,NULL); LineTo(hDC,200,20); ::ReleaseDC(NULL,hDC);
Eleven 2016-06-17
  • 打赏
  • 举报
回复
MoveTo/LineTo()
  • 打赏
  • 举报
回复
HDC hDC=::GetDC(NULL); ::MoveToEx(hDC,0,0,NULL); LineTo(hDC,200,20); ::ReleaseDC(NULL,hDC);
lx624909677 2016-06-17
  • 打赏
  • 举报
回复
dc.MoveTo(x,y); dc.LineTo(x1,y1);
zhouxiaofeng1021 2016-06-17
  • 打赏
  • 举报
回复
MFC中不是有可以换直线的函数吗? 关键是要在onpaint 中刷新时,重绘制

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧