我的用户输入包含一个绘制的矩形(自由泳)。现在这个绘制的图形并不完美,所以我想根据算法重绘它们的形状。
我有一堆来自用户绘图的坐标。我想找到最大的(x,y)和最低的(x,y)坐标,并使用它们之间的距离来确定矩形的对角线。
但我很难确定最大(x,y)坐标和最低(x,y)坐标。
我不能用最大的y取最大的y,或者用最大的y取最大的x,例如因为用户可能只是在他们的行中突然出现了。 (这有意义吗?)
假设下面是用户绘制的线..如果我使用最大的y和最大的x,我将没有所需的坐标(因为它会在意外突出中找到坐标)
----
/ \
----/ \-------- ----- --
--------------/ \---------------/ \------/ \--
希望你明白我的目标......
我想另一种方法是我希望坐标最接近(0,0),如果我的画布是1000 x 1000,我希望第二个坐标最接近(1000,1000)。 (两个极端坐标)
任何人都可以帮助这个算法吗?
提前致谢!
答案 0 :(得分:2)
根据您希望算法生成的矩形适合用户输入的程度,您可以尝试以下操作:
现在,这将为您提供一个包含所有用户给定点的边界框。如果您正在寻找更多最佳拟合类型算法,请使用平均功能替换第二步中的(max - min)/ 2函数。一个简单的方法可能只涉及平均点到中心点的一侧(上/下或左/右),并使用这些点作为中心偏移。请注意,这将为您提供四个偏移,其中只有两个将在任何给定时间使用。
这里提出的粗略想法可以根据您期望的用户输入类型进行调整(例如,您可能会有多么扭曲)。使用线性回归线可以进一步改进,假设您能够通过点本身或通过用户输入方法区分边(例如,使用离散动作绘制矩形的每一边而不是一次性绘制)。
希望这个简单的例子能指出你正确的方向。
答案 1 :(得分:1)
如果你想找到最接近(0,0)的点,那就找吧!
point FindClosestToOrigin(point[] P)
{
point closest = P[0];
foreach(point p in P)
{
if (DistanceOriginS(p) < DistanceOriginS(closest)) closest = p;
}
return closest;
}
float DistanceOriginS(point p)
{
return p.x*p.x + p.y*p.y;
}
您可以轻松修改算法,找到最接近屏幕边缘其余部分的点。
答案 2 :(得分:0)
只需对所有点做一个平均值并将其用作矩形边的位置..当然这假设您能够区分矩形的四边,否则您可以尝试将坐标分割为4边(通过检查水平和垂直变化与某个阈值),然后计算每一侧的平均值,并将其调整为链接边。