如何高效率判断线段穿过了哪些格子?

超级大笨狼 2012-02-21 01:55:17
一个表格大小是W*H,格子是单位大小.

我随机选择两个格子,连一条线段

如何高效率判断线段穿过了哪些格子?
...全文
541 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnmhx 2012-02-23
  • 打赏
  • 举报
回复
对于而为问题,定义一个邻域2维搜索引擎。
沿着直线或者曲线的前进方向,以连续的方式搜索,并标识格子。
超级大笨狼 2012-02-21
  • 打赏
  • 举报
回复
感谢dizuo
超级大笨狼 2012-02-21
  • 打赏
  • 举报
回复

private int CheckLine(Point A, Point B, HashSet<int> Map)
{
int x1 = A.X; int y1 = A.Y; int x2 = B.X; int y2 = B.Y; int re = 0;
float increx = 0; float increy = 0; float x = 0; float y = 0;
int steps = 0; int i = 0;

if (Math.Abs(x2 - x1) > Math.Abs(y2 - y1))
{
steps = Math.Abs(x2 - x1);
}
else
{
steps = Math.Abs(y2 - y1);
}

increx = (float)(x2 - x1) / steps;
increy = (float)(y2 - y1) / steps;
x = x1;
y = y1;

for (i = 1; i <= steps; i++)
{
//putpixel(x,y,color); //在(x,y)处,以color色画点
if (!CheckMap(Map, (int)x, (int)y))
{ re++; }
x += increx;
y += increy;
}
return re;
}

ryfdizuo 2012-02-21
  • 打赏
  • 举报
回复
和计算机图形学中的画图直线的思路类似吧,DDA算法蛮经典的。
屏幕由像素网格组成,如何在屏幕上绘制一条直线。
超级大笨狼 2012-02-21
  • 打赏
  • 举报
回复
大概写了一个,利用微分的思想.


private int CheckLine( Point A, Point B)
{
int re = 0;
int Dx = Math.Abs(B.X - A.X);
int Dy = Math.Abs(B.Y - A.Y);
while (Dx >= 0)
{
int YY = 0;
int x = A.X + Dx * Math.Sign(B.X - A.X);
while (Dy >= 0)
{
int y = A.Y + Dx * Math.Sign(B.Y - A.Y);
//输出结果
Console.writeLine("格子"+x+","+y+"命中");

bool IsFinish =false;
if (A.X != B.X)
{
IsFinish = Math.Abs((double)YY) > Math.Abs((double)(A.Y - B.Y) / (double)(A.X - B.X));
if (IsFinish)
{
break;
}
}
YY++;
Dy--;
}
Dx --;
}
return re;
}
超级大笨狼 2012-02-21
  • 打赏
  • 举报
回复
线段是连接格子的中心点.

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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