共面12點 工字形 排序演算法

2022-07-01 23:57:12 字數 1593 閱讀 3947

最近需要做乙個空間工字形截面點排序的演算法,記下這段過程。

之前做過空間共面四個點的凸包排序,簡單的利用旋轉即可解決,然而工字形並非凸包,旋轉已經無法解決。這裡分析其特徵,採用多種方法結合來處理。

**實現時出現求平行點出錯,原因是三維座標中必須寫滿三個等式才能判斷平行,否則遇到沿座標軸方向極限情形時,判斷就會失敗。其它更多問題花在了演算法優法(如第一點最開始用求中心點,再求最遠點的方式找頂點等)、除錯筆誤上哈哈 (-_-『)。

步驟職下:

一、如果工字形左側和右側的上下端是對齊的。

1、對工字形12個頂點進行代數排序,如此,首尾必是空間上相距最遠的兩點,這兩點是工字形最外圍四點中的兩個對角pl1、pr4。

2、利用垂直關係找出另外兩點pl4、pr1。

3、對四點進行代數排序,取前兩點,則該兩點要麼是左右側線,要麼是上下端線。嘗試找共線的點,如果找到兩個點pl2、pl3,則為側線,否則為端線,對找中間兩點即得到側線。

4、利用平行關係,找出與該側線方向平行的如下點集:左側和右側的四個點組合(pl1、pl2、pl3、pl4)、(pr1、pr2、pr3、pr4),中間兩組兩點組合(plc1、plc2)、(prc1、prc2)。注意演算法的精確性,避免極限情形失效。

5、如果對找到的4組點集進行代數排序,所得即為有序的4組點。其中第一點與四個頂點的第一點相同的,認為是特定側的起點,對中間兩組的第一點取出,進行排序,該序列即為中間兩組的特定順序。

6、最後得到4224的點集,且有序。對應關係如下,此時按順序取出對應點即可:

二、如果工字形兩側不確定是否平行,不確定左右或者上下是否對稱。

1、對12個點進行代數排序,首尾兩點是工字形中最遠的兩點,但可能是上或者下端部矩形的兩個對角(p1、p2)。

2、利用垂直關係,找其它任意兩點能以上述一點作為垂足的一組點(p1,p11,p12)。

3、以其中任一方向(p1,p11)對12個點進行平行方向上共線分組排序,得到四組點集2442(從上至下)、或者4224(從左至右)、或者六組點集222222(從左至右)、或者五組點集22224(從左至右)等。以上情形與工字形特徵有關,唯一確定是: 轉角處的直角關係、以及腰部較細的特徵。

五組的情形:

六組的情形:

4、對每組點進行代數排序。

5、對於只有四組點的情況,只需取出2個點組的第一點,和4個點組的第二點進行排序,然後檢視排序後的點組為2442排序,還是4224式的排序,即可確定這些點組是按從上至下取點(2442),還是從左到右取點(4224)。即得這四組點的空間排序。按方位取出相應點,即得順或逆時針排列的12個點集。

6、如果得到五組或者六組,則可確定工字形側線上下端沒有對齊。單獨處理相當麻煩,此時可以回到第二、3步,取這組垂線的另乙個方向,必定求得四個點組,且排序必為2442的情形。然後求得12點的時針方向排序。

對以上演算法,感覺還是不錯的。

歡迎提出你的想法!

1265 四點共面

給出三維空間上的四個點 點與點的位置均不相同 判斷這4個點是否在同乙個平面內 4點共線也算共面 如果共面,輸出 yes 否則輸出 no 四個點組成3的向量,然後把向量看成行列式,看行列式的結果是否為0,若為0則共面,否則不共面 include include include includeusing...

51Nod 四點共面

1265 四點共面 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出三維空間上的四個點 點與點的位置均不相同 判斷這4個點是否在同乙個平面內 4點共線也算共面 如果共面,輸出 yes 否則輸出 no input 第1行 乙個數t,表示輸入的測試數量 1 t 1000 ...

51nod1265四點共面

原題鏈結 四點共面即以某點指向其它三點的向量的混合積為0 如下 include include include include include include include include include include include include define ll long long us...