slope-field (empty) → 0.1.0.1
raw patch · 5 files changed
+211/−0 lines, 5 filesdep +Chartdep +Chart-cairodep +basesetup-changed
Dependencies added: Chart, Chart-cairo, base, colour, data-default-class, lens, mathexpr, slope-field
Files
- LICENSE +101/−0
- Setup.hs +2/−0
- app/Main.hs +43/−0
- slope-field.cabal +39/−0
- src/Lib.hs +26/−0
+ LICENSE view
@@ -0,0 +1,101 @@+ GNU GENERAL PUBLIC LICENSE+ Version 3, 29 June 2007++ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>+ Everyone is permitted to copy and distribute verbatim copies+ of this license document, but changing it is not allowed.++ Preamble++ The GNU General Public License is a free, copyleft license for+software and other kinds of works.++ The licenses for most software and other practical works are designed+to take away your freedom to share and change the works. By contrast,+the GNU General Public License is intended to guarantee your freedom to+share and change all versions of a program--to make sure it remains free+software for all its users. We, the Free Software Foundation, use the+GNU General Public License for most of our software; it applies also to+any other work released this way by its authors. You can apply it to+your programs, too.++ When we speak of free software, we are referring to freedom, not+price. Our General Public Licenses are designed to make sure that you+have the freedom to distribute copies of free software (and charge for+them if you wish), that you receive source code or can get it if you+want it, that you can change the software or use pieces of it in new+free programs, and that you know you can do these things.++ To protect your rights, we need to prevent others from denying you+these rights or asking you to surrender the rights. Therefore, you have+certain responsibilities if you distribute copies of the software, or if+you modify it: responsibilities to respect the freedom of others.++ For example, if you distribute copies of such a program, whether+gratis or for a fee, you must pass on to the recipients the same+freedoms that you received. You must make sure that they, too, receive+or can get the source code. And you must show them these terms so they+know their rights.++ Developers that use the GNU GPL protect your rights with two steps:+(1) assert copyright on the software, and (2) offer you this License+giving you legal permission to copy, distribute and/or modify it.++ For the developers' and authors' protection, the GPL clearly explains+that there is no warranty for this free software. For both users' and+authors' sake, the GPL requires that modified versions be marked as+changed, so that their problems will not be attributed erroneously to+authors of previous versions.++ Some devices are designed to deny users access to install or run+modified versions of the software inside them, although the manufacturer+can do so. This is fundamentally incompatible with the aim of+protecting users' freedom to change the software. The systematic+pattern of such abuse occurs in the area of products for individuals to+use, which is precisely where it is most unacceptable. Therefore, we+have designed this version of the GPL to prohibit the practice for those+products. If such problems arise substantially in other domains, we+stand ready to extend this provision to those domains in future versions+of the GPL, as needed to protect the freedom of users.++ Finally, every program is threatened constantly by software patents.+States should not allow patents to restrict development and use of+software on general-purpose computers, but in those that do, we wish to+avoid the special danger that patents applied to a free program could+make it effectively proprietary. To prevent this, the GPL assures that+patents cannot be used to render the program non-free.++ The precise terms and conditions for copying, distribution and+modification follow.++ TERMS AND CONDITIONS++ 0. Definitions.++ "This License" refers to version 3 of the GNU General Public License.++ "Copyright" also means copyright-like laws that apply to other kinds of+works, such as semiconductor masks.++ "The Program" refers to any copyrightable work licensed under this+License. Each licensee is addressed as "you". "Licensees" and+"recipients" may be individuals or organizations.++ To "modify" a work means to copy from or adapt all or part of the work+in a fashion requiring copyright permission, other than the making of an+exact copy. The resulting work is called a "modified version" of the+earlier work or a work "based on" the earlier work.++ A "covered work" means either the unmodified Program or a work based+on the Program.++ To "propagate" a work means to do anything with it that, without+permission, would make you directly or secondarily liable for+infringement under applicable copyright law, except executing it on a+computer or modifying a private copy. Propagation includes copying,+distribution (with or without modification), making available to the+public, and in some countries other activities as well.++ To "convey" a work means any kind of propagation that enables other+parties to make or receive copies. Mere interaction with a user through+a computer network, with no transfer of a copy,
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ app/Main.hs view
@@ -0,0 +1,43 @@+{-# LANGUAGE ScopedTypeVariables #-}++module Main where+ import Lib+ import System.IO+ import Graphics.Rendering.Chart+ import Graphics.Rendering.Chart.Backend.Cairo+ import Control.Lens+ import Data.Default.Class+ import Data.Colour.SRGB+ import Data.Colour++ main :: IO ()+ main = do+ putStrLn "dy/dx = "+ math <- getLine+ putStrLn "range - format: (lower, upper): "+ (lower, upper) :: (Int, Int) <- read <$> getLine+ putStrLn "estimation size: "+ s <- read <$> getLine++ let pts = points (lower, upper)+ field = slopeField math pts s++ let chart = toRenderable layout+ where+ color = opaque (sRGB 0.3 0.3 1)++ layout = layout_title .~ "slope field"+ $ layout_plots .~ [vectors]+ $ def++ vectors = plotVectorField+ $ plot_vectors_values .~ field+ $ plot_vectors_scale .~ 1+ $ plot_vectors_grid .~ []+ $ plot_vectors_style . vector_head_style . point_color .~ color+ $ plot_vectors_style . vector_line_style . line_color .~ color+ $ def++ renderableToFile def "slope-field.png" chart+ putStrLn "created file slope-field.png"+ return ()
+ slope-field.cabal view
@@ -0,0 +1,39 @@+name: slope-field+version: 0.1.0.1+synopsis: Visualize mathematical function's slope fields+description: Visualize mathematical function's slope fields+homepage: https://github.com/mdibaiee/slope-field+license: GPL-3+license-file: LICENSE+author: Mahdi Dibaiee+maintainer: mdibaiee@aol.com+copyright: 2016 Mahdi Dibaiee+category: Web+build-type: Simple+-- extra-source-files:+cabal-version: >=1.10++library+ hs-source-dirs: src+ exposed-modules: Lib+ build-depends: base >= 4.7 && < 5+ , mathexpr >= 0.3.0.0+ , data-default-class+ default-language: Haskell2010++executable slope-field+ hs-source-dirs: app+ main-is: Main.hs+ ghc-options: -threaded -rtsopts -with-rtsopts=-N+ build-depends: base+ , slope-field+ , Chart+ , Chart-cairo+ , lens+ , data-default-class+ , colour+ default-language: Haskell2010++source-repository head+ type: git+ location: https://github.com/mdibaiee/slope-field
+ src/Lib.hs view
@@ -0,0 +1,26 @@+module Lib+ ( points+ , slopeField+ ) where+ import Numeric.MathExpr+ import Data.Default.Class++ type Range = (Int, Int)++ points :: Range -> [(Double, Double)]+ points (lower, upper) =+ let range = [lower..upper]+ in [ (fromIntegral x, fromIntegral y) | x <- range, y <- range ]++ slopeField :: String -> [(Double, Double)] -> Double -> [((Double, Double), (Double, Double))]+ slopeField math pts diff =+ let d x y = evaluate def math [("x", x), ("y", y)]+ half = diff / 2+ res = map (\(x, y) -> ((x - half, y), (half, d x y * diff))) pts+ inf = 1/0+ noinf = filter (\((x0, y0), (x, y)) -> x < inf && y < inf && x > -inf && y > -inf) res+ (minx, miny) = head pts+ (maxx, maxy) = last pts+ limitX = min maxx . max minx+ limitY = min maxy . max miny+ in map (\((x0, y0), (x1, y1)) -> ((limitX x0, limitY y0), (limitX x1, limitY y1))) noinf