當兵暑假可以完成哪些事情呢
,加上專題老師的要求魔術方塊教學軟體,老師看到了新聞說什麼日本教授透過手機拍照解魔術方塊,所以他想要做這個專題,還是硬接下來`,幾乎都是都是python呢,我們來用c#硬上吧xd
20141127 Taipei.py - PyCuber 用Python解魔術方塊
,加上專題老師的要求魔術方塊教學軟體,老師看到了新聞說什麼日本教授透過手機拍照解魔術方塊,所以他想要做這個專題,還是硬接下來`,幾乎都是都是python呢,我們來用c#硬上吧xd
20141127 Taipei.py - PyCuber 用Python解魔術方塊新增
修正一些bug,然後基於8355法去解魔術方塊
2.3實作內容
l 如何根據影像讀入魔術方塊
l
如何自動尋找魔術方塊解法
l 3D畫面呈現與動畫
l 把解法分層解法,並希望剛接觸的人也可以輕易把魔術方塊解出來
l 探討並分析,和其他人解法有何不同
三、原理與分析
3.1 讀魔術方塊顏色到電腦
將手上的魔術方塊狀態輸入到APP以便讓APP可以運算解答並用來教學,而魔術方塊顏色的讀入,可使用Unity直接引用OpenCV或者在Android封裝時順便將OpenCV包進去。但因這部份比較繁瑣,所以本專題採用簡單的圖形偵測方式,首先,把圖片進行邊緣化偵測後會得到一個白色外框矩形,(圖2)左方是取樣魔術方塊如(圖2)右邊的其中一面,圖上9個點是取樣的像素,用來判讀其顏色,就可取得魔術方塊的四個角落,再依比例就可以得到9塊區域的中心點,在對中心點做顏色的取樣,在背景雜訊不多時效果很好。
圖2. 色彩辨識
3.2 選擇魔術方塊解法
這邊解法使用台灣人許技江老師所發明,分為8底、3邊、5邊,而最後的5呢是基於工作區特殊的加一減一依序作左上右下或者下左上右,不管做幾次6次底層一定會回復到原先樣子,有這樣特性就可以來更換最後的五角完成魔術方塊。
3.3 自動尋解與教學
本專題的魔術方塊解答方式,以實作許技江老師所發明的8355法,8355法的特點是不用死背公式而是用理解的方式來解出魔術方塊,初學者可以快速上手,且不易忘記。
3.4自動尋解:
(圖3)為8355法的一些情形。(圖3c)的情況可使用(圖3b)工作區來進行邊塊和角塊的對調,最後的(圖3d)使用加一減一的算法來把最後五角歸位。
接下來就是把魔術方塊上各顏色的位置作轉換,成為比較好處理的二維陣列。一個立方空盒攤開後會有六個面,而魔術方塊為一個六面的立方體,亦可以類似地將其六面數位化。(圖4)為數位化的魔術方塊,其中的0到5數值分別代表六種顏色。
在對紅色一面如(圖5)所示,進行90度左右旋轉的時候,可以知道旋轉紅色面的話則會牽動到灰色區塊一併要進行旋轉,到這邊的時候魔術方塊已經可以用來判斷哪一面哪一點的顏色了。
有了上面這些資訊,在做自動尋解的過程中,就只要先找到目標方塊在哪一面哪一點,然後把依照8355法或者其他解法,將方塊進行90度左右旋轉,把目標方塊轉至定位即可完成自動尋解這功能。
3.5
3D畫面呈現
在畫魔術方塊的時候我們採用Unity內建的3D矩形組合成(圖6)的這麼大的魔術方塊供需要27個3D矩形,所以只要把用先把位置弄出來,我們再依序把27顆3D矩形放入到相對應位置,再配合3.4自動尋解中所提到的二維陣列就可以畫出一顆完整的魔術方塊。
3.6動畫的呈現
如圖6所示
程式碼去呼叫IEnumerator介面函數時,會先去執行裡面的函數,當遇到yield return 0;則暫時返回呼叫它的原先程式。Start()繼續往下做其他事情,Nowplay()則會繼續執行直到沒遇到yield return 0;則結束 IEnumerator ,將用這些函數來做畫面更新及延遲。
方塊旋轉
哪一面共包含哪九塊小方塊,這些在程式中已經配置好,如果我要對第0面進行旋轉,則第0面所牽動的九塊小方塊將會一併跟著旋轉,在旋轉的過程中,會呼叫旋轉函數並計算九個小方塊旋轉的角度,然後利用上面函數StartCoroutine來進行畫面的延遲及更新,將角度慢慢增加或減少,以呈現動畫。
修正一些bug,然後基於8355法去解魔術方塊
2.3實作內容
l 如何根據影像讀入魔術方塊
l
如何自動尋找魔術方塊解法
l 3D畫面呈現與動畫
l 把解法分層解法,並希望剛接觸的人也可以輕易把魔術方塊解出來
l 探討並分析,和其他人解法有何不同
三、原理與分析
3.1 讀魔術方塊顏色到電腦
3.1 讀魔術方塊顏色到電腦
將手上的魔術方塊狀態輸入到APP以便讓APP可以運算解答並用來教學,而魔術方塊顏色的讀入,可使用Unity直接引用OpenCV或者在Android封裝時順便將OpenCV包進去。但因這部份比較繁瑣,所以本專題採用簡單的圖形偵測方式,首先,把圖片進行邊緣化偵測後會得到一個白色外框矩形,(圖2)左方是取樣魔術方塊如(圖2)右邊的其中一面,圖上9個點是取樣的像素,用來判讀其顏色,就可取得魔術方塊的四個角落,再依比例就可以得到9塊區域的中心點,在對中心點做顏色的取樣,在背景雜訊不多時效果很好。
圖2. 色彩辨識
3.2 選擇魔術方塊解法
這邊解法使用台灣人許技江老師所發明,分為8底、3邊、5邊,而最後的5呢是基於工作區特殊的加一減一依序作左上右下或者下左上右,不管做幾次6次底層一定會回復到原先樣子,有這樣特性就可以來更換最後的五角完成魔術方塊。
3.3 自動尋解與教學
本專題的魔術方塊解答方式,以實作許技江老師所發明的8355法,8355法的特點是不用死背公式而是用理解的方式來解出魔術方塊,初學者可以快速上手,且不易忘記。
3.4自動尋解:
(圖3)為8355法的一些情形。(圖3c)的情況可使用(圖3b)工作區來進行邊塊和角塊的對調,最後的(圖3d)使用加一減一的算法來把最後五角歸位。
接下來就是把魔術方塊上各顏色的位置作轉換,成為比較好處理的二維陣列。一個立方空盒攤開後會有六個面,而魔術方塊為一個六面的立方體,亦可以類似地將其六面數位化。(圖4)為數位化的魔術方塊,其中的0到5數值分別代表六種顏色。
在對紅色一面如(圖5)所示,進行90度左右旋轉的時候,可以知道旋轉紅色面的話則會牽動到灰色區塊一併要進行旋轉,到這邊的時候魔術方塊已經可以用來判斷哪一面哪一點的顏色了。
有了上面這些資訊,在做自動尋解的過程中,就只要先找到目標方塊在哪一面哪一點,然後把依照8355法或者其他解法,將方塊進行90度左右旋轉,把目標方塊轉至定位即可完成自動尋解這功能。
3.5
3D畫面呈現
在畫魔術方塊的時候我們採用Unity內建的3D矩形組合成(圖6)的這麼大的魔術方塊供需要27個3D矩形,所以只要把用先把位置弄出來,我們再依序把27顆3D矩形放入到相對應位置,再配合3.4自動尋解中所提到的二維陣列就可以畫出一顆完整的魔術方塊。
3.6動畫的呈現
如圖6所示
程式碼去呼叫IEnumerator介面函數時,會先去執行裡面的函數,當遇到yield return 0;則暫時返回呼叫它的原先程式。Start()繼續往下做其他事情,Nowplay()則會繼續執行直到沒遇到yield return 0;則結束 IEnumerator ,將用這些函數來做畫面更新及延遲。
方塊旋轉
哪一面共包含哪九塊小方塊,這些在程式中已經配置好,如果我要對第0面進行旋轉,則第0面所牽動的九塊小方塊將會一併跟著旋轉,在旋轉的過程中,會呼叫旋轉函數並計算九個小方塊旋轉的角度,然後利用上面函數StartCoroutine來進行畫面的延遲及更新,將角度慢慢增加或減少,以呈現動畫。