2011-01-15 23 views
5

Nasıl Yapılır Bir grafik hesap makinesi yazıyorum. Şimdiye kadar yarı fonksiyonel bir grapherum var, ancak, doğru grafikler ve düzgün görünümlü eğriler arasında iyi bir denge elde etmek için zor bir zaman geçiriyorum.Bir grapher in C#

şu anki uygulama (yarı sözde kodu) şöyle görünür:

for (float i = GraphXMin; i <= GraphXMax; i++) 
{ 
    PointF P = new PointF(i, EvaluateFunction(Function, i) 
    ListOfPoints.Add(P) 
} 
Graphics.DrawCurve(ListOfPoints) 

bu sorun, sadece her tamsayı değeri ile bir noktaya ekler beri, grafikler çarpık sona olduğunda onların dönüm noktalarını tamsayılara düşmeyin (ör. günah (x)^2).

alt text

Çalışır daha küçük bir şey (gibi 0.1) ile i artan çalıştı, ancak grafik çok kaba görünüyor.

alt text

C# ve GDI + kullanıyorum. SmoothingMethod'u AntiAlias'a ayarladım, bu yüzden ilk grafikten görebileceğiniz gibi sorun değil. Çok fazla puan alan çizim eğrileriyle ilgili bir sorun var mı? Noktalar belki de tam olarak piksellere mi yerleştirilmelidir?

Eminim bazılarınız daha önce çok benzer bir şey üzerinde çalışmış olduğundan, herhangi bir öneriniz var mı? Siz çalışırken, asimptotlarla fonksiyonlarını grafiklemek için herhangi bir öneriniz var mı? Örneğin. 1/x^2

P.S. Bütün bunları yapan bir kütüphane aramıyorum - kendim yazmak istiyorum.

+0

"Grafik çok kaba görünüyor" ile ne demek istiyorsun? puan sayısını arttırmak daha düzgün görünmesini sağlamak için gitmenin yolu. Ve X-adımlarını küçültmek (1 -> 0.1) * * onları artırır. – user492238

+0

Ayrıca bilmiyorum, "asimptotlarla işlevlerin grafiklerini çizme" ile ne demek istiyorsunuz. Ne bekliyorsun? Diğer grafiklere nasıl farklı işler? Onlar değil. – user492238

+0

Bunu daha açık hale getirmek için düzenledim. – ian93

cevap

1

Tamam, sorunu çözdüm. Çizim sürecinde bir yerde float yerine int kullanıyordum.

2

Grafik oluştururken, bir bitmap ayrık olduğundan ve grafiğin olmaması nedeniyle her zaman yuvarlama hataları yapıyorsunuzdur. damlalığının

Orada birkaç yolu:

  1. kullanımı anti-aliasing; Sadece grafiğin daha yumuşak görünmesini sağlıyor.
  2. Bir lineair enterpolasyonu kullanmayın. Bir lineair enterpolasyonu kullanılarak a noktasından b noktasına çizme, açılara neden olur. Her bir nokta (değil çizgi parçasının!) grafiğinin eğimi hesaplayın ve daha kolay olacağını örneğin WPF veya Silverlight'a gibi vektör API'leri kullanılarak interpolasyon yöntemi, eğim (bikübik veya Bezier eğrisi)

besleme uygulamak.

Asimptotların bakımı oldukça zordur. Önce onları bulmalı ve sonra değeri atla, böylece grafikte 'delik' yapabilirsin.