You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
317 lines
7.3 KiB
317 lines
7.3 KiB
module Test exposing (..)
|
|
|
|
import Browser
|
|
import Debug exposing (todo)
|
|
import Element exposing (..)
|
|
import Element.Input as Input
|
|
import Elm.Parser
|
|
import Html exposing (Html)
|
|
import Parser exposing ((|.), (|=), Parser, end, float, keyword, run, succeed, symbol)
|
|
import Pratt exposing (infixLeft, infixRight, literal, prefix)
|
|
import Svg exposing (circle, g, path, svg)
|
|
import Svg.Attributes as SvgA exposing (color, cx, cy, r, strokeWidth, viewBox, x, y)
|
|
|
|
|
|
|
|
-- MAIN
|
|
|
|
|
|
main =
|
|
Browser.sandbox { init = init, update = update, view = view }
|
|
|
|
|
|
|
|
-- MODEL
|
|
|
|
|
|
type alias Model =
|
|
String
|
|
|
|
|
|
init =
|
|
"2+5^(4/3),4"
|
|
|
|
|
|
|
|
-- UPDATE
|
|
|
|
|
|
type Msg
|
|
= NouveauTexte String
|
|
|
|
|
|
update : Msg -> Model -> Model
|
|
update (NouveauTexte texte) model =
|
|
texte
|
|
|
|
|
|
|
|
-- VIEW
|
|
|
|
|
|
view model =
|
|
layout [] <|
|
|
text <|
|
|
case run parser model of
|
|
Ok valeur ->
|
|
String.fromFloat valeur
|
|
|
|
Err _ ->
|
|
"BOOM"
|
|
|
|
|
|
mathExpression : Parser Float
|
|
mathExpression =
|
|
Pratt.expression
|
|
{ oneOf =
|
|
[ literal float
|
|
, prefix 3 (symbol "-") negate
|
|
, parenthesizedExpression
|
|
]
|
|
, andThenOneOf =
|
|
[ infixLeft 1 (symbol "+") (+)
|
|
, infixLeft 1 (symbol "-") (-)
|
|
, infixLeft 2 (symbol "*") (*)
|
|
, infixLeft 2 (symbol "/") (/)
|
|
, infixRight 4 (symbol "^") (^)
|
|
]
|
|
, spaces = Parser.spaces
|
|
}
|
|
|
|
|
|
parenthesizedExpression : Pratt.Config Float -> Parser Float
|
|
parenthesizedExpression config =
|
|
succeed identity
|
|
|. symbol "("
|
|
|= Pratt.subExpression 0 config
|
|
|. symbol ")"
|
|
|
|
|
|
parser : Parser Float
|
|
parser =
|
|
succeed List.sum
|
|
|= Parser.sequence
|
|
{ start = ""
|
|
, separator = ","
|
|
, end = ""
|
|
, spaces = espaces
|
|
, item = mathExpression
|
|
, trailing = Parser.Forbidden
|
|
}
|
|
|. end
|
|
|
|
|
|
espaces =
|
|
Parser.chompWhile <| (==) ' '
|
|
|
|
|
|
|
|
{--
|
|
run parser "-1*3--5+4/2^2" --> Ok ((-1*3)-(-5)+(4/(2^2)))
|
|
run parser "-1*3--5+4/2^2" --> Ok 3
|
|
run parser "((-1*3) - (-5) + (4 / (2^2)))" --> Ok 3
|
|
--}
|
|
|
|
|
|
viewOld : Model -> Html Msg
|
|
viewOld model =
|
|
layout [ width fill, height fill ] <|
|
|
column [ padding 100, centerX, centerY ]
|
|
[ html <|
|
|
svg [ SvgA.height "100", SvgA.width "512" ]
|
|
[ rectangleRouge
|
|
]
|
|
, html <|
|
|
svg [ SvgA.height "100", SvgA.width "512" ]
|
|
[ rectangleVert
|
|
]
|
|
, html <|
|
|
svg [ SvgA.height "100", SvgA.width "512" ]
|
|
[ rectangleVertBis
|
|
]
|
|
, html <|
|
|
svg [ SvgA.height "100", SvgA.width "512" ]
|
|
[ rectangleBleu
|
|
]
|
|
, html <|
|
|
svg [ SvgA.height "100", SvgA.width "512" ]
|
|
[ rectangleBleuBis
|
|
]
|
|
, html <|
|
|
svg [ SvgA.height "100", SvgA.width "512" ]
|
|
[ rectangleCyan
|
|
]
|
|
, html <|
|
|
svg [ SvgA.height "100", SvgA.width "512" ]
|
|
[ rectangleGris
|
|
]
|
|
, html <|
|
|
svg [ SvgA.height "100", SvgA.width "512" ]
|
|
[ rectangleGrisBis
|
|
]
|
|
, html <|
|
|
svg [ SvgA.height "768", SvgA.width "768" ]
|
|
[ carreBleu
|
|
]
|
|
]
|
|
|
|
|
|
trait n r v b =
|
|
Svg.rect
|
|
[ x (String.fromFloat n)
|
|
, SvgA.fill <| "rgb(" ++ String.fromFloat r ++ "," ++ String.fromFloat v ++ "," ++ String.fromFloat b ++ ")"
|
|
, SvgA.color <| "rgb(" ++ String.fromFloat r ++ "," ++ String.fromFloat v ++ "," ++ String.fromFloat b ++ ")"
|
|
, SvgA.width "1"
|
|
, SvgA.height "100"
|
|
, y "0"
|
|
]
|
|
[]
|
|
|
|
|
|
point xCoord yCoord r v b =
|
|
Svg.rect
|
|
[ x (String.fromFloat xCoord)
|
|
, SvgA.fill <| "rgb(" ++ String.fromFloat r ++ "," ++ String.fromFloat v ++ "," ++ String.fromFloat b ++ ")"
|
|
, SvgA.color <| "rgb(" ++ String.fromFloat r ++ "," ++ String.fromFloat v ++ "," ++ String.fromFloat b ++ ")"
|
|
, SvgA.width "2"
|
|
, SvgA.height "2"
|
|
, y (String.fromFloat yCoord)
|
|
]
|
|
[]
|
|
|
|
|
|
rectangleRouge =
|
|
g [] <|
|
|
List.map (\x -> trait x (x * 0.9) 0 0) range
|
|
++ List.map (\x -> trait (x + 256) (255 * 0.9) (x * 0.9) (x * 0.9)) range
|
|
|
|
|
|
rectangleVertBis =
|
|
g [] <|
|
|
List.map (\x -> trait x 0 x 0) range
|
|
++ List.map (\x -> trait (x + 256) x 255 x) range
|
|
|
|
|
|
rectangleVert =
|
|
g [] <|
|
|
List.map (\x -> trait x 0 (x * 0.8) 0) range
|
|
++ List.map (\x -> trait (x + 256) (x * 0.8) (255 * 0.8) (x * 0.8)) range
|
|
|
|
|
|
rectangleBleu =
|
|
g [] <|
|
|
List.map (\x -> trait x 0 0 x) range
|
|
++ List.map (\x -> trait (x + 256) (x * 0.9) x 255) range
|
|
|
|
|
|
carreBleu =
|
|
g [] <| List.map (\( x, y ) -> point (3 * x) (3 * y) x y 255) carre
|
|
|
|
|
|
rectangleBleuBis =
|
|
let
|
|
f x =
|
|
128 + 30 * (logBase e (4 + x) - logBase e (260 - x))
|
|
in
|
|
g [] <|
|
|
List.map (\x -> trait x 0 0 (f x)) range
|
|
++ List.map (\x -> trait (x + 256) (f x) (f x) 255) range
|
|
|
|
|
|
rectangleGris =
|
|
g [] <|
|
|
List.map (\x -> trait x (x / 2) (x / 2) (x / 2)) range
|
|
++ List.map (\x -> trait (x + 256) (128 + x / 2) (128 + x / 2) (128 + x / 2)) range
|
|
|
|
|
|
rectangleGrisBis =
|
|
let
|
|
f x =
|
|
128 + 30 * (logBase e (4 + x) - logBase e (260 - x))
|
|
in
|
|
g [] <|
|
|
List.map (\x -> trait (2 * x) (f x) (f x) (f x)) range
|
|
++ List.map (\x -> trait (2 * x + 1) (f x) (f x) (f x)) range
|
|
|
|
|
|
rectangleCyan =
|
|
g [] <|
|
|
List.map (\x -> trait x 0 (x * 0.3) x) range
|
|
++ List.map (\x -> trait (x + 256) x (x + 0.3 * (255 - x)) 255) range
|
|
|
|
|
|
range =
|
|
List.map ((\x -> x / 10) << toFloat) <| List.range 0 2550
|
|
|
|
|
|
carre =
|
|
let
|
|
f n =
|
|
List.map (Tuple.pair n << toFloat) <| List.range 0 255
|
|
in
|
|
List.concatMap (f << toFloat) <| List.range 0 255
|
|
|
|
|
|
type alias Couleur =
|
|
{ rouge : Float
|
|
, vert : Float
|
|
, bleu : Float
|
|
}
|
|
|
|
|
|
type alias CouleurRvb =
|
|
{ rouge : Float
|
|
, vert : Float
|
|
, bleu : Float
|
|
}
|
|
|
|
|
|
versRvb : Couleur -> CouleurRvb
|
|
versRvb { rouge, vert, bleu } =
|
|
if rouge < vert && vert < bleu then
|
|
todo "bla"
|
|
|
|
else
|
|
todo "bla"
|
|
|
|
|
|
plusSombre : Float -> Couleur -> Couleur
|
|
plusSombre taux { rouge, vert, bleu } =
|
|
if rouge < vert && rouge < bleu then
|
|
let
|
|
nouveauRouge =
|
|
rouge * taux
|
|
|
|
nouveauPasRouge =
|
|
nouveauRouge - rouge
|
|
in
|
|
{ rouge = nouveauRouge
|
|
, vert = vert + nouveauPasRouge
|
|
, bleu = bleu + nouveauPasRouge
|
|
}
|
|
|
|
else if vert < bleu then
|
|
let
|
|
nouveauVert =
|
|
vert * taux
|
|
|
|
nouveauPasVert =
|
|
nouveauVert - vert
|
|
in
|
|
{ rouge = rouge + nouveauPasVert
|
|
, vert = nouveauVert
|
|
, bleu = bleu + nouveauPasVert
|
|
}
|
|
|
|
else
|
|
let
|
|
nouveauBleu =
|
|
bleu * taux
|
|
|
|
nouveauPasBleu =
|
|
nouveauBleu - bleu
|
|
in
|
|
{ rouge = rouge + nouveauPasBleu
|
|
, vert = vert + nouveauPasBleu
|
|
, bleu = bleu + nouveauBleu
|
|
}
|
|
|