对4点图像变换施加限制

时间:2010-12-30 19:50:23

标签: c# image-manipulation transform managed-directx

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

到目前为止,我已经将图像转换部分工作了。但是,我很难对它施加限制,以便...

  1. 顶点不会相互交叉。换句话说,我不允许用户创建沙漏形状。它必须始终是四边形。
  2. 同样,每个角之间的角度必须大于0.否则,顶点将以一条线结束。
  3. 此图片的尺寸最小。也就是说,每个角落必须彼此相隔一定距离,以及它们相对的线。
  4. 用户无法将图像“翻转”到背面。 4个角(p1,p2,p3和p4)必须按顺时针顺序出现。
  5. 凹面风筝形状和三角形有效。
  6. 我想知道是否有关于这些问题的公式或论文。我目前有一些公式,用于查找2个线段是否相交(以及在哪里),以及找到一条线到另一个点的最近点。我的大多数实现都不像我喜欢的那样是用户友好的,因为当施加限制时,角落会跳到各处。

    P.S。我正在使用C#进行此项目,使用DirectX。但是,该应用程序仅为2D。

2 个答案:

答案 0 :(得分:2)

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

当程序员对表单输入字段施加限制时,或多或少就像开始日期必须在结束日期之前,并且不允许您在结束字段中的日期之后的开始字段中键入日期...强制用户首先选项卡结束字段,然后输入结束日期,然后选项卡返回到开始字段以输入正确的开始日期。

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

诱捕用户鼠标移动很少是明智之举。如果你不能应用用户所要求的只是使这个明显而不是约束运动...可能是用户正在移动第一个顶点并希望稍后将另一个顶点移动到一个位置,使你的变换有效(完全像两个日期字段示例)。

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

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

明确地计算所有滑动可能性将是一个变得正确的噩梦,并且如果你需要在变换算法中改变某些东西(并且因此在有效和不可用的东西中),那么也需要维护。

答案 1 :(得分:0)

当您开始时,每次用户移动手柄时,确定其他手柄无法通过的水平和垂直线组,并在拖动过程中强制执行这些边界。这将解决您的第一个问题。

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