Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
Slic3r::EdgeGrid Namespace Reference

Classes

class  Contour
 
class  Grid
 

Functions

void save_png (const Grid &grid, const BoundingBox &bbox, coord_t resolution, const char *path, size_t scale=1)
 

Function Documentation

◆ save_png()

void Slic3r::EdgeGrid::save_png ( const Grid grid,
const BoundingBox bbox,
coord_t  resolution,
const char *  path,
size_t  scale = 1 
)
1480{
1481 coord_t w = (bbox.max(0) - bbox.min(0) + resolution - 1) / resolution;
1482 coord_t h = (bbox.max(1) - bbox.min(1) + resolution - 1) / resolution;
1483
1484 std::vector<uint8_t> pixels(w * h * 3, 0);
1485
1486 const coord_t search_radius = grid.resolution() * 2;
1487 const coord_t display_blend_radius = grid.resolution() * 2;
1488 for (coord_t r = 0; r < h; ++r) {
1489 for (coord_t c = 0; c < w; ++ c) {
1490 unsigned char *pxl = pixels.data() + (((h - r - 1) * w) + c) * 3;
1491 Point pt(c * resolution + bbox.min(0), r * resolution + bbox.min(1));
1492 coordf_t min_dist;
1493 bool on_segment = true;
1494 #if 0
1495 if (grid.signed_distance_edges(pt, search_radius, min_dist, &on_segment)) {
1496 #else
1497 if (grid.signed_distance(pt, search_radius, min_dist)) {
1498 #endif
1499 float s = 255 * std::abs(min_dist) / float(display_blend_radius);
1500 int is = std::max(0, std::min(255, int(floor(s + 0.5f))));
1501 if (min_dist < 0) {
1502 if (on_segment) {
1503 pxl[0] = 255;
1504 pxl[1] = 255 - is;
1505 pxl[2] = 255 - is;
1506 } else {
1507 pxl[0] = 255;
1508 pxl[1] = 0;
1509 pxl[2] = 255 - is;
1510 }
1511 }
1512 else {
1513 if (on_segment) {
1514 pxl[0] = 255 - is;
1515 pxl[1] = 255 - is;
1516 pxl[2] = 255;
1517 } else {
1518 pxl[0] = 255 - is;
1519 pxl[1] = 0;
1520 pxl[2] = 255;
1521 }
1522 }
1523 } else {
1524 pxl[0] = 0;
1525 pxl[1] = 255;
1526 pxl[2] = 0;
1527 }
1528
1529 float gridx = float(pt(0) - grid.bbox().min(0)) / float(grid.resolution());
1530 float gridy = float(pt(1) - grid.bbox().min(1)) / float(grid.resolution());
1531 if (gridx >= -0.4f && gridy >= -0.4f && gridx <= grid.cols() + 0.4f && gridy <= grid.rows() + 0.4f) {
1532 int ix = int(floor(gridx + 0.5f));
1533 int iy = int(floor(gridy + 0.5f));
1534 float dx = gridx - float(ix);
1535 float dy = gridy - float(iy);
1536 float d = sqrt(dx*dx + dy*dy) * float(grid.resolution()) / float(resolution);
1537 if (d < 1.f) {
1538 // Less than 1 pixel from the grid point.
1539 float t = 0.5f + 0.5f * d;
1540 pxl[0] = (unsigned char)(t * pxl[0]);
1541 pxl[1] = (unsigned char)(t * pxl[1]);
1542 pxl[2] = (unsigned char)(t * pxl[2]);
1543 }
1544 }
1545
1546 float dgrid = fabs(min_dist) / float(grid.resolution());
1547 float igrid = floor(dgrid + 0.5f);
1548 dgrid = std::abs(dgrid - igrid) * float(grid.resolution()) / float(resolution);
1549 if (dgrid < 1.f) {
1550 // Less than 1 pixel from the grid point.
1551 float t = 0.5f + 0.5f * dgrid;
1552 pxl[0] = (unsigned char)(t * pxl[0]);
1553 pxl[1] = (unsigned char)(t * pxl[1]);
1554 pxl[2] = (unsigned char)(t * pxl[2]);
1555 if (igrid > 0.f) {
1556 // Other than zero iso contour.
1557 int g = pxl[1] + 255.f * (1.f - t);
1558 pxl[1] = std::min(g, 255);
1559 }
1560 }
1561 }
1562 }
1563
1564 png::write_rgb_to_file_scaled(path, w, h, pixels, scale);
1565}
EIGEN_DEVICE_FUNC const FloorReturnType floor() const
Definition ArrayCwiseUnaryOps.h:388
EIGEN_DEVICE_FUNC const SqrtReturnType sqrt() const
Definition ArrayCwiseUnaryOps.h:152
int scale(const int val)
Definition WipeTowerDialog.cpp:14
PointType max
Definition BoundingBox.hpp:17
PointType min
Definition BoundingBox.hpp:16
Definition Point.hpp:158
int32_t coord_t
Definition libslic3r.h:39
double coordf_t
Definition GUI_ObjectList.hpp:36
IGL_INLINE void grid(const Eigen::MatrixBase< Derivedres > &res, Eigen::PlainObjectBase< DerivedGV > &GV)
Definition grid.cpp:13

References floor(), Slic3r::grid(), Slic3r::BoundingBoxBase< PointType, APointsType >::max, Slic3r::BoundingBoxBase< PointType, APointsType >::min, scale(), sqrt(), and Slic3r::png::write_rgb_to_file_scaled().

+ Here is the call graph for this function: