發表文章

「線段相交與否」與「球體碰撞點」

圖片
最近在實作 Delaunay Triangulation 時,遇到需要刪除交叉線斷的問題,才想到之前碩論在做撞球的時候也有解決到類似的問題,但忘記怎麼解了,趕緊複習了一下,並想在這記錄下來,日後好再回來查找。 線段相交與否 要求線段 AB 與 線段 CD 是否相交,可以嘗試以下兩種方法。 方法一:解連立求 x 最直觀的方法,把方程式列出來後解連立。 f(x) = Mab * x + (A.y - A.x * Mab) f(x) = Mcd * x + (C.y - C.x * Mcd) 其中 Mab 是 AB 的斜率, Mcd 是 CD 的斜率。 Mab = (B.y - A.y) / (B.x - A.x) Mcd = (D.y - C.y) / (D.x - C.x) 連立解完會長成下面這樣: x = ((C.y - C.x * Mcd) - (A.y - A.x * Mab)) / (Mab - Mcd) 最後在比較 x 的範圍有沒有超出 AB 的 x 與 cd 的 x 即可。 方法二:外積 本方法參考自: https://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/ 當兩線斷相交時,A 和 B 會被 CD 分開, C 和 D 會和 AB 分開。 你可以仔細觀察一下此時弱勢使用 CD 分開 A 和 B,並組成 CDA 和 CDB 這兩個三角形。其轉向一定是相反的。 同理,若是我們是用 AB 把 C 和 D 分開,也是一樣: 因此,我們要先有一個確認轉向的 Function: // 3D bool ccw(Vector3 A, Vector3 B, Vector3 C, Vector3 normal) { return Vector3.Dot(Vector3.Cross(A - B, C - B), normal) > 0); } // 2D bool ccw(Vector2 A, Vector2 B, Vector2 C) { Vector2 BA = A - B; Vector2 BC = C - B; return BA.x * BC.y - BA.y * BC.x > 0; } 上述式子中簡單來說,若兩向量外在 XY 平面且是逆時針,外

如何在 Windows 上透過 Anaconda 安裝 TensorFlow, sklearn 等機器學習套件

這學期因為修了類神經網路與巨量資料兩個課程,因為課程作業的關係,也認識了  Python 的強大,當然,認識一個新的開發工具,開發環境往往是新手開發人員要面臨的第一項難題。 因為用原生的 python pip 安裝有許多不便之處,而 Anaconda 強大又貼心的自動安裝需要的套件確實讓新手開發人員可以免於很多不必要的麻煩! Anaconda - 超棒的 Python 套件管理工具 剛剛查了一下 WIKI,發現 Anaconda 好像不是專門用在安裝 Python 的套件的工具(還有提供其他雜七雜八的安裝功能),但是對我來說只需要用到 Python 的套件管理功能就好,接下來讓我們來介紹 Anaconda 的強大之處吧: 方便簡單管理與下載套件 而 Anaconda 最方便的是,在初次安裝時會把所有常用的套件通通安裝好,因此可以省去許多安裝上的麻煩,而此點正有別於一般 pip 套件管理工具,可以說是非常方便喔! 舉例說明,如果要在 Anaconda 上安裝 Python 上超強大的數學處理套件 ─ Numpy,只要執行像如下的指令就會自動安裝好囉! conda install numpy 自訂方便的 Python 開發環境 像我這樣的 Python 新手常常遇到不知道這個套件到底是用在 Python 2 和 Python 3 上的狀況。 在開發 Python 時,有可能會遇到一些套件是只能給 Python 2 使用,或是某些套件只能給 Python 3 使用,那如果我的電腦只有安裝 Python 2,又偏偏要使用一個只能在 Python 3 上使用的套件,請問該怎麼辦呢? 而 Anaconda 最強大的地方是可以建立多個 Python 版本的環境,讓使用者在開發上不會遇到任何版本限制的困難。 舉個例子,若你今天只是在一般的 cmd 中執行 conda 的指令,如: conda create --name python2 python=2.7 上述的指令是建立一個新的 Anaconda 環境,而此 Anaconda 環境為 Python 2.7 版,而若要進入剛創立的新環境─ "python2",那麼可以執行以下的指令。 C:\>activate python2

MySQL 筆記:Join 合併表格,使用方式

     Join 語法一共有三種,分別是 inner join、left join、right join。      先來簡述一下 Join 的用法。       SELECT * FROM table1 (LEFT/RIGHT) JOIN table2   ON table1.somecolum = table2.somecolum (and/or) condition2…. 前段為一般的 SELECT 語法,顯示 table1 的資訊。 JOIN table2 的意思是:要在顯示 table1 資訊的同事,把 table2 的資料也一起融入並顯示出來。等一下會介紹 join 的三種方式。 ON 之後為 JOIN 的條件。 JOIN: 也就是 INNER JOIN,該 JOIN 的用法是,只會顯示出符合 ON 條件的資料。也就是兩 table (table1 and table2) ,交集的資料。 舉例: 若 A 表格有三筆資料分別是 a_id 為 1,2,3。 若 B 表格有兩筆資料分別是 b_id 為 1,2,4。 SELECT * FROM A JOIN B ON A.a_id = B.b_id; 在執行 JOIN 合併表格之後顯示的資料會是以下。 因為合併列印的關係,兩個表格的所有資料被合併成一個表格列印出來。 而因為是 INNER JOIN 的關係,所以只印出兩表格符合條間的交集資料。 a_id b_id 1 1 2 2 LEFT JOIN: 該 JOIN 的用法是,除了顯示符合 ON 條件的資料外,還會顯示 table1 (FROM 後方所接的 table) 的所有資料。 舉例: 延續上方 INNER JOIN 時的 A, B 表格。 SELECT * FROM A LEFT JOIN B ON A.a_id = B.b_id; 執行結果如下。 可看出 A 表格的資料儘管在 a_id = 3 時找不到符合 a_id = b_id 的對象,但是該筆資料仍然被顯示出來,但對應的 b_id 因為沒有符合條件的對象而保留為 NULL。 a_id b_id 1 1 2 2

