2

我正在为应用程序进行 4 点图像转换。用户可以拖动每个角来创建一个有效的四边形,或者使用它的“边界框”来垂直、水平和按比例调整它的大小。

到目前为止,我的图像转换部分正在工作。但是,我很难对其施加限制,以便...

  1. 顶点不会相互交叉。换句话说,我不允许用户创建沙漏形状。它必须始终是四边形。
  2. 同样,每个角之间的角度必须大于 0。否则,顶点将排成一条直线。
  3. 它在此图像上具有最小尺寸。也就是说,每个角必须彼此相距一定距离,以及它们的相对线。
  4. 用户不能将图像“翻转”到其背面。4 个角(p1、p2、p3 和 p4)必须按顺时针顺序出现。
  5. 凹形风筝形状和三角形是有效的。

我想知道是否有关于这些问题的公式或论文。我目前确实有用于查找 2 条线段是否相交(以及在何处相交)以及查找一条线上与另一点最近的点的公式。我的大多数实现都不像我喜欢的那样对用户友好,因为在施加限制时角落会到处乱跳。

PS我在这个项目中使用C#,带有DirectX。但是,该应用程序仅是 2D 的。

4

2 回答 2

2

我的建议是不要施加限制,而只是画一个红色的线框多边形,如果对你来说这是不可接受的。

这或多或少像程序员对表单输入字段施加限制,例如开始日期必须在结束日期之前,并且不允许您在开始字段中输入结束字段中日期之后的日期......强制用户先跳格到结束字段,然后输入结束日期,然后跳回开始字段以输入正确的开始日期。

仅以红色显示字段更有用......实际上需要更少的编码。

捕获用户鼠标移动很少是一个明智的想法。如果您不能应用用户要求的内容,请使其明显而不是限制移动......可能是用户正在移动第一个顶点并希望稍后将另一个顶点移动到使您的变换有效的位置(完全像两个日期字段示例)。

如果您真的认为您必须始终防止无效位置(例如,即使您的变换允许翻转操作没有问题,也会禁止用户翻转图像)那么我想到的最简单的解决方案就是有一个isValid()功能,如果关键点无效,则不将其移动到新位置。

在无效状态空间区域周围“滑动”的代码是 IMO 很难很好地处理,也因为无效区域将非常接近“几乎无效”区域。即使“滑动”是一项要求,我也可能会isValid()通过在关键点位置周围进行局部搜索来实现隐式方法,以找到最接近用户要求的点的有效点。

如果您需要更改转换算法中的某些内容(以及因此更改有效和无效),显式计算所有滑动可能性将是一场噩梦。

于 2010-12-30T20:05:43.427 回答
0

当您开始时,并且每次用户移动一个手柄时,确定其他手柄不能通过的水平和垂直线的集合,并在拖动期间强制执行这些边界。这将解决您的第一个问题。

第二,当鼠标在拖动过程中移动时,计算光标与其他 3 个手柄之间的距离;如果它小于您定义的最小距离,则围绕其他手柄沿圆形路径移动手柄。

于 2010-12-30T20:17:15.947 回答