【題目】給定兩個點p1,p2,可以唯一地確定一條直線。另給定一點 p0,求p0到直線的距離。
已知的是3個點。求的結果是乙個浮點數。
當 p1= p2 的時候,直線不存在,故無解。其它情況都是有解的。
解法一:
考慮三角形 p0p1p2 的面積為 s, p1 p2 距離為 d,就可求來 高 h,即為解。
三角形面積可用:海倫定理,或三階生列式。
type
point=(
double
,double
)type line =
(point
,point
)pttoline :: point
-> line -
> maybe double
pttoline (x0,y0)
((x1,y1)
,(x2,y2)
)| dis ==0
= nothing
| otherwise = just (area *
2/ dis)
where
dis = sqrt $ (x2-x1)^2
+(y2-y1)^2
area = abs(x0*y1 + x1*y2 + x2*y0 - x2*y1 - x1*y0 - x0*y2)
*0.5
main :: io (
)main =
doprint $ pttoline (0,
0)((
0,5)
,(15/
4,0)
)print $ pttoline (4,
4)((
5,0)
,(5,8))
解法二:
如上圖。做向量 v1 = p1->p0, v2 = p1->p2
如果能把這兩個向量同時旋轉,使得 v2 與 x 軸重合。此時的 v1 的虛部即為所求。
旋轉就是複數的乘法,為了保持模不變,乘的應該是個單位複數。它的方向是v2的共軛複數。
import
data
.complex
type
point=(
double
,double
)type line =
(point
,point
)pttoline :: point
-> line -
> maybe double
pttoline (x0,y0)
((x1,y1)
,(x2,y2)
)| v2 ==0
= nothing
| otherwise = just . abs . imagpart $ v1'
where
v1 = (x0-x1) :+ (y0-y1)
v2 = (x2-x1) :+ (y2-y1)
v2u = conjugate $ v2 / (magnitude v2 :+ 0)
v1'= v1 * v2u
main :: io (
)main =
doprint $ pttoline (0,
0)((
0,5)
,(15/
4,0)
)print $ pttoline (4,
4)((
5,0)
,(5,8))
haskell 基礎題解(06)
題目 如果乙個數的所有真因子 不包含它自身的因子 之和恰等於其自身,則該數為完全數,也稱為完美數 perfect number 完全數有許多奇妙的性質。但它們很稀少,你來求前幾個吧。最小的乙個是 6,因為 6 1 2 3 這個完全數的定義已經很清楚了,如果沒有什麼妙法,就地毯式搜尋也可以。下法就是 ...
haskell 基礎題解(07)
題目 11 1 1 2 1 1 3 3 1 1 4 6 4 1 這個陣勢叫楊輝三角,國外叫帕斯卡三角。前一行的數字中,每兩個相鄰的數字相加就得到下一行的數字。左右兩邊的數永遠是 1 寫個程式,輸出前幾行的楊輝三角。import data.list intersperse yang hui int y...
haskell基礎題解(14)
題目 用自然數蛇形填充乙個 n 階的方陣。當n 5時,形如 這個問題用 haskell 解決時與 題目13 差別甚微。實際上,從函式式的思考習慣看,只要讓有些行作成後反轉一下就可以了。上 ju n f x x 0.n 1 where f row even row take n row n 1.odd...