DDA算法画直线问题

ni_zhi 2009-10-15 08:55:23
VC++6.0写的算法
获取的两个点放在m_pOrigin和m_pEnd里,下面是算法,画出来的都是水平或竖直的直线,有时候会为斜线,但相差明显很远
请帮忙看下问题在哪,谢谢

int dx, dy, n;
float k;
CPoint tempPoint;
tempPoint = m_pOrigin;
CClientDC dc(this);
dx = m_pEnd.x - m_pOrigin.x; // 坐标水平增量
dy = m_pEnd.y - m_pOrigin.y; // 坐标竖直增量
k = (float)dy / (float)dx; // 斜率
if (abs(dx) > abs(dy)) // 斜率的绝对值小于1
{
n = abs(dx);
if (m_pOrigin.x < m_pEnd.x) // 画线方向为左下至右上,斜率为正
{
for (int i = 0; i < n; i++)
{
tempPoint.x++;
tempPoint.y = floor(tempPoint.y + k);
dc.SetPixel(tempPoint, 1);
}
}
else // 画线方向为右下至左上,斜率为负
{
for (int i = 0; i < n; i++)
{
tempPoint.x--;
tempPoint.y = floor(tempPoint.y - k);
dc.SetPixel(tempPoint, 1);
}
}
}
else // 斜率绝对值大于或等于1
{
n = abs(dy);
if (m_pOrigin.x < m_pEnd.x) // 画线方向为左下到右上,斜率为正
{
for (int i = 0; i < n; i++)
{
tempPoint.y++;
tempPoint.x = floor(tempPoint.x + 1.0/k);
dc.SetPixel(tempPoint, 1);
}
}
else // 画线方向为右下到左上,斜率为负
{
for (int i = 0; i < n; i++)
{
tempPoint.y--;
tempPoint.x = floor(tempPoint.x - 1.0/k);
dc.SetPixel(tempPoint, 1);
}
}
}
...全文
853 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
whg01 2009-10-16
  • 打赏
  • 举报
回复
tempPoint.x = floor(tempPoint.x + 1.0/k) 改成
tempPoint.x = floor(m_pOrigin.x + i*1.0/k);
当n>=0时,floor(n)返回的是n的整数部分。所以tempPoint.x = floor(tempPoint.x + 1.0/k)并不能使tempPoint.x累加。而且还会有累积误差。
还有其它类似的3个地方,你自己改吧。
ni_zhi 2009-10-16
  • 打赏
  • 举报
回复
...
试过了二楼的方法
ni_zhi 2009-10-16
  • 打赏
  • 举报
回复
晕,引用错了
试过了三楼的方法,还是老样子
ni_zhi 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 rush2 的回复:]
专业帮助格式化代码
C/C++ codeint dx, dy, n;float k;
CPoint tempPoint;
tempPoint= m_pOrigin;
CClientDC dc(this);
dx= m_pEnd.x- m_pOrigin.x;// 坐标水平增量dy= m_pEnd.y- m_pOrigin.y;// 坐标竖直增量k= (float)dy/ (float)dx;// 斜率if (abs(dx)> abs(dy))// 斜率的绝对值小于1{
n= abs(dx);if (m_pOrigin.x< m_pEnd.x)// 画线方向为左下至右上,斜率为正 {for (int i=0; i< n; i++)
{
tempPoint.x++;
tempPoint.y= floor(tempPoint.y+ k);
dc.SetPixel(tempPoint,1);
}
}else// 画线方向为右下至左上,斜率为负 {for (int i=0; i< n; i++)
{
tempPoint.x--;
tempPoint.y= floor(tempPoint.y- k);
dc.SetPixel(tempPoint,1);
}
}
}else// 斜率绝对值大于或等于1{
n= abs(dy);if (m_pOrigin.x< m_pEnd.x)// 画线方向为左下到右上,斜率为正 {for (int i=0; i< n; i++)
{
tempPoint.y++;
tempPoint.x= floor(tempPoint.x+1.0/k);
dc.SetPixel(tempPoint,1);
}
}else// 画线方向为右下到左上,斜率为负 {for (int i=0; i< n; i++)
{
tempPoint.y--;
tempPoint.x= floor(tempPoint.x-1.0/k);
dc.SetPixel(tempPoint,1);
}
}
}
[/Quote]试过了,还是老样子
butwang 2009-10-16
  • 打赏
  • 举报
回复

if (m_pOrigin.x < m_pEnd.x) // 画线方向为左下至右上,斜率为正
{
for (int i = 0; i < n; i++)
{
tempPoint.x++;
tempPoint.y = floor(tempPoint.y + k);
dc.SetPixel(tempPoint, 1);
}
}
改成下面试试
if (m_pOrigin.x < m_pEnd.x) // 画线方向为左下至右上,斜率为正
{
for (int i = 0; i < n; i++)
{
tempPoint.x++;
tempPoint.y += k;不要改变y的精确值
dc.SetPixel(tempPoint.x, tmepPoint.y+0.5f, 1);
}
}

玖伍叁柒 2009-10-15
  • 打赏
  • 举报
回复
专业帮助格式化代码
int dx, dy, n; 
float k;
CPoint tempPoint;
tempPoint = m_pOrigin;
CClientDC dc(this);
dx = m_pEnd.x - m_pOrigin.x; // 坐标水平增量
dy = m_pEnd.y - m_pOrigin.y; // 坐标竖直增量
k = (float)dy / (float)dx; // 斜率
if (abs(dx) > abs(dy)) // 斜率的绝对值小于1
{
n = abs(dx);
if (m_pOrigin.x < m_pEnd.x) // 画线方向为左下至右上,斜率为正
{
for (int i = 0; i < n; i++)
{
tempPoint.x++;
tempPoint.y = floor(tempPoint.y + k);
dc.SetPixel(tempPoint, 1);
}
}
else // 画线方向为右下至左上,斜率为负
{
for (int i = 0; i < n; i++)
{
tempPoint.x--;
tempPoint.y = floor(tempPoint.y - k);
dc.SetPixel(tempPoint, 1);
}
}
}
else // 斜率绝对值大于或等于1
{
n = abs(dy);
if (m_pOrigin.x < m_pEnd.x) // 画线方向为左下到右上,斜率为正
{
for (int i = 0; i < n; i++)
{
tempPoint.y++;
tempPoint.x = floor(tempPoint.x + 1.0/k);
dc.SetPixel(tempPoint, 1);
}
}
else // 画线方向为右下到左上,斜率为负
{
for (int i = 0; i < n; i++)
{
tempPoint.y--;
tempPoint.x = floor(tempPoint.x - 1.0/k);
dc.SetPixel(tempPoint, 1);
}
}
}

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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