Skip to content

Commit bcf09ca

Browse files
juliohmCopilot
andauthored
Improvements to viz of 1D geometries and vectors (#1269)
* Implement viz for lines embedded in 2D space * Update ext/geometryset.jl Co-authored-by: Copilot <[email protected]> * Update ext/geometryset.jl Co-authored-by: Copilot <[email protected]> * Fix viz for Rays in 2D and 3D * Fix Vec visualization in 2D and 3D * Refactor recipe for Vec in terms of Ray recipe * Improve comments --------- Co-authored-by: Copilot <[email protected]>
1 parent 9bc075e commit bcf09ca

File tree

5 files changed

+72
-39
lines changed

5 files changed

+72
-39
lines changed

ext/MeshesMakieExt.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ include("mesh.jl")
5353
include("grid.jl")
5454
include("geometryset.jl")
5555
include("subdomain.jl")
56-
include("vector.jl")
5756
include("fallbacks.jl")
5857

5958
end

ext/fallbacks.jl

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,25 @@
22
# Licensed under the MIT License. See LICENSE in the project root.
33
# ------------------------------------------------------------------
44

5+
# generic fallback for geometry
56
Makie.plottype(::Geometry) = Viz{<:Tuple{Geometry}}
6-
Makie.plottype(::Domain) = Viz{<:Tuple{Domain}}
7-
Makie.plottype(::Vec) = Viz{<:Tuple{Vec}}
8-
Makie.plottype(::AbstractVector{<:Vec}) = Viz{<:Tuple{AbstractVector{<:Vec}}}
9-
107
Makie.convert_arguments(::Type{<:Viz}, geom::Geometry) = (GeometrySet([geom]),)
8+
9+
# generic fallback for domain
10+
Makie.plottype(::Domain) = Viz{<:Tuple{Domain}}
1111
Makie.convert_arguments(::Type{<:Viz}, domain::Domain) = (GeometrySet(collect(domain)),)
12-
Makie.convert_arguments(::Type{<:Viz}, vec::Vec) = ([vec],)
1312

14-
# skip conversion for these types
13+
# skip conversion and use specialized methods
1514
Makie.convert_arguments(::Type{<:Viz}, mesh::Mesh) = (mesh,)
1615
Makie.convert_arguments(::Type{<:Viz}, gset::GeometrySet) = (gset,)
1716
Makie.convert_arguments(::Type{<:Viz}, subdom::SubDomain) = (subdom,)
18-
Makie.convert_arguments(::Type{<:Viz}, vecs::AbstractVector{<:Vec}) = (vecs,)
1917

20-
# vector of geometries for convenience
18+
# vector of geometries (for convenience)
2119
Makie.plottype(::AbstractVector{<:Geometry}) = Viz{<:Tuple{AbstractVector{<:Geometry}}}
2220
Makie.convert_arguments(::Type{<:Viz}, geoms::AbstractVector{<:Geometry}) = (GeometrySet(geoms),)
21+
22+
# geometric vectors (for convenience)
23+
Makie.plottype(::Vec) = Viz{<:Tuple{Vec}}
24+
Makie.convert_arguments(::Type{<:Viz}, vec::Vec) = (GeometrySet([asray(vec)]),)
25+
Makie.plottype(::AbstractVector{<:Vec}) = Viz{<:Tuple{AbstractVector{<:Vec}}}
26+
Makie.convert_arguments(::Type{<:Viz}, vecs::AbstractVector{<:Vec}) = (GeometrySet(asray.(vecs)),)

ext/geometryset.jl

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,25 +38,77 @@ function vizgset!(plot, ::Type{<:𝔼}, ::Val{1}, ::Val, geoms, colorant)
3838
end
3939

4040
function vizgset!(plot, ::Type{<:𝔼}, ::Val{1}, ::Val, geoms::ObservableVector{<:Ray}, colorant)
41-
rset = plot[:object]
4241
segmentsize = plot[:segmentsize]
4342
showpoints = plot[:showpoints]
4443

45-
Dim = embeddim(rset[])
46-
47-
Dim (2, 3) || error("not implemented")
44+
Dim = embeddim(first(geoms[]))
4845

4946
# visualize as built-in arrows
5047
orig = Makie.@lift [asmakie(ray(0)) for ray in $geoms]
5148
dirs = Makie.@lift [asmakie(ray(1) - ray(0)) for ray in $geoms]
52-
size = Makie.@lift 0.1 * $segmentsize
53-
Makie.arrows!(plot, orig, dirs, color=colorant, arrowsize=size)
49+
if Dim == 2
50+
tipwidth = Makie.@lift 5 * $segmentsize
51+
shaftwidth = Makie.@lift 0.2 * $tipwidth
52+
Makie.arrows2d!(plot, orig, dirs, color=colorant, tipwidth=tipwidth, shaftwidth=shaftwidth)
53+
elseif Dim == 3
54+
tipradius = Makie.@lift 0.05 * $segmentsize
55+
shaftradius = Makie.@lift 0.5 * $tipradius
56+
Makie.arrows3d!(plot, orig, dirs, color=colorant, tipradius=tipradius, shaftradius=shaftradius)
57+
else
58+
error("not implemented")
59+
end
5460

5561
if showpoints[]
5662
vizfacets!(plot, geoms)
5763
end
5864
end
5965

66+
function vizgset!(plot, ::Type{<:𝔼}, ::Val{1}, ::Val{2}, geoms::ObservableVector{<:Line}, colorant)
67+
segmentsize = plot[:segmentsize]
68+
69+
# split vertical and non-vertical lines
70+
inter = Makie.@lift [line Line((0, 0), (0, 1)) for line in $geoms]
71+
vinds = Makie.@lift findall(isnothing, $inter)
72+
dinds = Makie.@lift setdiff(1:length($geoms), $vinds)
73+
74+
# split colors accordingly
75+
if colorant[] isa AbstractVector
76+
vcolor = Makie.@lift $colorant[$vinds]
77+
dcolor = Makie.@lift $colorant[$dinds]
78+
else
79+
vcolor = colorant
80+
dcolor = colorant
81+
end
82+
83+
# visualize vertical lines
84+
if !isempty(vinds[])
85+
vlines = Makie.@lift $geoms[$vinds]
86+
xcoord = Makie.@lift map($vlines) do vline
87+
c = coords(vline(0))
88+
x = convert(Cartesian, c).x
89+
ustrip(x)
90+
end
91+
Makie.vlines!(plot, xcoord, color=vcolor, linewidth=segmentsize)
92+
end
93+
94+
# visualize non-vertical lines
95+
if !isempty(dinds[])
96+
dlines = Makie.@lift $geoms[$dinds]
97+
dinter = Makie.@lift $inter[$dinds]
98+
ycoord = Makie.@lift map($dinter) do point
99+
c = coords(point)
100+
y = convert(Cartesian, c).y
101+
ustrip(y)
102+
end
103+
slopes = Makie.@lift map($dlines) do dline
104+
c1 = convert(Cartesian, coords(dline(0)))
105+
c2 = convert(Cartesian, coords(dline(1)))
106+
(c2.y - c1.y) / (c2.x - c1.x)
107+
end
108+
Makie.ablines!(plot, ycoord, slopes, color=dcolor, linewidth=segmentsize)
109+
end
110+
end
111+
60112
function vizgset!(plot, ::Type{<:𝔼}, ::Val{2}, ::Val, geoms, colorant)
61113
showsegments = plot[:showsegments]
62114

ext/utils.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ function vizmany!(plot, objs, color)
2828
viz!(plot, object, color=colors, alpha=alphas, colormap=colormap, pointsize=pointsize, segmentsize=segmentsize)
2929
end
3030

31+
asray(vec::Vec{Dim,ℒ}) where {Dim,ℒ} = Ray(Point(ntuple(i -> zero(ℒ), Dim)), vec)
32+
3133
asmakie(geoms::AbstractVector{<:Geometry}) = asmakie.(geoms)
3234

3335
asmakie(multis::AbstractVector{<:Multi}) = mapreduce(m -> asmakie.(parent(m)), vcat, multis)

ext/vector.jl

Lines changed: 0 additions & 24 deletions
This file was deleted.

0 commit comments

Comments
 (0)