3 people like it.
Like the snippet!
Complex 8 - Graphics Intro
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
|
// This file introduces our graphics functions
// We want to be able to:
// 1. Create a space with cartesian coordinate system, with given extents.
// 2. Be able to draw lines, text and dots on the space.
// 3. Be able to fill a bitmap with colors on the space.
// Import Try F# compatibility (enable for Visual Studio)
// #load "Offline.fsx"
////////////////////////////////////////
// Start Graphics //////////////////////
open System
open System.Windows
open System.Windows.Controls
open System.Windows.Media
open System.Windows.Media.Imaging
open Microsoft.TryFSharp
type Graphic =
{ Canvas : Canvas;
Size : float;
Scale : float}
let makeCanvas (canvas : Canvas) size =
let initSize = 250.0
canvas.HorizontalAlignment <- HorizontalAlignment.Center
canvas.VerticalAlignment <- VerticalAlignment.Center
let scale = ScaleTransform()
scale.ScaleX <- initSize / size
scale.ScaleY <- -initSize / size
canvas.RenderTransform <- scale
{ Canvas = canvas; Size = size; Scale = 2.0 * size / initSize}
let drawLine canvas brush (x1, y1) (x2, y2) =
let line = Shapes.Line()
line.X1 <- x1
line.Y1 <- y1
line.X2 <- x2
line.Y2 <- y2
line.Stroke <- brush
line.StrokeThickness <- 1.0 * canvas.Scale
canvas.Canvas.Children.Add line |> ignore
let drawDot canvas fill (x, y) =
let dot = Shapes.Ellipse()
dot.HorizontalAlignment <- HorizontalAlignment.Center
dot.VerticalAlignment <- VerticalAlignment.Center
dot.Height <- 2.0 * canvas.Scale
dot.Width <- dot.Height
dot.Fill <- fill
Canvas.SetLeft(dot, x - dot.Width / 2.0)
Canvas.SetTop(dot, y - dot.Width / 2.0)
canvas.Canvas.Children.Add dot |> ignore
let drawDots canvas fill positions =
let grp = GeometryGroup()
let addDot (x,y) =
let dot = EllipseGeometry()
dot.Center <- Point(x,y)
dot.RadiusX <- 0.1
dot.RadiusY <- dot.RadiusX
grp.Children.Add dot
List.iter addDot positions
let shape = Shapes.Path()
shape.Data <- grp
shape.Fill <- fill
shape.HorizontalAlignment <- HorizontalAlignment.Center
shape.VerticalAlignment <- VerticalAlignment.Center
//Canvas.SetLeft(dot, x - dot.Width / 2.0)
//Canvas.SetTop(dot, y - dot.Width / 2.0)
canvas.Canvas.Children.Add shape |> ignore
let drawText canvas (x, y) text =
let tb = TextBlock()
//tb.HorizontalAlignment <- HorizontalAlignment.Center
//tb.VerticalAlignment <- VerticalAlignment.Center
tb.Text <- text
let scale = ScaleTransform()
scale.ScaleX <- 1.0
scale.ScaleY <- -1.0
tb.RenderTransform <- scale
tb.FontSize <- 10.0 * canvas.Scale
Canvas.SetLeft(tb, x)
Canvas.SetTop(tb, y)
canvas.Canvas.Children.Add tb |> ignore
let drawAxes canvas tickUnit =
let darkGray = SolidColorBrush(Colors.DarkGray)
drawLine canvas darkGray (-canvas.Size, 0.0) (canvas.Size, 0.0)
drawLine canvas darkGray (0.0, -canvas.Size) (0.0, canvas.Size)
let ticks = [0.0 .. tickUnit .. canvas.Size] @ [-tickUnit .. -tickUnit .. -canvas.Size]
let tickSize = tickUnit / 10.0
List.iter (fun x -> drawLine canvas darkGray (x, -tickSize) (x, tickSize)) ticks
List.iter (fun y -> drawLine canvas darkGray (-tickSize, y) (tickSize, y)) ticks
let drawBitmap canvas colorFunc =
let getCoordinates =
let step = canvas.Size * 2.0 / 100.0
[ for x in -canvas.Size .. step .. canvas.Size do
for y in -canvas.Size .. step .. canvas.Size do
yield (x, y) ]
List.iter (fun p -> drawDot canvas (colorFunc p) p) getCoordinates
let drawTestDot canvas fill =
drawDot canvas fill (-canvas.Size, canvas.Size)
// Draw 100 * 100 dots over the canvas size
//
//
//let drawBitmap canvas colorFunc =
// let setPixel (bm:WriteableBitmap) row col (alpha : byte) (r : byte) (g : byte) (b : byte) =
// let idx = row * bm.PixelWidth + col
// let r1 = byte ((uint16 r) * (uint16 alpha) / (uint16 255))
// let g1 = byte ((uint16 g) * (uint16 alpha) / (uint16 255))
// let b1 = byte ((uint16 b) * (uint16 alpha) / (uint16 255))
// Array.set bm.Pixels idx (((((int alpha) <<< 24) ||| ( int r1 <<< 16)) ||| (int g1 <<< 8)) ||| int b1)
// let draw (bm:WriteableBitmap) x =
// for i = 0 to 499 do
// for j = 0 to 499 do
// setPixel bm i j 255uy (byte i) (byte j) (200uy + x)
// bm.Invalidate()
// let bm = new WriteableBitmap(500, 500, 96.0, 96.0, PixelFormats.Bgr32, null )
// let image = new Image()
// image.Source <- bm
// canvas.Canvas.Children.Add image
let draw () =
let canvas = makeCanvas App.Console.Canvas 10.0
let black = SolidColorBrush(Colors.Black)
let red = SolidColorBrush(Colors.Red)
let green = SolidColorBrush(Colors.Green)
let blue = SolidColorBrush(Colors.Blue)
let brown = SolidColorBrush(Colors.Brown)
// drawBitmap canvas (fun (x,y) -> if x > 0.0 then red else blue)
drawDots canvas brown [(-5.0, 3.0); (-4.0, 3.0)]
drawAxes canvas 1.0
drawText canvas (4.0, -1.0) "Hello"
drawLine canvas black (1.0, 1.0) (10.0, 1.0)
drawLine canvas red (-8.0,-8.0) (0.0, 0.0)
drawDot canvas green (2.0, 3.0)
drawTestDot canvas blue
List.iter (drawDot canvas red) [for x in -8.0..0.2..8.0 -> (x, 4.0)]
App.Console.CanvasPosition <- CanvasPosition.Alone
App.Dispatch (fun() -> draw())
|
namespace System
namespace System.Windows
namespace System.Media
namespace Microsoft
type Graphic =
{Canvas: obj;
Size: float;
Scale: float;}
Full name: Script.Graphic
Graphic.Canvas: obj
Graphic.Size: float
Multiple items
val float : value:'T -> float (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.float
--------------------
type float = Double
Full name: Microsoft.FSharp.Core.float
--------------------
type float<'Measure> = float
Full name: Microsoft.FSharp.Core.float<_>
Graphic.Scale: float
val makeCanvas : canvas:'a -> size:float -> Graphic
Full name: Script.makeCanvas
val canvas : 'a
val size : float
val initSize : float
val scale : obj
val drawLine : canvas:Graphic -> brush:'a -> x1:'b * y1:'c -> x2:'d * y2:'e -> unit
Full name: Script.drawLine
val canvas : Graphic
val brush : 'a
val x1 : 'b
val y1 : 'c
val x2 : 'd
val y2 : 'e
val line : obj
val ignore : value:'T -> unit
Full name: Microsoft.FSharp.Core.Operators.ignore
val drawDot : canvas:Graphic -> fill:'a -> x:'b * y:'c -> unit
Full name: Script.drawDot
val fill : 'a
val x : 'b
val y : 'c
val dot : obj
val drawDots : canvas:Graphic -> fill:'a -> positions:('b * 'c) list -> unit
Full name: Script.drawDots
val positions : ('b * 'c) list
val grp : obj
val addDot : ('d * 'e -> 'f)
val x : 'd
val y : 'e
Multiple items
module List
from Microsoft.FSharp.Collections
--------------------
type List<'T> =
| ( [] )
| ( :: ) of Head: 'T * Tail: 'T list
interface IEnumerable
interface IEnumerable<'T>
member Head : 'T
member IsEmpty : bool
member Item : index:int -> 'T with get
member Length : int
member Tail : 'T list
static member Cons : head:'T * tail:'T list -> 'T list
static member Empty : 'T list
Full name: Microsoft.FSharp.Collections.List<_>
val iter : action:('T -> unit) -> list:'T list -> unit
Full name: Microsoft.FSharp.Collections.List.iter
val shape : obj
Multiple items
namespace System.Data
--------------------
namespace Microsoft.FSharp.Data
val drawText : canvas:Graphic -> x:'a * y:'b -> text:'c -> unit
Full name: Script.drawText
val x : 'a
val y : 'b
val text : 'c
val tb : obj
namespace System.Text
val drawAxes : canvas:Graphic -> tickUnit:float -> unit
Full name: Script.drawAxes
val tickUnit : float
val darkGray : obj
val ticks : float list
val tickSize : float
val x : float
val y : float
val drawBitmap : canvas:Graphic -> colorFunc:(float * float -> 'a) -> unit
Full name: Script.drawBitmap
val colorFunc : (float * float -> 'a)
val getCoordinates : (float * float) list
val step : float
val p : float * float
val drawTestDot : canvas:Graphic -> fill:'a -> unit
Full name: Script.drawTestDot
val draw : unit -> 'a
Full name: Script.draw
type Console =
static member BackgroundColor : ConsoleColor with get, set
static member Beep : unit -> unit + 1 overload
static member BufferHeight : int with get, set
static member BufferWidth : int with get, set
static member CapsLock : bool
static member Clear : unit -> unit
static member CursorLeft : int with get, set
static member CursorSize : int with get, set
static member CursorTop : int with get, set
static member CursorVisible : bool with get, set
...
Full name: System.Console
val black : obj
val red : obj
val green : obj
val blue : obj
val brown : obj
More information