From 5cce18a87459c129618e82b5461138b06bad09c9 Mon Sep 17 00:00:00 2001 From: James Leslie Date: Sun, 9 Jun 2024 21:57:28 +0100 Subject: [PATCH] Add hexagon --- .img/hexagon.png | Bin 0 -> 9977 bytes Descartes.cabal | 4 ++-- README.org | 17 +++++++++++++++++ test/Main.hs | 30 ++++++++++++++++++++++++++++-- 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 .img/hexagon.png create mode 100644 README.org diff --git a/.img/hexagon.png b/.img/hexagon.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9241b8d4fa33cbd0e47058ca49f2c8e0f9e014 GIT binary patch literal 9977 zcmeHNdpy(o|NpohU1aB^kV2=V)5WGq9un$XUum{%+3nJlS@6%>>LLlG6;u zA33Cf{ZN*=lVhydDjNXshFg_4JUH|;xqW8y zGkf^NfKv}YKbJHO;h`is_uUPq-c2Sx^O&U|7_$?$1=vO&$_W6n|FA-^1cR6l>+!;I zYKd8K{KGu~U40L>k*1nZwhpQMnOx>RmM&a$t=xRtW!xHMSg7^dB~lo@^DsV=Tj*Ow z?9VTUPY+>__g_FH=R;Q6&#y4ZK!Ii`Eu=gSEB;qy6orXaU~G4pnFn$Rxt&^8)-Tj_^HCBKT< z6eU~T-60+qf*m@#+Ncakt}=3gTM0+dfEoB&;5F>QcfSRg0Es;E`bQ?A3i=CyUhg>7+r1Qn%s&KI!}JDza3JXl4bD5kWj`_@5T54KW z6TZdyIbH4fX|{MMrYF2D?qnk!FKUMdmWy#~8}UX7c=M43X4N=`LxD}agG!o*9Y{Re z^@!4AP&+JrF9I_;dyH9zKnQAe7s#7)U6BTagtT2qad)sid@l2y+;+;-TXEt^D_0Nm zO5%HBFNN15{snI_@g{W)GuD5Wx|b_J1h+r!PZg|NxKiMLxv>%=8F-wf<3R zJDrfalh+6Jn8hP@@EZh`=ZEmvndmkJMzOnB(9l{9Lx1<_51t5O|1H~&i@X5*rS43% z?R(JzcLKjR%}8=TEwnOws|KmRBvhN;&Y#`siolLgt}#m*s^9?7T6yYO1ghp)9>%)G z|KG!n+4VAhwn62~Fb^j43=4koHm(uG~`)KfUx;@2*a{IpMaWr61A1B* zNGTeRp1GAjnMqkrZq{-Sj|kNf{WmI57M*_bu=UZz#&Rm(y2X6#&6CvF%vRK#ase@-x~jk|(!UnN+FaQ$`c6eQ_N96uqgDu zWJfm_O~S=bs&<_oPPs-BVJ;k|TVjzY+LJ~?{0FVdNgf33p{G)|B2r;FMLAnyeT1oY z}^mKVfX<`M&4pWB9e97rlhlM%am8j3h!A zR|#Wp;7MYhhyNqgJC@!Qggg0+85leGh@qQK_L$}Y(58sZjnQEQmvJ%vofztaxOeYO9nv~>r$1;f zXK~XaNxx-nIW$H~7#-B@-q)DSAXIuJ)}@EAuP=`=oJeN3XKsnbaYZEG(~Tx^l(gO5 zyj~g;hx~!ox@WxLs`H{4H$=XTPxdjfTzZ@Jeg)ig>dzt6wR7_mM zE)Zgpc_B_bPvXV?=dPqHy`>cEg0T8N6UGH-0OQ4zb7SdYqp#KSBlzp#;r7ftxCd#( z;g&vXd=;#fPEU08GnvA~r~J`-%$Z@+kPcmvJZt7+|7lg#4YcHr%0>{#W&j=JC1>xLkW;1EU$DE!2EjoxKv2TXCuMF4=T-G~3B=wsUfH4_A;@vpIZ(Tq;N;7gTZj%xfX}?QgEHsu zjs%L@ktN#W!tz8y!Q4;+ue`sL`>ef$VxoPTp4zattUb?7RILDs6w#Sg?3JPLcRcFu zG5XZ#y{8wBBYRq$%!-Q%#e~H0vXXs*CMURfBB5Zel|Ul(RWs9{hVqLDqCpM8^Re@R zNL^?N=Hi8%tP3LztVWVRq`NTvfIB7`QLIeEm9g@(2v=|K4eEP8G1gp3$73fuAP5N( z8aa^cVv7r!sSQ49JFJgbv(G>`BCMXxKG;vT9~{+$J_|U4cDF@0mMQb**=lIy&-xNE z05~%LJU;}zL@WmYW5vyLB6k3Y`u*-C0DOJ00j!GOZ3RPo_cs^-?7#OPKlJaM)+JN$ z(6Ryr0MK0R`tcOf`r=CG{VJi6fH~fBG-4|_u6tK3G$gFa|G4X+|Ju}l4(gwk|B(D& zX!#%6{NIz!NgJUO&_?U^gPBF;<60t>EQ?D&c>&#XZdo~ZA~59bvW1A4x?cS+1yO%o zXE?ph&@9yx&J=aW*nE)jdGb?3vmJ4$bBdn|*I#PnMb=|gH?n;Bi6$#daMH&snEXjc z*Y2Ju5wY2-GU(HjKQCp@7(hZ^uTbB$D-M+nm)`1I9LvBsOr7uO;PJQHo6ZI+;|s1I z#y^_5v}ES%`faN;EeNOs9BII>PZY~6%z>PM2s?Y=a5V`L9 zsNqX#F^1BJ9zSz?F5l*70@*49QT&TzN;VH_VXYRQcKXYWQ^}-bu%Xknu2UwE;wG1m zcT&U#t5uf;^8WYfu+|@BELSshyw(NUDX#mp{4ZBnd9d3%a-BBDfp%1-Uo`eNw7cd3 zQnqptU@q*oe5hfDMQL-*pbYk1e2=bZ)r~`GZj<5bq2~v#&7U=aw8B& z-KQ7pU3B!{c&<2iB#`f@En}-qhWq6V*^l2zvsSaLXob=s)kjC4yhKdR&C9{^nm6e% z=j*wD>$vVHO}TbFa0BFVbE7mdDsi=X)sAjWH3u$B3oWL;LCt%YA^X(qXJ%9$u3ue! z;Bs0_@1lgh(501k^K!@K>ikP#GB9VHxFqkKS_@N2l18{oG1o52|3ym7tIzs3-U$6R zs-@2yazjR{saEe%%TPbjRP#!PG%HV>k#E%k!*f&G&im#SY8lC(v*OSGluiKu0%g1O z|DRW#oei|N&$r2~2G?$vj?H;T^<-ekko{_jeg)uFH~ajVrLf|n`-2pKR^_GKa8S6M zpq%Zh&Nq`GS~JCwgHbl#CJs-e>34Wkl%jaf4194>v;+DMjGzR$b7uniX7bW9ZvD3L z0C2T1C5t4@N>=^}EBQa*aj0P#><|B}^c|q=XW}4Q#E?JvuV93n_joruM^D=KHeY!i4AHsm5Nafm(%p_N(V~* z#CCZ{ZFT+`8LZe99aqelH)J1_Rt8SX_wlmo!51l6Gm9L!qWtd&m4V`#0NhEoREfiB z`P^D&82~OfmqFPNCv@c7^* zhd7kY1L+rkZ%F+*YW}nd_1tInoo~4-0n^O^xZ%ZY_-l?i)Vi&be+#B$jtnt5|N3+z z5MS?u8+0q(vG$SnEy&LV&k;IxMMQnwW1+D=h;Qz#y-d&SX=0LkZw* zY{*{cCc{s5E&X`a?NC(r;@_0C4d=kX0BCX5~QNB7rt9%?v zm9mu2MH-SG2vA%XfV(CwazE%w7?AC&&L5>pgE$@vd|l&%lTlBgW{39z2S9j>^`zc~ z^mr~b95^sgl;$Z-@@W$YU=ra)!%GY1YEg=E)Je8!sz`>PM(TXP@j}FQ)32AR4^^(T zS;2DKxLcEqV(DiIE;l|IA>N@W9h=>XaVQ}B2Ru;)Ck^7OS|1%iznNob#rmWkFgEf8 zaJeErZ-b6B#VQYLVZiM*_$*m*R=p2?s1ieUj9w&^*kEcH2;y?KfUesrjcc9UN6?xU z1~T<$^6|s3@d>gTp-l>CXo_Qcx8dKZ_A?y@%x?HiMw4~=5!}h_2Rz1EhBWmlJ~~l# zz5F}=(gT7+(upPoM`lFbQOqas^)9&IgVK~U#Iqi!U&@fvnvctMBa%(Zq-9|0Z^)K= z!{W!Cl%6PYN5MJ6QXTKMG}D0X!R``hXJ#%vvt8OwR`f?ZX%Xf})1>V<1%r07wJj2| zeLrK?Vwpp#2PfC_81>%tvs4eJz~=;LswMt%~0%t9Gk^lF}!0R^D2KkPAE2 z&6d-2vv7K|D5F2G3+j*K4uAnr!Bf9^C#`e6kCBWa`zcQ^w%{*jy$KM2CJe99s`@t!qoAE{j5JRxs0| zMrg^9jMnv9nC0g2^sE*cvAG7urqzIYRqOuJR?5J2BANE)Gfk_=V7g^PKF8)OFgCwZ zOgBh-LwgH)vl)W}@PHm-K9< z;|~hhQ3!jIA)~m&Xn|pD{ek*@_P@_I{&(mw$Gxz)jAZHbjnVQof!y9s)y-ZkkzXE$ zpMn0gaULqjIxhlosEj=@zm1Eo27xEhK)xj_ti*EhB>II+zXk)R>4ww$RmQPr|BDpm zXsW5=Qf+ZXEn}NQHt0}SEhX6(h`zXkYh|9PAN`S{tV-d_4a?AIwt+goS`1Um z@LJ@+6_srj$gkdx1N(!FKr+A+kPVw-A#1vK=4.18.2.1 -- GHC options for the library - ghc-options: -O2 + ghc-options: -O2 -Werror -- Directories containing source files. hs-source-dirs: src diff --git a/README.org b/README.org new file mode 100644 index 0000000..6d7108b --- /dev/null +++ b/README.org @@ -0,0 +1,17 @@ +#+title: Descartes +#+author: James Leslie +[[https://img.shields.io/github/license/jeslie0/descartes.svg]] + +#+html: + +This is a Haskell wrapper around The University of Edinburgh, School of Informatics' [[https://www.inf.ed.ac.uk/teaching/courses/cp/descartes.html][Descartes Package]]. The Descartes Packages is a small C library that uses [[https://www.libsdl.org/][SDL]] to make a very simple graphics package. It provides a way to make and render points, lines and rectangles on a 500px by 500px grid. It is mainly useful for educational purposes (indeed, I used it in the introductory "Computer Programming" course, back in 2014). + +The main reason I made this library was to get a better understanding of Haskell's Foreign Function Interface with C, which turns out to be quite nice and very useable. As such, this repository may be of more use for someone wanting to explore Haskell's FFI functionality, rather than as an actual library. + +Note - I only wrote the Haskell code and C wrapper code. Everything in [[file:cbits/descartes/][descartes]] directory is from the Descartes library. + +* Dependencies +The only dependency is SDL. This has been tested with SDL version 1.2.15. + +* Modifications +I made a few minor modifications to the Descartes C library. I changed the title of the graphics window to "Descartes". diff --git a/test/Main.hs b/test/Main.hs index 9ce9819..d0db23e 100644 --- a/test/Main.hs +++ b/test/Main.hs @@ -1,11 +1,13 @@ module Main (main) where import Descartes qualified as D -import Control.Monad (when) +import Control.Monad (when, forM_) +import Data.Complex qualified as C +import Data.Functor ((<&>)) main :: IO () main = D.withGraphics $ do - D.setColour D.Red + D.setColour D.Blue putStrLn "Click twice to draw a line." p1 <- D.getPoint @@ -23,12 +25,36 @@ main = D.withGraphics $ do D.fillRectangle $ D.rectangle bl tr + D.setColour D.Green + forM_ makeHexagon D.draw + + D.setColour D.Red makePath Nothing + makePath :: Maybe D.Point -> IO () makePath Nothing = D.getPoint >>= \p -> makePath (Just p) makePath (Just p) = do p' <- D.getPoint D.draw $ D.lineSeg p p' makePath (Just p') + +joinPoints :: [D.Point] -> [D.LineSeg] +joinPoints [] = [] +joinPoints [p] = [] +joinPoints (p1:p2:ps) = D.lineSeg p1 p2 : joinPoints (p2:ps) + +makeHexagon :: [D.LineSeg] +makeHexagon = + let + scale f = round $ 166 * (f + 1.5) + + -- We use 7 here so that the last point is equal to the first. + powers :: [C.Complex Float] = + take 7 $ iterate (\ z -> z * C.mkPolar 1 (pi / 3)) (1.0 C.:+ 0) + + points :: [D.Point] = + powers <&> \ z -> D.point (scale . C.realPart $ z) (scale . C.imagPart $ z) + + in joinPoints points