Grafik berbobot bercahaya (jaringan): simpul dan tepi
Saya mencoba menemukan cara (sederhana yang diinginkan dan kinerja / kecepatan dioptimalkan untuk grafik yang lebih besar) untuk melakukan hal berikut:
Menggayai simpul grafik dengan efek cahaya dan intensitasnya bergantung pada
VertexWeight
Menggayai tepi grafik dengan efek cahaya dan intensitasnya bergantung pada
EdgeWeight
DirectedEdge
gaya efek cahaya juga diinginkan (sementara untuk kesederhanaan hal-hal dapat dimulai dariUndirectedEdge
)
Misalnya untuk sesuatu seperti ini:
RandomGraph[{20,100},
VertexWeight->RandomReal[1,20],
EdgeWeight->RandomReal[1,100],
Background->Black,
BaseStyle->White]
Saya mencari visual yang mirip dengan yang di bawah ini, kecuali tepinya perlu bersinar juga:

Masalah yang saya alami.
1. Penerapan sederhana dari pendar yang menakjubkan
Saya telah melihat berbagai efek cahaya (termasuk INI tentang titik bercahaya) tetapi bukan ahli dalam ide visual vs kinerja terbaik. Anehnya juga saya belum melihat banyak tentang garis bercahaya di sekitar. Saya akan secara naif memulai dengan sesuatu seperti ini, tetapi itu mungkin dapat ditingkatkan secara visual dan kinerja:
bsc=BSplineCurve[{{0,0},{1,1},{2,0}}];
Graphics[
Table[{White,Opacity[1/k^1.2],Thickness[.005k],CapForm["Round"],bsc},{k,20}],
Background->Black]

2. Meneruskan beban untuk bersinar
Sementara saya sadar VertexShapeFunction
dan EdgeShapeFunction
, saya tidak begitu yakin bagaimana menyampaikan bobot secara optimal kepada mereka ... dan apakah properti ini adalah pendekatan yang tepat.
Bersinar dalam fungsi bawaan
Saya perhatikan bahwa fungsi-fungsi ini menghasilkan cahaya:
ComplexPlot[z^2+1,{z,-2-2I,2+2I},ColorFunction->"CyclicReImLogAbs"]

Dan seperti yang diperhatikan oleh @EC dalam jawabannya di bawah ini seperti
ImageAdjust[DistanceTransform[Graphics[Point[RandomReal[1,{100,2}]]]]]

