在平面上对齐形状,算法

时间:2009-11-10 17:50:24

标签: flex algorithm 2d alignment shapes

我正在开发一个简单的图表工具,使用flex在平面图上形状。 首先,我使用的是一个简单的20 * 20网格。

但真正很酷的东西是自动斧头磁铁效果,这就是我称之为至少为什么我的意思是因为我制作了一个balsamiq的小视频。

http://screenr.com/clB

http://www.balsamiq.com/

如您所见,它在垂直水平边框和中心轴上对齐。

  • 边框:灰轴
  • 水平对齐(高度/ 2)中心:蓝色轴
  • 无垂直对齐(宽度/ 2)轴
  • 25px的一些中间填充空间:绿轴

您认为这些算法的工作原理如何: 现在我将不做任何轮换。

在左上角 x,y 选择宽度 w 和高度 h 的形状 S1

查看与两个区域相交的所有形状:

从xmin = x,xmax = x + w,对于y> 0

来自yming = y,ymax = y + h,对于x> 0

一旦我有相关的形状列表,我检查是否有任何条件匹配:

当我使用'='时,它的近似值+或 - 2像素会产生所需的“磁铁”效果

  • S1 x = S'x => x的灰线
  • S1 x + w =​​ S'x => x + w
  • 处的灰线
  • S1 y = S'y => y
  • 处的灰线
  • S1 y + h = S'y => y + h
  • 处的灰线
  • S1 x = S'x S1 x + w =​​ S'x + w =​​> x + w / 2
  • 处的蓝线

并且考虑到20 px

的填充磁铁
  • S1 x = S'x + PADD =>绿线在S1 x
  • S1 x = S'x - PADD =>绿线在S1 x
  • S1 y = S'y + PADD =>绿色线在S1 y
  • S1 y = S'y - PADD =>绿色线在S1 y

您对此有何想法?

1 个答案:

答案 0 :(得分:0)

我写了Balsamiq的捕捉算法。你很亲密。我们做的一个“聪明”的事情(如果我自己可以这么说),就是预先填充两个稀疏数组,并使用捕捉坐标onMouseDown,这样它们就可以轻松/快速/便宜地查找onMouseMove。我在onMouseDown做的是:

让我们谈谈x坐标(然后对y重复同样的事情):

  • 说GRAVITY是5
  • 查看所有形状
  • 对于每个形状,查看左边缘,说它是100.将xSnappingPositions对象从100-GRAVITY(95)填充到100 + GRAVITY(105),数字为100.重复右边缘

然后当你执行onMouseMove时,你会看到你正在拖动x和y的控件。 xSnappingPositions和ySnappingPosition中是否存在与左边缘匹配的东西?如果是这样,转到保存在数组中的值,而不是使用鼠标检测到的位置(即对齐它)。重复检查右边缘,中心等

我希望这有帮助!