--------------------------------------------------------------------------------
module Smith where
import Complex
-- Plan9 plot Command Interface ------------------------------------------------
pInit = do putStrLn "o"
putStrLn "ra -110 -110 110 110"
putStrLn "e"
pColor :: String -> String
pColor colorcode = "co " ++ colorcode
pCircle :: Double ->Double ->Double -> String
pCircle xC yC radius = "ci " ++ show xC ++ " " ++ show yC ++ " " ++ show radius
pDisc xC yC radius = "di " ++ show xC ++ " " ++ show yC ++ " " ++ show radius
pLine x1 y1 x2 y2 = "li " ++ show x1 ++ " " ++ show y1 ++ " "
++ show x2 ++ " " ++ show y2
pArc x1 y1 x2 y2 xC yC radius = "a " ++ show x1 ++ " " ++ show y1 ++ " "
++ show x2 ++ " " ++ show y2 ++ " "
++ show xC ++ " " ++ show yC ++ " "
++ show radius
pClose = "cl"
--------------------------------------------------------------------------------
-- Smith Chart Functions -------------------------------------------------------
-- Grids
---- Math functions and constants
d1 x1 x2 y1 y2 = sqrt((x2 - x1)^2 + (y2 - y1)^2)
a1 x1 x2 r1 r2 d = (x2 + x1) / 2 + (((x2 - x1) * (r1^2 - r2^2)) / (2 * d^2))
b1 y1 y2 r1 r2 d = ((y2 - y1) / (2 * d^2))
* sqrt(((r1 + r2)^2 - d^2) * (d^2 - (r2 - r1)^2 ))
xInter1 x1 y1 x2 y2 r1 r2 = a1 x1 x2 r1 r2 d + b1 y1 y2 r1 r2 d
where d = d1 x1 x2 y1 y2
xInter2 x1 y1 x2 y2 r1 r2 = a1 x1 x2 r1 r2 d - b1 y1 y2 r1 r2 d
where d = d1 x1 x2 y1 y2
yInter1 x1 y1 x2 y2 r1 r2 = a1 y1 y2 r1 r2 d - b1 x1 x2 r1 r2 d
where d = d1 x1 x2 y1 y2
yInter2 x1 y1 x2 y2 r1 r2 = a1 y1 y2 r1 r2 d + b1 x1 x2 r1 r2 d
where d = d1 x1 x2 y1 y2
simX1 x y radius = xInter1 0 0 x y 100 radius
simY1 x y radius = yInter1 0 0 x y 100 radius
simX2 x y radius = xInter2 0 0 x y 100 radius
simY2 x y radius = yInter2 0 0 x y 100 radius
epsilon = 1.0e-100 -- A very small number
--------------------------------------------------------------------------------
xR r i | i < 0 = negative
| otherwise = positive
where positive = xInter2 x1 y1 x2 y2 r1 r2
negative = xInter1 x1 y1 x2 y2 r1 r2
x1 = 100 * (r / (1 + r))
y1 = 100 * 0
r1 = 100 * (1 / (1 + r))
x2 = 100 * 1
y2 = 100 * 1 / (i + epsilon)
r2 = abs(100 * 1 / (i + epsilon))
yR r i | i < 0 = negative
| otherwise = positive
where positive = yInter2 x1 y1 x2 y2 r1 r2
negative = yInter1 x1 y1 x2 y2 r1 r2
x1 = 100 * (r / (1 + r))
y1 = 100 * 0
r1 = 100 * (1 / (1 + r))
x2 = 100 * 1
y2 = 100 * 1 / (i + epsilon)
r2 = abs(100 * 1 / (i + epsilon))
lGrid = pLine (-108) 0 108 0
zGrid t (x:xs) = pCircle xC yC radius : zGrid t xs
where xC = (t * 100 * ( x / (1 + x)))
yC = 0
radius = (100 * (1 / (1 + x)))
zGrid t [] = []
xGrid t (x:xs) = pArc x1 y1 x2 y2 xC yC (-1 * abs r) : xGrid t xs
where x1 = simX1 xC yC (-1 * r)
y1 = simY1 xC yC (-1 * r)
x2 = simX2 xC yC (-1 * r)
y2 = simY2 xC yC (-1 * r)
xC = t * 1 * 100
yC = 100 * (1 / (x + epsilon))
r = 100 * (1 / (x + epsilon))
xGrid t [] = []
showSmithChart = do putStrLn $ pColor "0xFF9999FF"
putStrLn $ pCircle 0 0 100
--showGrid
putStrLn $ lGrid
mapM_ putStrLn $ zGrid (1) [0,1..5]
mapM_ putStrLn $ xGrid (1) [-5,-4..5]
--frame
putStrLn $ pColor "0xFFFFFFFF"
mapM_ putStrLn pFrame
putStrLn $ pColor "0xC1C1C100"
putStrLn $ pCircle 0 0 105
putStrLn $ pCircle 0 0 100
where pFrame = map (pCircle 0 0) [100.1,100.5..110]
plotSmith z = do putStrLn $ pDisc (xR (realPart z) (imagPart z))
(yR (realPart z) (imagPart z)) 1
lineSmith :: [Complex Double] -> IO()
lineSmith (z:zs) = mapM_ putStrLn $ ll (z:zs)
where ll (z:zs) | length zs < 1 = []
| otherwise = pLine x1 y1 x2 y2 : ll zs
where x1 = xR (zReal z) (zImag z)
y1 = yR (zReal z) (zImag z)
x2 = xR (zReal next) (zImag next)
y2 = yR (zReal next) (zImag next)
zReal i = realPart i
zImag i = imagPart i
next = head zs
|