Terima kasih, bantuan Anda sangat dihargai!
Jawaban
Anda bisa mendapatkan efek cahaya keseluruhan ImageAdd
dengan salinan buram dari image mask. Memang ini agak mendasar, tetapi efeknya menarik. Saya memilih untuk membuat jaringan 'otak' menggunakan AnatomyData
dan NearestNeighbourGraph
membuatnya terlihat seperti pemasaran AI yang terlalu hip:
SeedRandom[123];
brain = AnatomyData[Entity["AnatomicalStructure", "Brain"], "MeshRegion"];
boundary = RegionBoundary[brain];
nng = NearestNeighborGraph[RandomPoint[boundary, 1000], 7];
brainnetimg = Rasterize[
GraphPlot3D[nng, ViewPoint -> Left,
VertexStyle -> Directive[AbsolutePointSize[7], White],
EdgeStyle -> Directive[AbsoluteThickness[2], White],
Background -> Black]
, ImageSize -> 1000];
ImageAdd[ImageAdjust[Blur[Binarize@brainnetimg, 7], .1],
ImageMultiply[brainnetimg,
LinearGradientImage[{Blue, Cyan, Purple},
ImageDimensions[brainnetimg]]]]
Untuk mendapatkan bobot yang mempengaruhi ukuran cahaya, Anda mungkin perlu menggunakan EdgeShapeFunction
dan VertexShapeFunction
. Saya membuat tekstur billboard dari efek lensa dengan alfa dan saya menggunakan gambar ini untuk simpul:
Saya juga menggunakan efek cahaya tepi yang Anda sebutkan dalam pertanyaan yang menyusun garis. Tepi dengan bobot lebih besar seharusnya memiliki lebih banyak cahaya, dan simpul dengan bobot lebih besar akan memiliki suar yang lebih besar:
SeedRandom[123];
G = SpatialGraphDistribution[100, 0.20];
g = RandomGraph[G];
glowtexture = Import["lensbb.png"];
edgeWeights = RandomReal[1, EdgeCount[g]];
vertexWeights = RandomReal[1, VertexCount[g]];
edgeShapeFunc =
With[{weight = AnnotationValue[{g, #2}, EdgeWeight]},
Table[{RGBColor[0.7, 1.0, 0.9], Opacity[1/k^1.3],
Thickness[.001 k*weight], CapForm["Round"], Line[#1]}, {k, 20}]] &;
vertexShapeFunc =
With[{weight = AnnotationValue[{g, #2}, VertexWeight]},
Inset[glowtexture, #1, Center, weight*0.3]] &;
g = Graph[g, EdgeWeight -> edgeWeights, VertexWeight -> vertexWeights,
VertexShapeFunction -> vertexShapeFunc, Background -> Black,
EdgeShapeFunction -> edgeShapeFunc, PlotRangePadding -> .1]
Daripada menggunakan trik penumpukan garis / opasitas di atas untuk menghasilkan tepi yang bercahaya, Anda juga dapat menggunakan poligon bertekstur. Ini lebih cepat tetapi kerugiannya adalah ketika ujung-ujungnya menjadi terlalu tebal tutupnya terlihat dan jelek:
g = Graph[UndirectedEdge @@@ {{1, 2}, {2, 3}, {3, 1}}];
edgeWeights = {1, 2, 3}/6.;
vertexWeights = {1, 2, 3}/6.;
glowtexture = Import["lensbb.png"];
edgegradimg = LinearGradientImage[{Transparent,Cyan,Transparent}, {64,64}];
edgeShapeFunc =
Module[{weight = AnnotationValue[{g, #2}, EdgeWeight], s = 1/10.,
vec = #1[[2]] - #1[[1]], perp},
perp = Cross[vec];
{Texture[edgegradimg],
Polygon[{
#1[[1]]-perp*weight*s,
#1[[1]]+perp*weight*s,
#1[[2]]+perp*weight*s,
#1[[2]]-perp*weight*s
}, VertexTextureCoordinates -> {{0,0},{1,0},{1,1},{0,1}}]
}] &;
vertexShapeFunc =
With[{weight = AnnotationValue[{g, #2}, VertexWeight]},
Inset[glowtexture, #1, Center, weight*3]] &;
g = Graph[g, EdgeWeight -> edgeWeights, VertexWeight -> vertexWeights,
VertexShapeFunction -> vertexShapeFunc, Background -> Black,
EdgeShapeFunction -> edgeShapeFunc, PlotRangePadding -> .5]

DistanceTransform
memberi kita peta jarak dari tipe yang kita butuhkan untuk cahaya.
Pertama kita tentukan sumber cahaya:
bg = ConstantImage[White, 200];
line = HighlightImage[
bg, {
Black,
Thick,
Line[{{50, 100}, {150, 100}}]
}]

Selanjutnya, kami menghitung transformasi jarak. Kami menskalakannya sedemikian rupa sehingga 1 pada gambar yang dihasilkan sesuai dengan diagonal gambar.
glow = ColorNegate@Image[Divide[
ImageData@DistanceTransform[line],
200 Sqrt[2]
]^0.2]

Angka 0,2 mengontrol seberapa cepat pijar mati.
Selanjutnya, kita dapat menerapkan warna pada cahaya:
glow ConstantImage[Red, 200]

Dan kita bahkan bisa menerapkan fungsi warna:
ImageApply[List @@ ColorData["AvocadoColors", #] &, glow]

Membuat fungsi warna yang bagus akan menjadi kunci untuk membuat kilau yang bagus seperti yang ada di contoh Anda.
Membuat grafik bercahaya cukup mudah menggunakan teknik ini. Setiap sisi adalah sebuah garis dan setiap simpul adalah sebuah titik atau piringan. Pada akhirnya, kita bisa menggabungkannya menjadi satu gambar.
Saya akan menyerahkannya kepada pembaca untuk membuat fungsi yang kuat untuk ini. Saya hanya akan membuat contoh kecil.
Kami akan menggunakan grafik Pappus sebagai contoh:
embedding = First@GraphData["PappusGraph", "Embeddings"];
coords = List @@@ GraphData["PappusGraph", "Edges"] /. Thread[
Range[Length[embedding]] -> embedding
];
Graphics[{
Point[embedding],
Line[coords]
}]

Menggambarnya ke gambar alih-alih dalam grafik membutuhkan penskalaan ulang koordinat:
toImageCoordinates[{x_, y_}] := {
Rescale[x, {-1, 1}, {0, 200}],
Rescale[y, {-1, 1}, {0, 200}]
}
primitives = Join[
Point@*toImageCoordinates /@ embedding,
Line@*toImageCoordinates /@ coords
];
Fungsi ini akan menggambar primitif apa pun dengan cahaya:
draw[primitive_, size_, glow_] := Module[{bg, img},
bg = ConstantImage[White, 200];
img = HighlightImage[bg, {
Black,
PointSize[Large],
Thick,
primitive
}];
ColorNegate@Image[Divide[
ImageData@DistanceTransform[img],
size Sqrt[2]
]^glow]
]
draw[First@primitives, 200, 0.2]

Sekarang rencananya adalah memetakan fungsi ini di semua primitif.
images = draw[#, 200, 0.2] & /@ primitives;
ImageAdd @@ images // ImageAdjust

Jelas dari sini bahwa tepi dan titik dapat memiliki jumlah cahaya yang berbeda. Karena keterbatasan waktu, saya tidak akan membuat fungsi yang menggabungkan semua ini menjadi fungsi "grafik bercahaya", tetapi saya meninggalkan ini di sini sebagai pendekatan yang mungkin untuk memecahkan masalah ini.