MySQL 筆記:Select 排序,使用 order by

如何使用 order by? 先舉個例子: select * from member order by create_at, update_at desc select 正常用法,後方搭配 order by 來決定排序的方式。 可以放入多個 column,越靠左方的 column 代表越高的優先權。 接著決定昇序(ASC)或降序(DESC)

MySQL 筆記:建立使用者, 更改使用者權限

     mysql 的使用者資料是建立在一個 table 當中,這個 table 記錄了所有可以使用這個 mysql 伺服器上的使用者的資料。當要登入 mysql 伺服器時,mysql 會根據這個 table 中使用者的帳號密碼去驗證目前登入的使用者是否為合法使用者。權限管理的概念也如同建立使用者資料。      而基於上述,新增使用者或更改使用者權限的方式出現了兩種,第一種是最基本的,也就是直接使用 mysql 官方提供的語法,例如:CREATE USER, GRANT 等等,而這些官方提供的方便語法執行後會立刻生效。      而第二種方法就是利用 INSERT, UPDATE, DELETE 等語法直接更改記錄使用者資料與權限的 table,但此種方法不會立刻生效,需要執行一到指令:FLUSH PRIVILEGES,這到指令有點像重新整理所有權限,一種重新載入所有使用者資料與使用者擁有權限的概念。 舉例: 建立使用者:      CREATE USER ‘newuser’@‘host’ IDENTIFIED BY ‘password’; 賦予使用者權限      GRANT ALL database.table TO ‘user’@‘host’            ALL: 權限,如果只有部分權限,則可直接指出(如:CREATE, UPDATE, SELECT...等)。           database.table: 決定要賦予的資料庫或表格。           ‘user’@‘host'要賦予權限的對象。 更新使用者權限狀況:      FLUSH PRIVILEGES;           將以上上述的加入使用者或是賦予新權限的設定重新載入,使其生效。 總結: 新增使用者和更改使用者權限有兩種方式,分別是:自行插入table 和 使用官方提供的語法。 使用官方提供的語法執行後,設定會立刻生效。 使用直接更動 table 的方式,更動後的設定不會立刻生效,需要透過 flush privileges 指令重新載入所有設定後,才會生效.          

Debian, Parallels desktop 筆記:如何建立自己的 Shared Folder / Debian and PD(Parallels Desktop) notes: How to create your own shared folder in the Linux VM in Parallels Desktop

圖片
Hi! I'm Eric. I'm not good at English and this is my first time using English to write an article. So if there are some problems in this article, welcome to inform me. I will be so glad and thank you for giving me a chance to learn the knowledge about computer science and training my English ability. I will use English to write this article because I search a lot of key words to search how to create an own shared folder in Linux VM with the location I prefer, but that took me so much time even if I search it with English. So I record how to do by my way to help someone who is the beginner like me and hope this article can help them. ----------------------------------------------------------------------------------------------------------------------- Before we start, you need to install Parallels Tools and set some options in the VM configuration. You can fallow following websites' steps to complete these missions. install parallels tools: web1 , web2 set up shared

Debian Linux 筆記: 簡單新增使用者的 sudo 權限

sudo 的好處: 若想要讓部分的使用者使用管理員的權限,勢必要給他們 root 的帳密,並以 root 的身分登入,但因此有一個問題誕生了。 D是系統管理員,若今天 D 給了 ABC 三個人 root 的登入方式,而 ABC 三個人分別用 root 的身分做了三件事情。但是系統紀錄的卻是這三件事都是 root 做的,無法辨別 ABC 到底是做了哪些事。 而 sudo 的意思是,ABC 分別使用自己的身分去執行這三件事,只是在當下擁有 root 的權利,但是系統的記錄分別用個人的身分去紀錄事件由誰去執行的,因此事後要去追究或尋找執行這個事件的人是誰時就變得很方便了。 因為我是安裝 Debian Linux,所以一開始是沒有 sudo 這項指令的,因此我們需要先安裝 sudo 的指令包。 在安裝安裝包前我們要登入 root 權限: su - 以上的指令使用法是: su 使用者名稱or- 如果 su 後面接的是 使用者名稱,就代表在該 bash 下再建立一個,而該 bash (不太熟,有錯歡迎糾正)是由該使用者的身分登錄。而在 su 的後方若不是接 使用者名稱 是改接 - ,則代表使用 root 帳號登入。 (總之 su 就是更換使用者就是了!) 再輸入 root 密碼後,我們登入了 root 帳號,接者就可以安裝 sudo 了: apt-get install sudo 輸入這項指令後,sudo 就會開始安裝。 在安裝完成後,該電腦就會有 sudo 的指令可以使用了,但是在剛安裝好的時候 是沒有辦法每個人都使用的 sudo 的,因為還沒有任何一個人被登記為使用者。因此以下要來讓我們的使用者可以使用 sudo。 其實在安裝完 sudo 後,系統會多出一個 Group ,而其名正好就是 "sudo" ,而只要是在該 Group 底下的使用者都有可以使用 sudo 的權限。 因此我們的任務就是要把自己的使用者加到這個 Group 內: adduser 使用者名稱 sudo 請注意,在使用這行指令時依舊需要在 管理員權限(root 或已經有 sudo 使用權的使用者下使用),才能進行該權限的更改。 這行指令輸入後,該使用者就擁有 sudo 的使用權了。 但是最後注意:更改權