簡體   English   中英

計算幾何點集算法

[英]Computational Geometry set of points algorithm

我必須針對以下問題設計運行時間為O(nlogn)的算法:

給定一組n個點的P,確定一個值A> 0,以使剪切變換(x,y)->(x + Ay,y)不會更改x坐標不相等的點的順序(沿x方向) 。

即使弄清楚從哪里開始,我也有很多困難。

任何幫助,將不勝感激!

謝謝!

我認為y = 0。

When x = 0, A > 0
(x,y) -> (x+Ay,y)
      -> (0+(A*0),0) = (0,0)
When x = 1, A > 0
(x,y) -> (x+Ay,y)
      -> (1+(A*0),0) = (1,0)

x坐標不相等(2,0),(3,0),(4,0)...因此,我認為起點可能是(0,0),x = 0。

假設所有x,y坐標均為正數。 (在不失一般性的情況下,可以添加偏移量。)在時間O(n log n)中,對點列表L進行排序,主要是按x坐標升序排列,其次按y坐標升序排列。 在時間O(n)中,過程點對(按L順序)如下。 令p,q為L中的任意兩個連續點,令px,qx,py,qy表示它們的x和y坐標值。 從那里開始,您只需要考慮幾種情況,顯然應該怎么做:如果px = qx,則什么也不做。 否則,如果py <= qy,則什么也不做。 其他(px> qx,py> qy)要求px + A * py <qx + A * qy, (px-qx)/(py-qy)> A.

因此:依次遍歷L,找到px> qx和py> qy的所有點對都滿足的最大A'。 然后選擇一個比A'小一點的A值,例如A'/ 2。 (或者,如果問題的目的是找到最大的A,則只需報告A'值。)

好的,這是一種方法的粗略嘗試。

按x順序對點列表進行排序。 (這給出了O(nlogn)-以下所有步驟都是O(n)。)

生成一個新列表dx_i = x_(i + 1)-x_i,即x坐標之間的差。 當x_i被排序時,所有這些dx_i> = 0。

現在,對於某些A,變換后的dx_i(A)將為x_(i + 1)-x_i + A *(y_(i + 1)-y_i)。 如果為負數或零(x_(i + 1)(A)<x_i(A),則將有順序更改。

因此,對於每個dx_i,找到使dx_i(A)為零的A值,即A_i =-(x_(i + 1)-x_i)/(y_(i + 1)-y_i)。 現在,您有了一個系數列表,這些系數將“引起”連續(按x順序)的成對點之間的順序交換。 注意除以零,但是在兩個點具有相同的y的情況下,這些點將不會更改順序。 一些A_i將為負數,如果您希望A> 0,則將其丟棄。 (負A_i也會引發訂單交換,因此A> 0的要求有點隨意。)

在列表中找到最小的A_i> 0。 因此,任何0 <A <A_i(min)的A都是不會改變點順序的剪切。 選擇A_i(min),因為這將使兩個點指向相同的x,但不會彼此重疊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM