Skip to content

Commit d684076

Browse files
committed
Add camera object abstraction
1 parent f7e9ba2 commit d684076

File tree

3 files changed

+206
-0
lines changed

3 files changed

+206
-0
lines changed

src/Plotly.NET/CommonAbstractions/StyleParams.fs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,19 @@ module StyleParam =
366366
override this.ToString() = this |> ConstraintOperation.toString
367367
member this.Convert() = this |> ConstraintOperation.convert
368368

369+
[<RequireQualifiedAccess>]
370+
type CameraProjection =
371+
| Perspective
372+
| Orthographic
373+
374+
static member toString = function
375+
| Perspective -> "perspective"
376+
| Orthographic -> "orthographic"
377+
378+
static member convert = CameraProjection.toString >> box
379+
override this.ToString() = this |> CameraProjection.toString
380+
member this.Convert() = this |> CameraProjection.convert
381+
369382
[<RequireQualifiedAccess>]
370383
type ContourType =
371384
| Levels

src/Plotly.NET/Layout/ObjectAbstractions/3D/Camera.fs

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,139 @@ open DynamicObj
55
open System
66
open System.Runtime.InteropServices
77

8+
9+
10+
type CameraCenter() =
11+
inherit DynamicObj ()
12+
13+
static member init
14+
(
15+
[<Optional;DefaultParameterValue(null)>] ?X: float,
16+
[<Optional;DefaultParameterValue(null)>] ?Y: float,
17+
[<Optional;DefaultParameterValue(null)>] ?Z: float
18+
19+
20+
) =
21+
CameraCenter()
22+
|> CameraCenter.style (
23+
?X = X,
24+
?Y = Y,
25+
?Z = Z
26+
)
27+
28+
static member style
29+
(
30+
[<Optional;DefaultParameterValue(null)>] ?X: float,
31+
[<Optional;DefaultParameterValue(null)>] ?Y: float,
32+
[<Optional;DefaultParameterValue(null)>] ?Z: float
33+
) =
34+
35+
fun (cameraCenter: CameraCenter) ->
36+
37+
X |> DynObj.setValueOpt cameraCenter "x"
38+
Y |> DynObj.setValueOpt cameraCenter "y"
39+
Z |> DynObj.setValueOpt cameraCenter "z"
40+
41+
cameraCenter
42+
43+
type CameraEye() =
44+
inherit DynamicObj ()
45+
46+
static member init
47+
(
48+
[<Optional;DefaultParameterValue(null)>] ?X: float,
49+
[<Optional;DefaultParameterValue(null)>] ?Y: float,
50+
[<Optional;DefaultParameterValue(null)>] ?Z: float
51+
52+
53+
) =
54+
CameraEye()
55+
|> CameraEye.style (
56+
?X = X,
57+
?Y = Y,
58+
?Z = Z
59+
)
60+
61+
static member style
62+
(
63+
[<Optional;DefaultParameterValue(null)>] ?X: float,
64+
[<Optional;DefaultParameterValue(null)>] ?Y: float,
65+
[<Optional;DefaultParameterValue(null)>] ?Z: float
66+
) =
67+
68+
fun (cameraEye: CameraEye) ->
69+
70+
X |> DynObj.setValueOpt cameraEye "x"
71+
Y |> DynObj.setValueOpt cameraEye "y"
72+
Z |> DynObj.setValueOpt cameraEye "z"
73+
74+
cameraEye
75+
76+
type CameraUp() =
77+
inherit DynamicObj ()
78+
79+
static member init
80+
(
81+
[<Optional;DefaultParameterValue(null)>] ?X: float,
82+
[<Optional;DefaultParameterValue(null)>] ?Y: float,
83+
[<Optional;DefaultParameterValue(null)>] ?Z: float
84+
85+
86+
) =
87+
CameraUp()
88+
|> CameraUp.style (
89+
?X = X,
90+
?Y = Y,
91+
?Z = Z
92+
)
93+
94+
static member style
95+
(
96+
[<Optional;DefaultParameterValue(null)>] ?X: float,
97+
[<Optional;DefaultParameterValue(null)>] ?Y: float,
98+
[<Optional;DefaultParameterValue(null)>] ?Z: float
99+
) =
100+
101+
fun (cameraUp: CameraUp) ->
102+
103+
X |> DynObj.setValueOpt cameraUp "x"
104+
Y |> DynObj.setValueOpt cameraUp "y"
105+
Z |> DynObj.setValueOpt cameraUp "z"
106+
107+
cameraUp
108+
8109
type Camera() =
9110
inherit DynamicObj ()
111+
112+
static member init
113+
(
114+
[<Optional;DefaultParameterValue(null)>] ?Center : CameraCenter,
115+
[<Optional;DefaultParameterValue(null)>] ?Eye : CameraEye,
116+
[<Optional;DefaultParameterValue(null)>] ?Projection : StyleParam.CameraProjection,
117+
[<Optional;DefaultParameterValue(null)>] ?Up : CameraUp
118+
119+
) =
120+
Camera()
121+
|> Camera.style (
122+
?Center = Center ,
123+
?Eye = Eye ,
124+
?Projection = Projection,
125+
?Up = Up
126+
)
127+
128+
static member style
129+
(
130+
[<Optional;DefaultParameterValue(null)>] ?Center : CameraCenter,
131+
[<Optional;DefaultParameterValue(null)>] ?Eye : CameraEye,
132+
[<Optional;DefaultParameterValue(null)>] ?Projection : StyleParam.CameraProjection,
133+
[<Optional;DefaultParameterValue(null)>] ?Up : CameraUp
134+
) =
135+
136+
fun (camera: Camera) ->
137+
138+
Center |> DynObj.setValueOpt camera "center"
139+
Eye |> DynObj.setValueOpt camera "eye"
140+
Projection |> DynObj.setValueOptBy camera "projection" StyleParam.CameraProjection.convert
141+
Up |> DynObj.setValueOpt camera "up"
142+
143+
camera

