[英]algorithm to determine a rectangle from coordinates
我有用戶輸入,包含一個繪制的矩形(自由泳)。 現在這個繪制的圖形並不完美,所以我想基於算法重繪它們的形狀。
我有一堆來自用戶繪圖的坐標。 我想找到最大的(x,y)和最低(x,y)坐標,並使用它們之間的距離來確定矩形的對角線。
但是我很難確定最大(x,y)坐標和最低(x,y)坐標。
我不能用最大的x取最大的y,或者用最大的y取最大的x,例如因為用戶可能只是在他們的行中突然出現了。 (那有意義嗎?)
假設下面是用戶繪制的線..如果我使用最大的y和最大的x,我將沒有所需的坐標(因為它會在意外突出中找到坐標)
----
/ \
----/ \-------- ----- --
--------------/ \---------------/ \------/ \--
希望你能理解我的目標......
我想另一種方法是我希望坐標最接近(0,0),如果我的畫布是1000 x 1000,我希望第二個坐標最接近(1000,1000)。 (兩個極端坐標)
任何人都可以幫助這個算法嗎?
提前致謝!
根據您希望算法生成的矩形適合用戶輸入的程度,您可以嘗試以下操作:
現在,這將為您提供一個包含所有用戶給定點的邊界框。 如果您正在尋找更多最佳擬合類型算法,請使用平均功能替換第二步中的(max - min)/ 2函數。 一個簡單的方法可能只涉及平均點到中心點的一側(上/下或左/右),並使用這些點作為中心偏移。 請注意,這將為您提供四個偏移,其中只有兩個將在任何給定時間使用。
這里提出的粗略想法可以根據您期望的用戶輸入類型進行調整(例如,您期望的扭曲程度如何)。 使用線性回歸線可以進一步改進,假設您能夠通過點本身或用戶輸入方法區分邊(例如,使用離散動作繪制矩形的每一邊而不是一次性繪制)。
希望這個簡單的例子能指出你正確的方向。
如果你想找到最接近(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;
}
您可以輕松修改算法以找到最接近屏幕邊緣其余部分的點。
只需對所有點做一個平均值並將其用作矩形邊的位置..當然這假設您能夠區分矩形的四邊,否則您可以嘗試將坐標分成4邊(通過檢查水平和垂直變化與一些閾值),然后計算每一側的平均值,並將其調整為鏈接邊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.