DataGridView da Alan hesabı C#

Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
Merhaba arkadaşlar;

Datagridview da bir hesap yapmak istiyorum. datagridviwe 4 kolondan oluşuyor Nokta No X Y Z şeklinde...

aşağıdaki verilerde sadece Z bilgisi yok. ihtiyacımız da yok.


No X Y
------------------
1 389.634 209.299
2 337.222 92.005
3 179.626 116.397
4 223.063 242.658

şimdi bu verilere göre Alan : 21121.97 m² çıkması gerekiyor.

Formülümüz şu şekilde :


formüldeki A B C D E = 1 2 3 4 5 şeklinde nokta numaralarını ifade etmektedir...


yardımcı arkadaşa şimdiden teşekkürler.


 

ÖmerBey

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2012
Mesajlar
4,135
Excel Vers. ve Dili
2007 Türkçe
Merhaba,
Sorunuzun cevabı değil ama Listbox üzerinde yapılmış hali ektedir, sanırım siz uyarlayabilirsiniz...
Harici Link
 

Ekli dosyalar

Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
@ÖmerBey

Çok teşekkür ediyorum., inceliyorum...
 
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
@ÖmerBey

başka bir örnek yaptım. işlem sonucu doğru fakat, virgülden sonraki küsaratta hata var. bir de sonuç negatif çıkıyor ( - ) şu an yaptığım örnekte... 7 nokta kullandım
 
Son düzenleme:

ÖmerBey

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2012
Mesajlar
4,135
Excel Vers. ve Dili
2007 Türkçe
Tekrar merhaba,
Virgülden sonraki hata yuvarlama kaynaklı olabilir. Sonucun negatif çıkması da Y değerlerinin ters çıkarılması sonucu olabilir. Paylaştığınız formülde üstteki değerden alttaki çıkarılıyor.
Elimde değerler ve olması gereken sonuç olmadığı için deneme imkanım olmuyor, birkaç farklı örnek paylaşırsanız oluşan hatanın kaynağını anlayabiliriz sanıyorum.
 
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
Tabiki... aynen dediğiniz gibi X ve Y yönünden negatif çıkmış... tamamdır sorun yok. küsaratta doğru çıktı.

Şimdi oradaki formül aslında şu : 2F = Yn x ( Xn -1 - Xn + 1)

benim ikinci olarak denediğim koordinatlar :

1 177.827 105.513
2 467.798 503.093
3 1324.358 487.860
4 757.447 75.638
5 359.180 79.446
6 179.103 30.893
7 177.827 105.513

yani bunu nasıl düzenleyeceğim , ? biraz daha detay lazım... ilk iki satırı anladım. yani listbox ı bir listeye alıyoruz.. numara olmadan sanırım.

alt kısımları anlayamadım...
 

ÖmerBey

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2012
Mesajlar
4,135
Excel Vers. ve Dili
2007 Türkçe
Yazdığım kodda aslolan 2. dizi. Çünkü; bütün işlem ikinci dizide yapılıyor. İlk diziyi pratik olarak listboxu kullanmak için oluşturdum, doğrudan listboxtan da veri alınabilir.
Burada dikkat edeceğimiz husus listedeki ilk ve son değerler. Çünkü; formüldeki n-1 ve n+1 değerlerinin hata vermemesi gerekiyor. Bunun için de listeye 2 eleman daha ekliyoruz; bunlardan biri en başa (son değer), diğeri de en sona (ilk değer). Normalde 1,2,3,4 şeklinde olan listemiz 4,1,2,3,4,1 şekline dönüşüyor. Sonra da bu listenin 2. elemanından sondan 2. elemanına kadar döngü kurup sıralı toplama yaptırıyoruz.
Kısaca aşağıdaki tablodaki

1​

389,634​

209,299​

2​

337,222​

92,005​

3​

179,626​

116,397​

4​

223,063​

242,658​


şeklindeki değerleri

 

4​

223,063​

242,658​

1​

389,634​

209,299​

2​

337,222​

92,005​

3​

179,626​

116,397​

4​

223,063​

242,658​

1​

389,634​

209,299​


şekline dönüştürüyoruz (ilk sütün olmadan)

 

Umarım açıklayabilmişimdir.
 
Son düzenleme:
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
Yazdığım kodda aslolan 2. dizi. Çünkü; bütün işlem ikinci dizide yapılıyor. İlk diziyi pratik olarak listboxu kullanmak için oluşturdum, doğrudan listboxtan da veri alınabilir.
Burada dikkat edeceğimiz husus listedeki ilk ve son değerler. Çünkü; formüldeki n-1 ve n+1 değerlerinin hata vermemesi gerekiyor. Bunun için de listeye 2 eleman daha ekliyoruz; bunlardan biri en başa (son değer), diğeri de en sona (ilk değer). Normalde 1,2,3,4 şeklinde olan listemiz 4,1,2,3,4,1 şekline dönüşüyor. Sonra da bu listenin 2. elemanından sondan 2. elemanına kadar döngü kurup sıralı toplama yaptırıyoruz.
Kısaca aşağıdaki tablodaki

1​

389,634​

209,299​

2​

337,222​

92,005​

3​

179,626​

116,397​

4​

223,063​

242,658​


şeklindeki değerleri

4​

223,063​

242,658​

1​

389,634​

209,299​

2​

337,222​

92,005​

3​

179,626​

116,397​

4​

223,063​

242,658​

1​

389,634​

209,299​


şekline dönüştürüyoruz (ilk sütün olmadan)

