geopro/tests/spike/render_verify.cpp

81 lines
3.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 离屏渲染验证:把真实数据渲成 PNG肉眼核对方向/2D-3D 差异(不靠"进程活着"自欺)。
// 产出(D:/dev/spike_data/):
// verify_section.png —— 平面反演剖面(#18, 数据详情),应浅部在上、深部在下
// verify_curtain_top.png —— 帘面俯视(二维),应看到一条沿测线的带(像地图线)
// verify_curtain_3d.png —— 帘面透视(三维),应看到立着的彩色断面墙
#include <fstream>
#include <sstream>
#include <string>
#include <numeric>
#include <vtkActor.h>
#include <vtkNew.h>
#include <vtkPNGWriter.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkWindowToImageFilter.h>
#include "parse/SampleParsers.hpp"
#include "geo/GeoLocalFrame.hpp"
#include "actors/GridContourActor.hpp"
#include "actors/CurtainActor.hpp"
#include "ColorLutBuilder.hpp"
#include "CameraPreset.hpp"
static std::string slurp(const char* p) {
std::ifstream f(p);
std::stringstream s; s << f.rdbuf(); return s.str();
}
static void renderToPng(vtkRenderer* ren, const char* path, int w, int h) {
vtkNew<vtkRenderWindow> rw;
rw->SetOffScreenRendering(1);
rw->AddRenderer(ren);
rw->SetSize(w, h);
rw->Render();
vtkNew<vtkWindowToImageFilter> w2i; w2i->SetInput(rw);
vtkNew<vtkPNGWriter> png; png->SetFileName(path);
png->SetInputConnection(w2i->GetOutputPort()); png->Write();
}
int main() {
using namespace geopro;
const std::string dir = "D:/dev/spike_data/";
core::Grid g = data::parseGrid(slurp((dir + "grid.json").c_str()));
core::ColorScale cs = data::parseColorScale(slurp((dir + "colorbar.json").c_str()));
// 1) 平面剖面 (#18) — 俯视看 XY 平面(face-on)
{
auto a = render::buildGridContour(g, cs);
vtkNew<vtkRenderer> ren; ren->SetBackground(1, 1, 1);
if (a.bands) ren->AddActor(a.bands);
if (a.edges) ren->AddActor(a.edges);
render::applyTop2D(ren);
renderToPng(ren, (dir + "verify_section.png").c_str(), 1100, 320);
}
// GeoLocalFrame原点取 lat/lon 均值
double lat0 = std::accumulate(g.lat.begin(), g.lat.end(), 0.0) / (g.lat.empty() ? 1 : g.lat.size());
double lon0 = std::accumulate(g.lon.begin(), g.lon.end(), 0.0) / (g.lon.empty() ? 1 : g.lon.size());
core::GeoLocalFrame frame(lat0, lon0);
// 2) 帘面俯视(二维)
{
auto a = render::buildCurtain(g, cs, frame);
vtkNew<vtkRenderer> ren; ren->SetBackground(1, 1, 1);
ren->AddActor(a);
render::applyTop2D(ren);
renderToPng(ren, (dir + "verify_curtain_top.png").c_str(), 700, 500);
}
// 3) 帘面透视(三维)
{
auto a = render::buildCurtain(g, cs, frame);
vtkNew<vtkRenderer> ren; ren->SetBackground(1, 1, 1);
ren->AddActor(a);
render::applyFree3D(ren);
renderToPng(ren, (dir + "verify_curtain_3d.png").c_str(), 700, 500);
}
std::printf("RENDER_VERIFY_DONE grid=%dx%d lat0=%.5f lon0=%.5f\n", g.nx(), g.ny(), lat0, lon0);
return 0;
}