//verilen noktanýn þeklin çizgilerine olan uzaklýðýný verir public override float Uzaklik(Nokta nokta) { //mantýk: elipsin merkezlerinden birisinin kendisine yakýn olan kýsa kenara //olan uzaklýðýna m diyorum. m'in formülü þöyle buldum: //m*m - b*m + a*a/4 = 0 (b: dikdörtgenin uzun kenarý, a: kýsa kenarý) //daha sonra m yardýmýyla elipsin iki merkezini hesaplýyorum. Sonra bu merkezler //yardýmýyla verilen noktanýn elipse olan uzaklýðýný bulacaðým. Þimdi m hesaplanýyor... float a, b; if (boyut.genislik > boyut.yukseklik) { a = boyut.yukseklik; b = boyut.genislik; } else { a = boyut.genislik; b = boyut.yukseklik; } float delta = (float)(Math.Pow(b, 2.0) - Math.Pow(a, 2.0)); if (delta < 0) { return(1000.0f); //delta<0 ise kökler sanal, devam etme. } float kok1 = (float)(b + Math.Sqrt(delta)) / 2.0f; float kok2 = (float)(b - Math.Sqrt(delta)) / 2.0f; float m = (kok1 > 0.0f && kok1 < (b / 2.0f)) ? (kok1):(kok2); //m hesaplandý. þimdi Merkezler bulunuyor Nokta merkez1, merkez2; if (boyut.genislik > boyut.yukseklik) { merkez1 = new Nokta(solUstKose.x + m, solUstKose.y - boyut.yukseklik / 2.0f); merkez2 = new Nokta(solUstKose.x + boyut.genislik - m, solUstKose.y - boyut.yukseklik / 2.0f); } else { merkez1 = new Nokta(solUstKose.x + boyut.genislik / 2.0f, solUstKose.y - m); merkez2 = new Nokta(solUstKose.x + boyut.genislik / 2.0f, solUstKose.y - boyut.yukseklik + m); } //verilen noktanýn merkezlere olan toplam uzaklýðý hesaplanýyor float muzaklik = nokta.Uzaklik(merkez1) + nokta.Uzaklik(merkez2); //elipsin üstündeki bir noktanýn merkezlere olan toplam uzaklýðý //ile verilen noktanýnki arasýndaki mutlak deðer dönderiliyor //b = elipsin üstündeki bir noktanýn merkezlere olan toplam uzaklýðý return((float)(Math.Abs(muzaklik - b))); }
//aktif olarak çizilen þeklin önizlemesini görmek için public void NoktaEkleOnizleme(Nokta yeniNokta) //yeniNokta: santim tipinde { if (noktalar.Count > 0) //en az bir nokta varsa devam et { Nokta ilkNokta = (Nokta)noktalar.Peek(); //birinci noktayý kuyruktan bul Sekil sekil = null; switch (tip) { case CizimTipi.Dikdortgen: //dikdörtgen önizlemesi sekil = Dikdortgen.KuralliDikdortgen(ilkNokta, yeniNokta); break; case CizimTipi.Cember: //çember önizlemesi sekil = new Cember(ilkNokta.Kopyasi(), ilkNokta.Uzaklik(yeniNokta)); break; case CizimTipi.Elips: //elips önizlemesi sekil = Elips.KuralliElips(ilkNokta, yeniNokta); break; case CizimTipi.Dogru: //doðru serisi ya da doðru önizlemesi case CizimTipi.DogruSerisi: sekil = new Dogru(ilkNokta, yeniNokta); break; } if (sekil != null) { sekil.cizgiRengi = cizimFormu.AnaForm.CizimRengiSecimi.Color; goruntuGuncelle(sekil); } } }
//verilen noktanýn þeklin çizgilerine olan uzaklýðýný verir public override float Uzaklik(Nokta nokta) { //mantýk: Verilen noktadan geçen ve bu doðruya dik olan doðru ile bu doðrunun //kesiþim noktasýný bul ve bu noktayla verilen nokta arasýndaki uzaklýðý dönder float m = Egimi(); //bu doðrunun eðimi Nokta kesisim = new Nokta(); //yukarýda anlatýlan kesiþim noktasý kesisim.x = (float)(nokta.x + m * m * bas.x - m * (bas.y - nokta.y)) / (m * m + 1.0f); //kesiþimin x noktasý kesisim.y = (float)(m * (kesisim.x - bas.x) + bas.y); //kesiþimin y noktasý return(nokta.Uzaklik(kesisim)); }
//Noktalar kuyruðuna bir nokta ekle public void NoktaEkle(Nokta yeniNokta) //yeniNokta: santim tipinde { if (noktalar.Count == 0) //eðer hiç nokta yoksa ilk noktayý sakla { noktalar.Enqueue(yeniNokta); //çizim formunun ilk andaki görüntüsünü sakla ilkGoruntu = cizimFormu.CizimAlaniGoruntusuVer(null, true); } else //en az bir nokta varsa þeklin tipine göre karar ver { Nokta ilkNokta = (Nokta)noktalar.Dequeue(); //birinci noktayý kuyruktan al Sekil yeniSekil = null; switch (tip) { case CizimTipi.Dogru: //seçili katmana bir doðru ekle yeniSekil = new Dogru(ilkNokta.Kopyasi(), yeniNokta.Kopyasi()); //yeni bir doðru oluþtur yeniSekil.isim = "yeni doðru"; break; case CizimTipi.Dikdortgen: //seçili katmana bir dikdörtgen ekle yeniSekil = Dikdortgen.KuralliDikdortgen(ilkNokta, yeniNokta); yeniSekil.isim = "yeni dikdörtgen"; break; case CizimTipi.Cember: //seçili katmana bir çember ekle yeniSekil = new Cember(ilkNokta.Kopyasi(), ilkNokta.Uzaklik(yeniNokta)); yeniSekil.isim = "yeni çember"; break; case CizimTipi.Elips: //seçili katmana bir Elips ekle yeniSekil = Elips.KuralliElips(ilkNokta, yeniNokta); yeniSekil.isim = "yeni elips"; break; case CizimTipi.DogruSerisi: //seçili katmana bir doðru ekle ve diðer doðrunun //baþlangýç noktasýný bunun bitiþ noktasý yap yeniSekil = new Dogru(ilkNokta.Kopyasi(), yeniNokta.Kopyasi()); //yeni bir doðru oluþtur yeniSekil.isim = "yeni doðru"; SekilCizimiTamamlandi(yeniSekil); yeniSekil = null; NoktaEkle(yeniNokta); // yeni nokta sonraki doðrunun ilk noktasý break; default: break; } //çizimin tamamlandýðýný belirten olay tetikleniyor if (yeniSekil != null) { SekilCizimiTamamlandi(yeniSekil); } } }
//verilen noktanýn þeklin çizgilerine olan uzaklýðýný verir public override float Uzaklik(Nokta nokta) { return(Math.Abs(merkez.Uzaklik(nokta) - yariCap)); }