我有一个由绘制的矩形(freestyle)组成的用户输入。现在这个绘制的图形并不完美,所以我想根据一个算法为它们重新绘制形状。
我有一堆来自用户绘图的坐标。我想找出最大的(x,y)和最低的(x,y)坐标,并使用它们之间的距离来确定矩形的对角线。
但是我很难确定最大的(x,y)坐标和最低的(x,y)坐标。
我不能拿最大的y和最大的x,或者最大的x和最大的y作为例子,因为可能用户只是在他们的队伍中意外地突出了一下。(这有意义吗?)
假设下面是用户绘制的线条。如果我使用最大的y和最大的x,我就得不到想要的坐标(因为它会在意外突出的地方找到坐标)。
----
/ \
----/ \-------- ----- --
--------------/ \---------------/ \------/ \--
希望你能理解我的意思..
我猜另一种方式是,我希望坐标最接近(0,0),如果我的画布是1000 x 1000,我希望第二个坐标最接近(1000,1000)。(两个极端坐标)
有没有人能帮上忙呢?
提前感谢!
发布于 2010-11-06 20:01:16
如果你想找到离(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;
}
您可以轻松地修改算法,以找到最接近其余屏幕边缘的点。
发布于 2010-11-06 20:28:10
根据您希望算法生成的矩形适合用户输入的程度,您可以尝试以下操作:
现在,这将为您提供一个包围框,其中包含所有用户给定点。如果您正在寻找更多最佳拟合类型的算法,请将步骤2中的(max - min) /2函数替换为平均函数。一个简单的方法可能只涉及将点平均到中心点的一侧(上方/下方或左侧/右侧),并使用这些点作为距中心的偏移量。请注意,这将为您提供四个偏移量,其中只有两个您将在任何给定的时间使用。
这里展示的粗略想法可以根据您期望的用户输入类型(例如,您期望的扭曲程度)进行调整。可以使用线性回归线进行进一步的改进,假设您能够通过点本身或通过用户输入方法(例如,使用离散的动作而不是一次绘制所有矩形的每一条边)。
希望这个快速示例将为您指明正确的方向。
发布于 2010-11-06 19:54:50
只需对所有点进行平均,并将其用作矩形边的位置。当然,这假设你能够区分矩形的四条边,否则你可以尝试一种方法将坐标分成四条边(通过检查水平和垂直变化与某个阈值),然后计算每条边的平均值,并将其调整为连接边。
https://stackoverflow.com/questions/4114889
复制