Umarım açıklayabilmişimdir.
Tamam. biraz daha netleşti... bakacağım. yani bunu Excel de bir tabloda Üniversitede iken yapmıştım. hala arşivimde durur. Fakat bunu C# dönüştürmek istiyorum., bu son gönderdiğiniz mesaj üzerinden gideceğim bakalım... C# da yeniyim..

Çok teşekkürler yardımların için. Eyvallah.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,323
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi


Bu aslında bildiğimiz klasik "Cross Metoduyla" alan hesaplama formülü...

VBA'de şöyle ufak bir fonksiyon kullanılabilir;

C#:
Function getArea(Xs As Range, Ys As Range) As Double
    Dim i As Integer, tempArea As Double
    
    For i = 1 To Xs.Rows.Count - 1
        tempArea = tempArea + (Xs(i + 1) + Xs(i)) * (Ys(i + 1) - Ys(i))
    Next
    
    getArea = Abs(tempArea + (Xs(1) + Xs(Xs.Rows.Count)) * (Ys(1) - Ys(Ys.Rows.Count))) / 2
End Function

Fonksiyonun kullanımı;



.
 
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
@Haluk



Evet Cross metod...

Teşekkür ederim hocam. Ama bunu C# -datagridview üzerinden yapmam gerekiyor... sanırım bu kodlar yardımcı olur... deneyeceğim.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,323
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
JavaScript ile yapılması, C# ile benzerlik sağlar mı bilmiyorum .... ama önemli olan hem VBA hem de aşağıdaki Javascript kodunda X ve Y koordinatlarını ayrı ayrı 2 Array'e (dizi) aldıktan sonra gerisi zaten kolay. Alan, hiçbir zaman negatif çıkamayacağı için de sonucun mutlak değerini alıyoruz.

JavaScript:
<html>
<body>

<div id="demo"></div>

<script>     
    n = 4

    Xs = [389.634, 337.222, 179.626, 223.023];
    Ys = [209.299, 92.005, 116.397, 242.658];

    area = 0;

    for (var i=0; i < n-1;i++){
        area = area + Xs[i]* Ys[i+1] - Ys[i]* Xs[i+1]
    }


    area = Math.abs(area + Xs[n-1]*Ys[0]- Ys[n-1]*Xs[0])/2;

    alert("Alan = "+ area);
    document.getElementById("demo").innerHTML = "Alan = " + area.toFixed(4)

</script>

</body>
</html>


Örnek ektedir....


.
 
Son düzenleme:
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
JavaScript ile yapılması, C# ile benzerlik sağlar mı bilmiyorum .... ama önemli olan hem VBA hem de aşağıdaki Javascript kodunda X ve Y koordinatlarını ayrı ayrı 2 Array'e (dizi) aldıktan sonra gerisi zaten kolay. Alan, hiçbir zaman negatif çıkamayacağı için de sonucun mutlak değerini alıyoruz.

JavaScript:
<html>
<body>

<div id="demo"></div>

<script>    
    n = 4

    Xs = [389.634, 337.222, 179.626, 223.023];
    Ys = [209.299, 92.005, 116.397, 242.658];

    area = 0;

    for (var i=0; i < n-1;i++){
        area = area + Xs[i]* Ys[i+1] - Ys[i]* Xs[i+1]
    }


    area = Math.abs(area + Xs[n-1]*Ys[0]- Ys[n-1]*Xs[0])/2;

    alert("Alan = "+ area);
    document.getElementById("demo").innerHTML = "Alan = " + area.toFixed(4)

</script>

</body>
</html>


Örnek ektedir....


.
iyice netleşti... gerisi bende ... Çok teşekkürler...
 
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
yapı tamam... datagridview dan iki dizi oluşturduğum zaman bu iş bitmiştir.


Yardımcı arkadaşlar çok teşekkür ediyorum.


C#:
 private void lblAlnKoord_Click(object sender, EventArgs e)
        {
            int n = 4;

            double[] Xs = { 389.634, 337.222, 179.626, 223.023 };

            double[] Ys = { 209.299, 92.005, 116.397, 242.658 };

            double area = 0;

            for (var i = 0; i < n - 1; i++)
            {
                area = area + Xs[i] * Ys[i + 1] - Ys[i] * Xs[i + 1];
            }


            area = Math.Abs(area + Xs[n - 1] * Ys[0] - Ys[n - 1] * Xs[0]) / 2;

            MessageBox.Show("Alan : " + area.ToString());
        }
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,323
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Deneme şansım yok ama, siz bir deneyin.... (dataGridView1 2 sütunsa; Cells[1] yerine Cells[0] ve Cells[2] yerine Cells[1] kullanmayı deneyin)

C#:
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
    Xs[i] = dataGridView1.Rows[i].Cells[1].Value.ToString();
    Ys[i] = dataGridView1.Rows[i].Cells[2].Value.ToString();
}

ToString() kısmı gerekli mi, bilemedim....


.
 
Son düzenleme:
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
Haluk hocam, şu şekilde çözdüm;

C#:
           int n = dataGridView1.RowCount - 1;
            List<double> Xs = new List<double>();
            List<double> Ys = new List<double>();

            foreach (DataGridViewRow dgvr in dataGridView1.Rows)
            {
                Xs.Add(Convert.ToDouble(dgvr.Cells[1].Value));
                Ys.Add(Convert.ToDouble(dgvr.Cells[2].Value));
            }

Güzel oldu. Tekrar teşekkür ederim.
 
Üst