// GEÇİCİ TEŞHİS (Fikri yetkilendirdi 07-19): gerçek APT dosyasıyla 3 CPU motorun // oyup oymadığını ÖLÇ. GUI/tahmin yok — sim'in carve mantığını birebir çalıştırır. #include #include #include #include "fiko/cam/apt.hpp" #include "fiko/cam/part_operasyon.hpp" #include "fiko/cam/takim.hpp" #include "fiko/cam/takim_yolu.hpp" #include "fiko/kutuk/kutuk_motor.hpp" #include "fiko_test.hpp" using namespace fiko; using namespace fiko::kutuk; namespace { enum class Tur { Isleme, Yaklas, Uzak, Bosta }; Tur turHesap(const cam::Hamle& h, const Vec3d& onceki) { using cam::HamleTip; switch (h.tip) { case HamleTip::Kesme: return Tur::Isleme; case HamleTip::Dalma: return Tur::Yaklas; default: { const double dz = h.nokta.z - onceki.z; const double yatay = std::hypot(h.nokta.x - onceki.x, h.nokta.y - onceki.y); if (dz > 0.05 && std::abs(dz) > yatay) return Tur::Uzak; if (dz < -0.05 && std::abs(dz) > yatay) return Tur::Yaklas; return Tur::Bosta; } } } bool kesme(Tur t) { return t == Tur::Isleme || t == Tur::Yaklas; } } // namespace FIKO_TEST(apt_gercek_teshis) { const char* yol = "D:/__sistem__/Downloads/Test/Ust_Kalip_202510-UST-FORM-ON.FikoApt"; const cam::AptSonuc s = cam::aptOku(yol); std::printf("\n================ APT TEŞHİS ================\n"); std::printf("basarili=%d goto=%zu hamle=%zu | takim Ø=%.3f boy=%.1f tip=%d | devir=%.0f\n", (int)s.basarili, s.gotoSayisi, s.yol.hamleler.size(), s.takim.cap, s.takim.boy, (int)s.takim.tip, s.devir); if (!s.basarili || s.yol.hamleler.size() < 2) { std::printf("APT okunamadı/boş — teşhis atlandı (dosya yok olabilir)\n"); return; // dosya yoksa test yeşil kalsın } int c[4] = {0, 0, 0, 0}; Aabbf tam, kes; Vec3d onceki = s.yol.hamleler.front().nokta; for (std::size_t i = 0; i < s.yol.hamleler.size(); ++i) { const cam::Hamle& h = s.yol.hamleler[i]; const Tur t = (i == 0) ? Tur::Bosta : turHesap(h, onceki); ++c[(int)t]; const Vec3f p{(f32)h.nokta.x, (f32)h.nokta.y, (f32)h.nokta.z}; tam.genislet(p); if (kesme(t)) kes.genislet(p); onceki = h.nokta; } const Vec3f tb = tam.gecerliMi() ? tam.boyut() : Vec3f{0, 0, 0}; const Vec3f kb = kes.gecerliMi() ? kes.boyut() : Vec3f{0, 0, 0}; std::printf("Hamle türü: Isleme=%d Yaklas=%d Uzak=%d Bosta=%d (kesme=%d)\n", c[0], c[1], c[2], c[3], c[0] + c[1]); std::printf("TAM sınır: %.1f x %.1f x %.1f mm\n", tb.x, tb.y, tb.z); std::printf("KESME bölgesi: %.1f x %.1f x %.1f mm\n", kb.x, kb.y, kb.z); if (!kes.gecerliMi()) { std::printf(">>> KESME HAMLESİ YOK → hiçbir motor oyamaz (sınıflandırma sorunu)\n"); return; } // Sim kutukKur kalıbı: kesme bölgesi + 8mm pay, en uzun eksende 300 hücre cap. Aabbf snr = kes; const f32 pay = 8.0f; snr.asgari = {snr.asgari.x - pay, snr.asgari.y - pay, snr.asgari.z - pay}; snr.azami = {snr.azami.x + pay, snr.azami.y + pay, snr.azami.z + pay}; const Vec3f sb = snr.boyut(); const f64 enUzun = std::max({(f64)sb.x, (f64)sb.y, (f64)sb.z, 1e-3}); const f64 coz = std::max(enUzun / 300.0, 1e-3); cam::Stok stok; stok.tip = cam::StokTip::Kutu; cam::Takim tk = s.takim; if (tk.cap < 1e-3) tk.cap = 10.0; const TakimGeo tg = takimGeoYap(tk); std::printf("Grid: coz=%.3fmm → %d x %d x %d hücre; takım Ø=%.2f (r/coz=%.1f)\n", coz, (int)(sb.x / coz), (int)(sb.y / coz), (int)(sb.z / coz), tk.cap, (tk.cap * 0.5) / coz); const char* isim[] = {"Dexel3 ", "ZBuffer6", "SDF+MC "}; const KutukSimKip kipler[] = {KutukSimKip::Dexel3, KutukSimKip::ZBuffer6, KutukSimKip::SDF_MC}; for (int m = 0; m < 3; ++m) { auto motor = kutukMotoruYap(kipler[m]); if (!motor) { std::printf("[%s] motor yok\n", isim[m]); continue; } if (!motor->kutukKur(stok, snr, coz)) { std::printf("[%s] kutukKur BAŞARISIZ\n", isim[m]); continue; } Vec3d son{}; bool sonVar = false; onceki = s.yol.hamleler.front().nokta; for (std::size_t i = 0; i < s.yol.hamleler.size(); ++i) { const cam::Hamle& h = s.yol.hamleler[i]; const Tur t = (i == 0) ? Tur::Bosta : turHesap(h, onceki); if (sonVar) { if (kesme(t)) motor->sweptUygula(son, h.nokta, tg); } else { motor->takimUygula(h.nokta, tg); } son = h.nokta; sonVar = true; onceki = h.nokta; } MeshVeri mv; motor->meshCikar(mv); // NORMAL YÖNÜ ÖLÇÜMÜ ("ters oyuyor" teşhisi): ÜÇGEN sarım normali (geometrik) // ile meshCikar'ın verdiği normal aynı yönde mi? Ayrıca üçgen-normali stok // merkezinden DIŞA mı bakıyor? Ters mesh → içbükey/dışa oranı çöker. const Vec3f mrk = snr.merkez(); u32 sarimUyum = 0, disaBakan = 0, ucgenSay = mv.ucgenSayi(); for (u32 tI = 0; tI < ucgenSay; ++tI) { const u32 i0 = mv.indeks[tI * 3 + 0], i1 = mv.indeks[tI * 3 + 1], i2 = mv.indeks[tI * 3 + 2]; const Vec3f a{mv.pozisyon[i0 * 3], mv.pozisyon[i0 * 3 + 1], mv.pozisyon[i0 * 3 + 2]}; const Vec3f b{mv.pozisyon[i1 * 3], mv.pozisyon[i1 * 3 + 1], mv.pozisyon[i1 * 3 + 2]}; const Vec3f c{mv.pozisyon[i2 * 3], mv.pozisyon[i2 * 3 + 1], mv.pozisyon[i2 * 3 + 2]}; const Vec3f gn = (b - a).capraz(c - a); // geometrik (sarım) normali const Vec3f vn{mv.normal[i0 * 3], mv.normal[i0 * 3 + 1], mv.normal[i0 * 3 + 2]}; if (gn.nokta(vn) > 0) ++sarimUyum; // sarım ile shading-normali aynı yönde mi const Vec3f mer = (a + b + c) * (1.0f / 3.0f); if (gn.nokta(mer - mrk) > 0) ++disaBakan; // sarım normali merkezden dışa mı } const f64 uyumP = ucgenSay ? 100.0 * sarimUyum / ucgenSay : 0.0; const f64 disaP = ucgenSay ? 100.0 * disaBakan / ucgenSay : 0.0; std::printf("[%s] hacim=%.1f mm³ | vertex=%u ucgen=%u | sarım↔normal uyum=%%%.0f, " "sarım dışa-bakan=%%%.0f %s\n", isim[m], motor->kaldirilanHacimMm3(), mv.vertexSayi(), ucgenSay, uyumP, disaP, disaP < 40.0 ? " ⚠ TERS (sarım içe → inside-out render)" : ""); // OBJ dışa ver (scratchpad) — somut görsel artefakt (Fikri açıp bakabilir). char yolObj[256]; std::snprintf(yolObj, sizeof(yolObj), "C:/Users/FikoYT/AppData/Local/Temp/claude/D----sistem---Masaustu-FikoYT-Yeni-Cag-fikatia-local/bf618023-263c-46b5-bb29-545342eca96c/scratchpad/kutuk_%d.obj", m); if (std::FILE* f = std::fopen(yolObj, "wb")) { for (u32 v = 0; v < mv.vertexSayi(); ++v) std::fprintf(f, "v %.3f %.3f %.3f\n", mv.pozisyon[v * 3], mv.pozisyon[v * 3 + 1], mv.pozisyon[v * 3 + 2]); for (u32 tI = 0; tI < ucgenSay; ++tI) std::fprintf(f, "f %u %u %u\n", mv.indeks[tI * 3] + 1, mv.indeks[tI * 3 + 1] + 1, mv.indeks[tI * 3 + 2] + 1); std::fclose(f); std::printf(" → kutuk_%d.obj yazıldı\n", m); } } std::printf("============================================\n"); }