#include #include "fiko/sketch/eskiz_veri.hpp" #include "fiko_test.hpp" using namespace fiko; using namespace fiko::eskiz; // (a) Elips + Semimajor kisit → buyuk yaricap hedefe gider. FIKO_TEST(elips_semimajor) { EskizVeri e; u32 el = e.elipsEkle(0.0, 0.0, 4.0, 2.0, 0.0); const Geometri* g = e.geoBul(el); FIKO_KONTROL(g && g->tip == GeoTip::Elips); FIKO_KONTROL(g && g->ir >= 0 && g->ir2 >= 0 && g->iaci >= 0); e.kisitEkle(KisitTip::Semimajor, {el}, 7.0); e.kisitEkle(KisitTip::Semiminor, {el}, 3.0); Solver::Sonuc s = e.coz(); FIKO_KONTROL(s.kalanNorm < 1e-6); FIKO_YAKIN(e.px(g->ir), 7.0, 1e-6); FIKO_YAKIN(e.px(g->ir2), 3.0, 1e-6); } // (b) Eliptik yay: elips + baslangic/bitis parametrik aci alanlari dolu. FIKO_TEST(eliptik_yay_alanlar) { EskizVeri e; u32 ey = e.eliptikYayEkle(1.0, 1.0, 5.0, 3.0, 0.0, 0.0, 3.14159265 * 0.5); const Geometri* g = e.geoBul(ey); FIKO_KONTROL(g && g->tip == GeoTip::Elips); FIKO_KONTROL(g && g->ib1 >= 0 && g->ib2 >= 0); FIKO_KONTROL(g && g->a.gecerli() && g->b.gecerli()); // Baslangic ucu (aci=0): merkez + (a,0) = (6,1). FIKO_YAKIN(e.noktaX(ey, 0), 6.0, 1e-6); FIKO_YAKIN(e.noktaY(ey, 0), 1.0, 1e-6); // Bitis ucu (aci=90): merkez + (0,b) = (1,4). FIKO_YAKIN(e.noktaX(ey, 1), 1.0, 1e-6); FIKO_YAKIN(e.noktaY(ey, 1), 4.0, 1e-6); } // Spline (CATIA "EN KRITIK" eksik): GECIS noktali B-spline. Uclar a/b'de AYNALANIR // (mevcut analiz/zincir/kisit kodu spline uclarini bedava gorur); ic noktalar // ekNoktalar'da — hepsi p[]'de serbest parametre (solver tasiyabilir). FIKO_TEST(spline_ekle_temel) { EskizVeri e; const u32 s = e.splineEkle({{0.0, 0.0}, {5.0, 3.0}, {10.0, -2.0}, {15.0, 1.0}}); FIKO_KONTROL(s != 0); const Geometri* g = e.geoBul(s); FIKO_KONTROL(g && g->tip == GeoTip::Spline); FIKO_KONTROL(g->a.gecerli() && g->b.gecerli()); FIKO_KONTROL(g->ekNoktalar.size() == 2); // 4 gecis noktasi → 2 ic (uclar a/b) for (const auto& n : g->ekNoktalar) FIKO_KONTROL(n.gecerli()); FIKO_YAKIN(e.noktaX(s, 0), 0.0, 1e-9); // a = ilk gecis noktasi FIKO_YAKIN(e.noktaY(s, 0), 0.0, 1e-9); FIKO_YAKIN(e.noktaX(s, 1), 15.0, 1e-9); // b = son gecis noktasi FIKO_YAKIN(e.noktaY(s, 1), 1.0, 1e-9); } FIKO_TEST(spline_ekle_gecersiz) { EskizVeri e; FIKO_KONTROL(e.splineEkle({}) == 0); // bos → gecersiz FIKO_KONTROL(e.splineEkle({{1.0, 2.0}}) == 0); // tek nokta → gecersiz const u32 s2 = e.splineEkle({{0.0, 0.0}, {4.0, 4.0}}); // 2 nokta = dogru parcasi spline FIKO_KONTROL(s2 != 0); const Geometri* g = e.geoBul(s2); FIKO_KONTROL(g && g->ekNoktalar.empty()); } // Spline serilestirme round-trip: SURUM 2 (ekNoktalar) — eski format (SURUM 1) // okunmaya devam eder (spline'siz eskizler), spline'li eskiz kayipsiz doner. FIKO_TEST(spline_serilestirme_round_trip) { EskizVeri e; e.cizgiEkle(0.0, 0.0, 1.0, 0.0); // karisik icerik (spline'siz geo da tasinsin) const u32 s = e.splineEkle({{0.0, 0.0}, {5.0, 3.0}, {10.0, -2.0}, {15.0, 1.0}}); std::string bayt; e.disaAktar(bayt); EskizVeri geri; FIKO_KONTROL(geri.iceAktar(bayt.data(), bayt.size())); const Geometri* g = geri.geoBul(s); FIKO_KONTROL(g && g->tip == GeoTip::Spline); FIKO_KONTROL(g->ekNoktalar.size() == 2); FIKO_YAKIN(geri.noktaX(s, 0), 0.0, 1e-12); FIKO_YAKIN(geri.noktaX(s, 1), 15.0, 1e-12); FIKO_YAKIN(geri.px(g->ekNoktalar[0].ix), 5.0, 1e-12); // ic nokta 1 = (5,3) FIKO_YAKIN(geri.px(g->ekNoktalar[0].iy), 3.0, 1e-12); FIKO_YAKIN(geri.px(g->ekNoktalar[1].ix), 10.0, 1e-12); // ic nokta 2 = (10,-2) FIKO_YAKIN(geri.px(g->ekNoktalar[1].iy), -2.0, 1e-12); } // Spline analiz() uyumu: uclar a/b'de AYNALANDIGI icin acik-uc/profil tespiti // spline'i BEDAVA gorur (tasarim karari Tur 12 — bu test iddiayi kilitler). FIKO_TEST(spline_analiz_uyumu) { // Tek basina spline → 2 acik uc, kapali profil yok. EskizVeri e1; e1.splineEkle({{0.0, 0.0}, {5.0, 3.0}, {10.0, 0.0}}); EskizVeri::AnalizSonuc a1 = e1.analiz(); FIKO_KONTROL(a1.acikUclar.size() == 2); FIKO_KONTROL(a1.kapaliProfil == 0); // Spline + donus cizgisi (uclara birebir) → kapali profil, acik uc yok. EskizVeri e2; e2.splineEkle({{0.0, 0.0}, {5.0, 3.0}, {10.0, 0.0}}); e2.cizgiEkle(10.0, 0.0, 0.0, 0.0); EskizVeri::AnalizSonuc a2 = e2.analiz(); FIKO_KONTROL(a2.acikUclar.empty()); FIKO_KONTROL(a2.kapaliProfil == 1 && a2.acikProfil == 0); } // Spline duzenleme: otele YERINDE ic noktalari da tasir; KOPYA yeni spline kurar // (eski kod default dalinda spline'i NOKTA'ya dejenere ediyordu). FIKO_TEST(spline_otele_ve_kopya) { EskizVeri e; const u32 s = e.splineEkle({{0.0, 0.0}, {5.0, 3.0}, {10.0, 0.0}}); e.otele({s}, 2.0, 1.0, 0); // yerinde const Geometri* g = e.geoBul(s); FIKO_KONTROL(g && g->ekNoktalar.size() == 1); FIKO_YAKIN(e.noktaX(s, 0), 2.0, 1e-12); FIKO_YAKIN(e.px(g->ekNoktalar[0].ix), 7.0, 1e-12); // ic nokta da tasindi FIKO_YAKIN(e.px(g->ekNoktalar[0].iy), 4.0, 1e-12); const std::vector yeni = e.otele({s}, 0.0, 10.0, 1); // 1 kopya FIKO_KONTROL(yeni.size() == 1); const Geometri* k = e.geoBul(yeni[0]); FIKO_KONTROL(k && k->tip == GeoTip::Spline); // NOKTA'ya dejenere DEGIL FIKO_KONTROL(k->ekNoktalar.size() == 1); FIKO_YAKIN(e.px(k->ekNoktalar[0].iy), 14.0, 1e-12); // 4 + 10 } // (c) Slot: 4 geometri (2 yay + 2 cizgi) + tegel/esit/paralel kisitlar. FIKO_TEST(slot_kompozit) { EskizVeri e; std::size_t geoOnce = e.geoSayisi(); std::size_t kisitOnce = e.kisitSayisi(); std::vector parcalar = e.slotEkle(0.0, 0.0, 10.0, 0.0, 2.0); FIKO_KONTROL(parcalar.size() == 4); FIKO_KONTROL(e.geoSayisi() - geoOnce == 4); // 2 yay + 2 cizgi // 1 paralel + 1 esit + 4 tegel = 6 kisit. FIKO_KONTROL(e.kisitSayisi() - kisitOnce == 6); } // (d) Cokgen(6): 6 cizgi + yapi cember + esit kenar kisitlari. FIKO_TEST(cokgen_alti) { EskizVeri e; std::size_t geoOnce = e.geoSayisi(); std::vector parcalar = e.cokgenEkle(0.0, 0.0, 5.0, 6); // 6 cizgi + 1 cember = 7 geometri dondu. FIKO_KONTROL(parcalar.size() == 7); FIKO_KONTROL(e.geoSayisi() - geoOnce == 7); // Son eleman cember (yapi). const Geometri* cember = e.geoBul(parcalar.back()); FIKO_KONTROL(cember && cember->tip == GeoTip::Daire && cember->yapi); } // (e) Merkezli dikdortgen: 4 cizgi + yapi merkez, coz sonrasi merkeze simetrik. FIKO_TEST(merkezli_dikdortgen) { EskizVeri e; std::vector parcalar = e.merkezliDikdortgenEkle(0.0, 0.0, 6.0, 4.0); FIKO_KONTROL(parcalar.size() == 5); // 4 cizgi + merkez Solver::Sonuc s = e.coz(); FIKO_KONTROL(s.kalanNorm < 1e-5); u32 alt = parcalar[0]; // Alt kenar yatay, uzunluk 2*yariEn = 12. Skalar dx = e.noktaX(alt, 1) - e.noktaX(alt, 0); FIKO_YAKIN(std::abs(dx), 12.0, 1e-3); FIKO_YAKIN(e.noktaY(alt, 0), e.noktaY(alt, 1), 1e-4); // Merkez simetrik: alt kenarin y'si -yariBoy (=-4). FIKO_YAKIN(e.noktaY(alt, 0), -4.0, 1e-3); } // (f) Yonlu (egik) dikdortgen: 4 kenar, dik koseler. FIKO_TEST(yonlu_dikdortgen) { EskizVeri e; std::vector parcalar = e.yonluDikdortgenEkle(0.0, 0.0, 8.0, 0.0, 3.0); FIKO_KONTROL(parcalar.size() == 4); Solver::Sonuc s = e.coz(); FIKO_KONTROL(s.kalanNorm < 1e-5); } // (g) Paralelkenar: 4 kenar, karsit ciftler paralel. FIKO_TEST(paralelkenar) { EskizVeri e; std::vector parcalar = e.paralelkenarEkle(0.0, 0.0, 10.0, 0.0, 3.0, 5.0); FIKO_KONTROL(parcalar.size() == 4); Solver::Sonuc s = e.coz(); FIKO_KONTROL(s.kalanNorm < 1e-5); } // (h) Egrisel slot: 4 yay (dis + ic + 2 uc) + kapali profil (acik uc yok). FIKO_TEST(egrisel_slot_kompozit) { EskizVeri e; std::vector parcalar = e.egriselSlotEkle(0.0, 0.0, 10.0, 0.0, 1.5707963267948966, 2.0); FIKO_KONTROL(parcalar.size() == 4); FIKO_KONTROL(e.geoSayisi() == 4); // hepsi yay for (u32 k : parcalar) { const Geometri* g = e.geoBul(k); FIKO_KONTROL(g && g->tip == GeoTip::Yay); } // 5 cakisik (4 uc + es merkez) + 1 esit + 2 tegel = 8 kisit. FIKO_KONTROL(e.kisitSayisi() == 8); Solver::Sonuc s = e.coz(); FIKO_KONTROL(s.kalanNorm < 1e-6); EskizVeri::AnalizSonuc a = e.analiz(); FIKO_KONTROL(a.acikUclar.empty()); FIKO_KONTROL(a.kapaliProfil == 1 && a.acikProfil == 0); // Gecersiz genislik (g >= r) → bos. EskizVeri e2; FIKO_KONTROL(e2.egriselSlotEkle(0.0, 0.0, 5.0, 0.0, 1.0, 5.0).empty()); } // (i) Anahtar deligi: 2 yay + 2 teget cizgi + kapali profil (acik uc yok). FIKO_TEST(anahtar_deligi_kompozit) { EskizVeri e; std::vector parcalar = e.anahtarDeligiEkle(0.0, 0.0, 10.0, 0.0, 1.5, 4.0); FIKO_KONTROL(parcalar.size() == 4); FIKO_KONTROL(e.geoSayisi() == 4); const Geometri* by = e.geoBul(parcalar[0]); const Geometri* ky = e.geoBul(parcalar[2]); FIKO_KONTROL(by && by->tip == GeoTip::Yay); FIKO_KONTROL(ky && ky->tip == GeoTip::Yay); FIKO_KONTROL(e.geoBul(parcalar[1]) && e.geoBul(parcalar[1])->tip == GeoTip::Cizgi); FIKO_KONTROL(e.geoBul(parcalar[3]) && e.geoBul(parcalar[3])->tip == GeoTip::Cizgi); // 4 cakisik + 4 tegel = 8 kisit. FIKO_KONTROL(e.kisitSayisi() == 8); Solver::Sonuc s = e.coz(); FIKO_KONTROL(s.kalanNorm < 1e-6); EskizVeri::AnalizSonuc a = e.analiz(); FIKO_KONTROL(a.acikUclar.empty()); FIKO_KONTROL(a.kapaliProfil == 1 && a.acikProfil == 0); // Yaricaplar korunur (coz baslangici zaten tutarli). FIKO_YAKIN(e.px(by->ir), 4.0, 1e-6); FIKO_YAKIN(e.px(ky->ir), 1.5, 1e-6); // Ic ice cemberler → dis teget yok → bos. EskizVeri e2; FIKO_KONTROL(e2.anahtarDeligiEkle(0.0, 0.0, 1.0, 0.0, 1.0, 4.0).empty()); }