Merhaba arkadaşlar Csharp'da vereceğim 3 noktadan geçecek çember çizdirmek istiyorum. Bir başlangıç noktam, bir bitiş noktam, bir tepe noktam var. Bu noktalar değişkenlik göstermekte. Bu çemberi çizdirebilmek için çemberin yarıçapının ve merkez kordinatlarını bilmem gerekiyor. Bunun için gereken matematiksel formülleride biliyorum, kağıt üzerinde çözüyorum fakat bunu csharp ile nasıl yapacağımı bilmiyorum.
Örnek :
A(2,4)--> Balangıç
B(8,5)--> Bitiş
C(5,7)--> Tepe
M(x,y)--> Merkez
r--> yarıçap
Bu noktalardan geçen çemberin merkezi ve yarıçapı şu formülle bulunur.
(x-2)^2+(y-4)^2=(x-8)^2+(y-5)^2=(x-5)^2+(y-7)^2=r^2
Yani iki bilinmeyenli ikinci dereceden üç denklemin eşitlenmesiyle bulunuyor merkez kordinatları.. Merkez kordinatları herhangi bir denklemde yerine yazılmasıylada yarıçap bulunuyor.
Bunu nasıl yapabilirim yardımcı olabilecek biri var mı ?
Verilen 3 noktadan geçecek çember çizdirmek
5
●15.823
- 30-09-2013, 14:00:43
- 30-09-2013, 14:36:55bir çemberin baslangıc ve bitiş noktası ne demek? (elipsten söz etmiyorsanız)
başlangic ve bitiş noktalari, çember üzerinde bir birine en uzak olan noktalar ise, olusan dogrunun yarısı zaten yarı çapı verir, tepe noktasina gerek yok. şekil elipsmi cembermi
--R10.NET; Flood Engellendi -->-> Yeni yazılan mesaj 14:36:55 -->-> Daha önceki mesaj 14:30:46 --
delphici oldugum için kod asagida ki gibi ama syntax i kendi dilinize cevirebilirsiniz.
ppx= tepe noktası X
ppy= tepe noktasi Y
xx1 = baslangic X
yy1 = baslangic Y
xx2= bitis X
yy2= bitis Y
dtemp1:=(ppx - xx1) * (xx2 - xx1) + (ppy - yy1) * (yy2 - yy1);
dtemp2 :=(sqr(xx2 - xx1) + sqr(yy2 - yy1));
u:= (dtemp1 / dtemp2);
MERKEZX := xx1 + (u * (xx2 - xx1));
MERKEZY := yy1 + (u * (yy2 - yy1));
yaricap := Sqrt(sqr(disx - ppx) + sqr(disy - ppy));
sqrt : karekök alir.
sql : karesi demek..
merkez koordinati için dogrunun noktaya uzaklik formulunden faydalaniyosun,
yarıcapada pisagordan gidiosun - 30-09-2013, 14:48:36başlangıç ve bitiş noktaları çember üzerinde birbirine en uzak noktalar değil malesef.. öyle olsa yapabiliyorum fakat çember üzerinde herhangi 3 noktadan bahsediyorum.

Şu şekilde çember üzerinde yer alabiliyor noktalar.. Benim amacım şu.. Başlangıç noktasından bitiş noktasına tepe noktasından geçecek şekilde yay çizerek gitmek istiyorum.
Bunun için verdiğim 3 noktadan geçen çemberin merkezini ve yarıçapını bulmam gerekiyor. İşlem bittiğinde çemberin tamamını değil sadece başlangıç noktasından bitiş noktasına kadar olan kısmını çizdireceğim. - 30-09-2013, 16:00:16Aşağıdaki fonksiyonu kullanabilirsiniz. fonksiyon üç noktası verilen çemberin çizileceği alan için rectangle dönüyo. bunu kullanarak çizebilirsiniz.
// Find a circle through the three points. Rectangle FindCircle(Point a, Point b, Point c) { Point center; float radius; float x1 = (b.X + a.X) / 2; float y1 = (b.Y + a.Y) / 2; float dy1 = b.X - a.X; float dx1 = -(b.Y - a.Y); float x2 = (c.X + b.X) / 2; float y2 = (c.Y + b.Y) / 2; float dy2 = c.X - b.X; float dx2 = -(c.Y - b.Y); float cx = (y1 * dx1 * dx2 + x2 * dx1 * dy2 - x1 * dy1 * dx2 - y2 * dx1 * dx2) / (dx1 * dy2 - dy1 * dx2); float cy = (cx - x1) * dy1 / dx1 + y1; center = new Point(cx, cy); float dx = cx - a.X; float dy = cy - a.Y; radius = (float)Math.Sqrt(dx * dx + dy * dy); return new Rectangle(new Point(center.X-radius,center.Y-radius),new Size(radius*2,radius*2)); } - 30-09-2013, 22:33:47Hocam çok teşekkür ederim.. Bu fonksiyon sorunumu çözecektir.. Fakat bir hata aldım bu haliyle.blindson76 adlı üyeden alıntı: mesajı görüntüle
center = new Point(cx, cy); satırında cx ve cy değişkenlerini float oldukları için hata verdi. İnt32ye çevirdim fakat o zamanda değer çok büyük diye yine derlemedi.
Aynı hata
return new Rectangle(new Point(center.X - radius, center.Y - radius), new Size(radius * 2, radius * 2));
bu kısımdada mevcut.. Pointleri PointF yaptığımdada hata aldım.. Çözümü nedir, nasıl yapabilirim ? - 30-09-2013, 23:01:41kodları bununla değiştirinKutluBozkurt adlı üyeden alıntı: mesajı görüntüle
Rectangle FindCircle(PointF a, PointF b, PointF c) { PointF center; float radius; float x1 = (b.X + a.X) / 2; float y1 = (b.Y + a.Y) / 2; float dy1 = b.X - a.X; float dx1 = -(b.Y - a.Y); float x2 = (c.X + b.X) / 2; float y2 = (c.Y + b.Y) / 2; float dy2 = c.X - b.X; float dx2 = -(c.Y - b.Y); float cx = (y1 * dx1 * dx2 + x2 * dx1 * dy2 - x1 * dy1 * dx2 - y2 * dx1 * dx2) / (dx1 * dy2 - dy1 * dx2); float cy = (cx - x1) * dy1 / dx1 + y1; center = new PointF(cx, cy); float dx = cx - a.X; float dy = cy - a.Y; radius = (float)Math.Sqrt(dx * dx + dy * dy); return new Rectangle(new Point((int)(center.X - radius), (int)(center.Y - radius)), new Size((int)radius * 2, (int)radius * 2)); }
