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));
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
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
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
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
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