#include "fiko/pafta/pafta_uretim.hpp" #include #include "fiko_test.hpp" using namespace fiko; using namespace fiko::pafta; FIKO_TEST(pafta_sayfa_donusum_sigdirir) { const SayfaOlcu s = sayfaOlcusu(SayfaBoyu::A3Yatay); // 420 x 297 const SayfaDonusum d = sayfaDonusum(s, 840, 594); // tam 2× (kenar payı düşülür) FIKO_KONTROL(d.olcek > 0 && d.olcek < 2.0); // Sol-alt ve sağ-üst köşeler ekran alanı içinde ve doğru yönde (y ters). const Vec2d solAlt = d.ekrana({0, 0}); const Vec2d sagUst = d.ekrana({s.en, s.boy}); FIKO_KONTROL(sagUst.x > solAlt.x); FIKO_KONTROL(sagUst.y < solAlt.y); // ekranda +y aşağı FIKO_KONTROL(solAlt.x >= 0 && sagUst.x <= 840); // Gidiş-dönüş: sayfa → ekran → sayfa aynı noktayı verir. const Vec2d p{123.4, 56.7}; const Vec2d geri = d.sayfaya(d.ekrana(p)); FIKO_KONTROL(std::abs(geri.x - p.x) < 1e-9 && std::abs(geri.y - p.y) < 1e-9); // Sayfa ekranda ortalanır: merkez ≈ ekran merkezi. const Vec2d merkez = d.ekrana({s.en * 0.5, s.boy * 0.5}); FIKO_KONTROL(std::abs(merkez.x - 420.0) < 1e-6 && std::abs(merkez.y - 297.0) < 1e-6); // Geçersiz alan → nötr dönüşüm (bölme yok, çökme yok). FIKO_KONTROL(sayfaDonusum(s, 0, 0).olcek == 1); } FIKO_TEST(pafta_sayfa_donusum_zoom_pan) { const SayfaOlcu s = sayfaOlcusu(SayfaBoyu::A4Yatay); const SayfaDonusum a = sayfaDonusum(s, 800, 600); const SayfaDonusum b = sayfaDonusum(s, 800, 600, {0, 0}, 2.0); FIKO_KONTROL(std::abs(b.olcek - a.olcek * 2.0) < 1e-9); const SayfaDonusum c = sayfaDonusum(s, 800, 600, {50, -30}); FIKO_KONTROL(std::abs(c.ofset.x - (a.ofset.x + 50)) < 1e-9); FIKO_KONTROL(std::abs(c.ofset.y - (a.ofset.y - 30)) < 1e-9); } FIKO_TEST(pafta_gorunum_vur_ustteki_kazanir) { Pafta p; Gorunum a; a.konum = {100, 100}; a.boyut = {40, 20}; const u32 ida = p.gorunumEkle(a); Gorunum b; b.konum = {110, 105}; b.boyut = {40, 20}; const u32 idb = p.gorunumEkle(b); FIKO_KONTROL(gorunumVur(p, {105, 102}) == idb); // çakışmada üstteki (son eklenen) FIKO_KONTROL(gorunumVur(p, {82, 100}) == ida); // yalnız a'nın alanı ([80,120]) FIKO_KONTROL(gorunumVur(p, {300, 300}) == 0); // boş sayfa FIKO_KONTROL(gorunumVur(p, {79, 100}, 2.0) == ida); // tolerans kenarı yakalar FIKO_KONTROL(gorunumVur(p, {79, 100}, 0.0) == 0); // tolerans yokken kenar dışı // Gizlenen görünüm vurulmaz. p.gorunumBul(idb)->goster = false; FIKO_KONTROL(gorunumVur(p, {105, 102}) == ida); } FIKO_TEST(pafta_cizim_imzasi_ayirt_eder) { const geometri::BrepGovde k1 = geometri::kutu(40, 30, 20); const geometri::BrepGovde k2 = geometri::kutu(40, 30, 20); const Olcek bir{1, 1}, yarim{1, 2}; const u64 a = cizimImzasi(&k1, geometri::Gorunum::On, bir); FIKO_KONTROL(a == cizimImzasi(&k1, geometri::Gorunum::On, bir)); // kararlı FIKO_KONTROL(a != cizimImzasi(&k1, geometri::Gorunum::Ust, bir)); // yön FIKO_KONTROL(a != cizimImzasi(&k1, geometri::Gorunum::On, yarim)); // ölçek FIKO_KONTROL(a != cizimImzasi(&k2, geometri::Gorunum::On, bir)); // farklı gövde handle'ı FIKO_KONTROL(cizimImzasi(nullptr, geometri::Gorunum::On, bir) != a); } FIKO_TEST(pafta_gorunum_uret_kutu_olculeri) { const geometri::BrepGovde k = geometri::kutu(40, 30, 20); const GorunumCizim on = gorunumUret(k, geometri::Gorunum::On, Olcek{1, 1}); FIKO_KONTROL(on.gecerli); FIKO_KONTROL(!on.gorunur.empty()); // Ön görünüm: genişlik × yükseklik (40 × 20). FIKO_KONTROL(std::abs(on.boyut.x - 40.0) < 1e-6); FIKO_KONTROL(std::abs(on.boyut.y - 20.0) < 1e-6); // Merkezlenmiş: tüm noktalar ±yarı boyut içinde. for (const auto& pl : on.gorunur) for (const Vec2d& p : pl) FIKO_KONTROL(std::abs(p.x) <= 20.0 + 1e-6 && std::abs(p.y) <= 10.0 + 1e-6); // Üst görünüm: genişlik × derinlik (40 × 30). const GorunumCizim ust = gorunumUret(k, geometri::Gorunum::Ust, Olcek{1, 1}); FIKO_KONTROL(std::abs(ust.boyut.x - 40.0) < 1e-6); FIKO_KONTROL(std::abs(ust.boyut.y - 30.0) < 1e-6); // Ölçek uygulanır (1:2 → yarısı). const GorunumCizim yari = gorunumUret(k, geometri::Gorunum::On, Olcek{1, 2}); FIKO_KONTROL(std::abs(yari.boyut.x - 20.0) < 1e-6); FIKO_KONTROL(yari.imza != on.imza); // Geçersiz gövde → geçersiz çizim (çökme yok). FIKO_KONTROL(!gorunumUret(geometri::BrepGovde{}, geometri::Gorunum::On, Olcek{1, 1}).gecerli); } FIKO_TEST(pafta_cizim_onbellek_bayatlar) { CizimOnbellek ob; const geometri::BrepGovde k = geometri::kutu(10, 10, 10); const Olcek bir{1, 1}; GorunumCizim c = gorunumUret(k, geometri::Gorunum::On, bir); const u64 imza = c.imza; ob.ata(1, std::move(c)); FIKO_KONTROL(ob.sayi() == 1); FIKO_KONTROL(ob.bul(1, imza) != nullptr); FIKO_KONTROL(ob.bul(1, imza + 1) == nullptr); // imza tutmuyor → bayat FIKO_KONTROL(ob.bulHamm(1) != nullptr); // bayat da olsa erişilir (çizime devam) FIKO_KONTROL(ob.bul(2, imza) == nullptr); // yok ob.sil(1); FIKO_KONTROL(ob.sayi() == 0 && ob.bulHamm(1) == nullptr); } FIKO_TEST(pafta_tutunma_adaylari_brepten) { const geometri::BrepGovde k = geometri::kutu(40, 30, 20); const Olcek bir{1, 1}; const GorunumCizim on = gorunumUret(k, geometri::Gorunum::On, bir); FIKO_KONTROL(on.gecerli); const std::vector ad = tutunmaAdaylari(k, geometri::Gorunum::On, on, bir); // Kutunun 8 köşesi ön görünümde ÜST ÜSTE düşer → 4 ayrık aday (±20, ±10). FIKO_KONTROL(ad.size() == 4); int kose = 0; for (const Vec2d& p : ad) if (std::abs(std::abs(p.x) - 20.0) < 1e-6 && std::abs(std::abs(p.y) - 10.0) < 1e-6) ++kose; FIKO_KONTROL(kose == 4); // Ölçek adayları da küçültür (çizimle aynı uzayda kalır). const GorunumCizim yari = gorunumUret(k, geometri::Gorunum::On, Olcek{1, 2}); const std::vector ad2 = tutunmaAdaylari(k, geometri::Gorunum::On, yari, Olcek{1, 2}); FIKO_KONTROL(ad2.size() == 4); for (const Vec2d& p : ad2) FIKO_KONTROL(std::abs(p.x) <= 10.0 + 1e-6); // Geçersiz çizim (çıpa yok) → aday üretilmez. FIKO_KONTROL(tutunmaAdaylari(k, geometri::Gorunum::On, GorunumCizim{}, bir).empty()); } FIKO_TEST(pafta_tutunma_yakala_en_yakini) { const std::vector ad = {{0, 0}, {20, 0}, {20, 10}}; Vec2d cikti{-1, -1}; FIKO_KONTROL(tutunmaYakala(ad, {19, 1}, 2.0, cikti)); FIKO_KONTROL(cikti.x == 20 && cikti.y == 0); FIKO_KONTROL(!tutunmaYakala(ad, {10, 5}, 2.0, cikti)); // tolerans dışı → değişmez FIKO_KONTROL(cikti.x == 20 && cikti.y == 0); FIKO_KONTROL(!tutunmaYakala({}, {0, 0}, 5.0, cikti)); } FIKO_TEST(pafta_nokta3d_yerele_hlr_hizali) { const geometri::BrepGovde k = geometri::kutu(40, 30, 20); const Olcek bir{1, 1}; const GorunumCizim on = gorunumUret(k, geometri::Gorunum::On, bir); FIKO_KONTROL(on.gecerli); const std::vector ad = tutunmaAdaylari(k, geometri::Gorunum::On, on, bir); // Her 3B köşe → görünüm-yerel; GERÇEK izdüşüm adaylarından birine birebir oturmalı // (HLR/izdusumNoktalari ile aynı eksen takımı kanıtı — PMI çapası çizimle hizalı kalır). for (f64 x : {-20.0, 20.0}) for (f64 y : {-15.0, 15.0}) for (f64 z : {-10.0, 10.0}) { const Vec2d p = nokta3dYerele(on, geometri::Gorunum::On, {x, y, z}, bir); Vec2d out{0, 0}; FIKO_KONTROL(tutunmaYakala(ad, p, 1e-6, out)); } // Derinlik ekseni sonucu DEĞİŞTİRMEZ (dik izdüşüm). const Vec2d a = nokta3dYerele(on, geometri::Gorunum::On, {5, -15, 3}, bir); const Vec2d b = nokta3dYerele(on, geometri::Gorunum::On, {5, 15, 3}, bir); FIKO_KONTROL(std::abs(a.x - b.x) < 1e-9 && std::abs(a.y - b.y) < 1e-9); // Ölçek 1:2 → koordinatlar yarıya iner (çizimle aynı uzay). const GorunumCizim yari = gorunumUret(k, geometri::Gorunum::On, Olcek{1, 2}); const Vec2d c = nokta3dYerele(yari, geometri::Gorunum::On, {5, 0, 3}, Olcek{1, 2}); FIKO_KONTROL(std::abs(c.x - a.x * 0.5) < 1e-9 && std::abs(c.y - a.y * 0.5) < 1e-9); // Farklı eksen takımı (üst görünüm) da adaylara oturur. const GorunumCizim ust = gorunumUret(k, geometri::Gorunum::Ust, bir); const std::vector adUst = tutunmaAdaylari(k, geometri::Gorunum::Ust, ust, bir); const Vec2d u = nokta3dYerele(ust, geometri::Gorunum::Ust, {20, 15, 10}, bir); Vec2d out2{0, 0}; FIKO_KONTROL(tutunmaYakala(adUst, u, 1e-6, out2)); } FIKO_TEST(pafta_tutunma_cember_merkezi) { // Silindirin dairesel kenar merkezi aday olmalı (delik/çap ölçüsü buradan tutunur). const geometri::BrepGovde sil = geometri::silindir(10, 30); const Olcek bir{1, 1}; const GorunumCizim ust = gorunumUret(sil, geometri::Gorunum::Ust, bir); FIKO_KONTROL(ust.gecerli); const std::vector ad = tutunmaAdaylari(sil, geometri::Gorunum::Ust, ust, bir); bool merkezVar = false; for (const Vec2d& p : ad) if (std::abs(p.x) < 1e-6 && std::abs(p.y) < 1e-6) merkezVar = true; FIKO_KONTROL(merkezVar); } FIKO_TEST(pafta_kesit_imzasi_cizgiye_duyarli) { const u64 taban = 12345; const u64 a = kesitImzasi(taban, {0, -10}, {0, 10}); FIKO_KONTROL(a == kesitImzasi(taban, {0, -10}, {0, 10})); // kararlı FIKO_KONTROL(a != taban); // taban ile karışır FIKO_KONTROL(a != kesitImzasi(taban, {0, -10}, {0, 11})); // çizgi oynayınca bayatlar FIKO_KONTROL(a != kesitImzasi(taban + 1, {0, -10}, {0, 10})); // gövde değişince bayatlar } FIKO_TEST(pafta_kesit_imzasi_gorunum_alanlariyla) { // Kesit imzası taban+çizgi; DETAY imzası (kesitImzasi yeniden kullanılır) merkez+yarıçap // + ölçek karışımı — UI'daki zincirin sırası bozulursa bayatlama kaçar, burada çivilenir. const u64 taban = 4242; const u64 d1 = kesitImzasi(kesitImzasi(taban, {5, -3}, {8, 0}), {1, 1}, {0, 0}); FIKO_KONTROL(d1 == kesitImzasi(kesitImzasi(taban, {5, -3}, {8, 0}), {1, 1}, {0, 0})); FIKO_KONTROL(d1 != kesitImzasi(kesitImzasi(taban, {5, -3}, {8.5, 0}), {1, 1}, {0, 0})); FIKO_KONTROL(d1 != kesitImzasi(kesitImzasi(taban, {5, -3}, {8, 0}), {2, 1}, {0, 0})); // Sıra ÖNEMLİ: (a,b) ile (b,a) farklı imza (çizgi yönü kesit yönünü belirler). FIKO_KONTROL(kesitImzasi(taban, {0, -10}, {0, 10}) != kesitImzasi(taban, {0, 10}, {0, -10})); // Sıfır taban da karışır (taban=0 ile imza 0 olmamalı). FIKO_KONTROL(kesitImzasi(0, {0, 0}, {0, 0}) != 0); }