src/Plotly.NET/Playground.fsx

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,65 @@ open Plotly.NET
183183
open FSharp.Data
184184
open Deedle
185185

186+
//---------------------- Generate linearly spaced vector ----------------------
187+
let linspace (min,max,n) =
188+
if n <= 2 then failwithf "n needs to be larger then 2"
189+
let bw = float (max - min) / (float n - 1.)
190+
Array.init n (fun i -> min + (bw * float i))
191+
//[|min ..bw ..max|]
192+
193+
//---------------------- Create example data ----------------------
194+
let size = 100
195+
let x = linspace(-2. * Math.PI, 2. * Math.PI, size)
196+
let y = linspace(-2. * Math.PI, 2. * Math.PI, size)
197+
198+
let f x y = - (5. * x / (x**2. + y**2. + 1.) )
199+
200+
let z =
201+
Array.init size (fun i ->
202+
Array.init size (fun j ->
203+
f x.[j] y.[i]
204+
)
205+
)
206+
207+
let rnd = System.Random()
208+
let a = Array.init 50 (fun _ -> rnd.NextDouble())
209+
let b = Array.init 50 (fun _ -> rnd.NextDouble())
210+
let c = Array.init 50 (fun _ -> rnd.NextDouble())
211+
212+
open Plotly.NET.TraceObjects
213+
214+
[
215+
Chart.Line3D(
216+
[1,2,3; 4,5,6],
217+
UseDefaults = false
218+
)
219+
220+
221+
Chart.Line3D(
222+
[1,2,3; 4,5,6],
223+
UseDefaults = false
224+
)
225+
226+
]
227+
|> Chart.Grid(2,1)
228+
|> Chart.withScene(
229+
Scene.init(
230+
Camera = Camera.init(
231+
Projection = StyleParam.CameraProjection.Perspective
232+
)
233+
), StyleParam.SubPlotId.Scene 1
234+
)
235+
|> Chart.withScene(
236+
Scene.init(
237+
Camera = Camera.init(
238+
Projection = StyleParam.CameraProjection.Orthographic
239+
)
240+
), StyleParam.SubPlotId.Scene 2
241+
)
242+
|> Chart.withSize (1000,1000)
243+
|> Chart.show
244+
186245
Chart.Bubble3D(
187246
[for i in 0..10 do yield (i,i,i)],
188247
[0 .. 10 .. 100],

0 commit comments

Comments
 (0)