#include "fiko_test.hpp" #include "fiko/geometri/brep.hpp" #include #include using namespace fiko; using namespace fiko::geometri; // kalinlikRapor - govde-capinda per-yuz duvar/et kalinligi (isin tabanli, // tessellation YOK). undercutRapor'un adaptif-izgara/tek-Load iskeletini // paylasir; farkli olan sadece biriktirilen deger (gorunurluk yerine mesafe). namespace { const KalinlikYuz* bul(const std::vector& r, u32 ord) { for (const auto& k : r) if (k.ordinal == ord) return &k; return nullptr; } // Verilen yerel-normale en yakin normale sahip DUZ yuzun ordinali. u32 normalYuz(const BrepGovde& g, Vec3d n) { YuzBilgi yb; for (u32 o = 1; g.yuzBilgi(o, yb, false); ++o) { if (!yb.duzlemMi) continue; const f64 d = yb.normal.x * n.x + yb.normal.y * n.y + yb.normal.z * n.z; if (d > 0.99) return o; } return 0; } } // namespace // Duz kutu: her yuzun kalinligi KARSI boyuta esit olmali (tam duz, tek // parca govde - isin karsi duvara TAM oteki yuzeyde carpar). FIKO_TEST(kalinlik_kutu_boyutlari) { // genislik(X)=10, derinlik(Y)=6, yukseklik(Z)=4. const BrepGovde g = kutu(10, 6, 4); FIKO_KONTROL(g.gecerliMi()); const auto r = kalinlikRapor(g, 0.5); FIKO_KONTROL(r.size() == 6); // kutu = 6 yuz for (const Vec3d n : {Vec3d{1, 0, 0}, Vec3d{-1, 0, 0}}) { const u32 o = normalYuz(g, n); FIKO_KONTROL(o != 0); const KalinlikYuz* k = bul(r, o); FIKO_KONTROL(k && k->gecerli); if (k && k->gecerli) { FIKO_YAKIN(k->ortKalinlik, 10.0, 1e-2); FIKO_YAKIN(k->minKalinlik, 10.0, 1e-2); } } for (const Vec3d n : {Vec3d{0, 1, 0}, Vec3d{0, -1, 0}}) { const u32 o = normalYuz(g, n); FIKO_KONTROL(o != 0); const KalinlikYuz* k = bul(r, o); FIKO_KONTROL(k && k->gecerli); if (k && k->gecerli) FIKO_YAKIN(k->ortKalinlik, 6.0, 1e-2); } for (const Vec3d n : {Vec3d{0, 0, 1}, Vec3d{0, 0, -1}}) { const u32 o = normalYuz(g, n); FIKO_KONTROL(o != 0); const KalinlikYuz* k = bul(r, o); FIKO_KONTROL(k && k->gecerli); if (k && k->gecerli) FIKO_YAKIN(k->ortKalinlik, 4.0, 1e-2); } } // Ic bosluklu kabuk: dis kutu - ic kutu (merkezlenmis) -> HER duvar 2mm. // Gercek "et kalinligi" senaryosu: govde capinda TEK Load'dan 12 yuzun // TAMAMI tutarli olculmeli (disariya HIC deginmeyen bir kaviteye karsi). FIKO_TEST(kalinlik_ic_bosluklu_kabuk_iki_mm) { const BrepGovde dis = kutu(20, 20, 20); const BrepGovde ic = kutu(16, 16, 16); // her eksende 2mm pay (merkezlenmis) const BrepGovde kabuk = cikarma(dis, ic); FIKO_KONTROL(kabuk.gecerliMi()); const auto r = kalinlikRapor(kabuk, 0.5); FIKO_KONTROL(r.size() == 12); // 6 dis + 6 ic (kavite) yuzu u32 gecerliSay = 0; for (const auto& k : r) { if (!k.gecerli) continue; ++gecerliSay; FIKO_YAKIN(k.ortKalinlik, 2.0, 5e-2); FIKO_YAKIN(k.minKalinlik, 2.0, 5e-2); FIKO_KONTROL(k.ornekSayisi > 0); } FIKO_KONTROL(gecerliSay == 12); } // Gecersiz govde -> bos rapor (cokme YOK). FIKO_TEST(kalinlik_gecersiz_govde_bos_rapor) { const BrepGovde bos; // varsayilan kurucu -> gecerliMi()==false varsayilir const auto r = kalinlikRapor(bos, 0.5); FIKO_KONTROL(r.empty()); }