mirror of
https://github.com/3b1b/manim.git
synced 2025-08-05 16:49:03 +00:00
DotCloud improvements
This commit is contained in:
parent
65f4f4bd29
commit
f13c41bcbb
1 changed files with 18 additions and 6 deletions
|
@ -1,6 +1,5 @@
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import moderngl
|
import moderngl
|
||||||
import numbers
|
|
||||||
|
|
||||||
from manimlib.constants import GREY_C
|
from manimlib.constants import GREY_C
|
||||||
from manimlib.mobject.types.point_cloud_mobject import PMobject
|
from manimlib.mobject.types.point_cloud_mobject import PMobject
|
||||||
|
@ -16,7 +15,7 @@ class DotCloud(PMobject):
|
||||||
CONFIG = {
|
CONFIG = {
|
||||||
"color": GREY_C,
|
"color": GREY_C,
|
||||||
"opacity": 1,
|
"opacity": 1,
|
||||||
"radii": DEFAULT_DOT_CLOUD_RADIUS,
|
"radius": DEFAULT_DOT_CLOUD_RADIUS,
|
||||||
"shader_folder": "true_dot",
|
"shader_folder": "true_dot",
|
||||||
"render_primitive": moderngl.POINTS,
|
"render_primitive": moderngl.POINTS,
|
||||||
"shader_dtype": [
|
"shader_dtype": [
|
||||||
|
@ -34,7 +33,7 @@ class DotCloud(PMobject):
|
||||||
def init_data(self):
|
def init_data(self):
|
||||||
super().init_data()
|
super().init_data()
|
||||||
self.data["radii"] = np.zeros((1, 1))
|
self.data["radii"] = np.zeros((1, 1))
|
||||||
self.set_radii(self.radii)
|
self.set_radius(self.radius)
|
||||||
|
|
||||||
def to_grid(self, n_rows, n_cols, n_layers=1,
|
def to_grid(self, n_rows, n_cols, n_layers=1,
|
||||||
buff_ratio=None,
|
buff_ratio=None,
|
||||||
|
@ -58,25 +57,38 @@ class DotCloud(PMobject):
|
||||||
radius = self.get_radius()
|
radius = self.get_radius()
|
||||||
ns = [n_cols, n_rows, n_layers]
|
ns = [n_cols, n_rows, n_layers]
|
||||||
brs = [h_buff_ratio, v_buff_ratio, d_buff_ratio]
|
brs = [h_buff_ratio, v_buff_ratio, d_buff_ratio]
|
||||||
|
self.set_radius(0)
|
||||||
for n, br, dim in zip(ns, brs, range(3)):
|
for n, br, dim in zip(ns, brs, range(3)):
|
||||||
self.rescale_to_fit(2 * radius * (1 + br) * (n - 1), dim, stretch=True)
|
self.rescale_to_fit(2 * radius * (1 + br) * (n - 1), dim, stretch=True)
|
||||||
|
self.set_radius(radius)
|
||||||
if height is not None:
|
if height is not None:
|
||||||
self.set_height(height)
|
self.set_height(height)
|
||||||
self.center()
|
self.center()
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def set_radii(self, radii):
|
def set_radii(self, radii):
|
||||||
if not isinstance(radii, numbers.Number):
|
self.data["radii"][:] = resize_preserving_order(radii, len(self.data["radii"]))
|
||||||
radii = resize_preserving_order(radii, len(self.data["radii"]))
|
self.refresh_bounding_box()
|
||||||
self.data["radii"][:] = radii
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def get_radii(self):
|
def get_radii(self):
|
||||||
return self.data["radii"]
|
return self.data["radii"]
|
||||||
|
|
||||||
|
def set_radius(self, radius):
|
||||||
|
self.data["radii"][:] = radius
|
||||||
|
self.refresh_bounding_box()
|
||||||
|
return self
|
||||||
|
|
||||||
def get_radius(self):
|
def get_radius(self):
|
||||||
return self.get_radii().max()
|
return self.get_radii().max()
|
||||||
|
|
||||||
|
def compute_bounding_box(self):
|
||||||
|
bb = super().compute_bounding_box()
|
||||||
|
radius = self.get_radius()
|
||||||
|
bb[0] += np.full((3,), -radius)
|
||||||
|
bb[2] += np.full((3,), radius)
|
||||||
|
return bb
|
||||||
|
|
||||||
def scale(self, scale_factor, scale_radii=True, **kwargs):
|
def scale(self, scale_factor, scale_radii=True, **kwargs):
|
||||||
super().scale(scale_factor, **kwargs)
|
super().scale(scale_factor, **kwargs)
|
||||||
if scale_radii:
|
if scale_radii:
|
||||||
|
|
Loading…
Add table
Reference in a new issue