Как реализовать графер в C # - PullRequest
5 голосов
/ 15 января 2011

Итак, я пишу графический калькулятор. Пока у меня есть полуфункциональный графограф, однако мне трудно найти хороший баланс между точными графиками и плавными кривыми.

Текущая реализация (полупсевдокод) выглядит примерно так:

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

Проблема с этим заключается в том, что он добавляет точку к каждому целочисленному значению, графики в конечном итоге искажаются, когда их точки поворота не попадают в целые числа (например, sin (x) ^ 2 ).

alt text

Я попытался увеличить i на что-то меньшее (например, 0,1), что работает, но график выглядит очень грубым.

alt text

Я использую C # и GDI +. У меня SmoothingMethod установлен в AntiAlias, так что это не проблема, как вы можете видеть из первого графика. Есть ли какая-то проблема с рисованием кривых с большим количеством точек? Должны ли точки быть расположены точно на пикселях?

Я уверен, что некоторые из вас работали над чем-то очень похожим раньше, так что есть предложения? Пока у вас есть, есть ли у вас какие-либо предложения для построения графиков функций с асимптотами? например 1 / х ^ 2

P.S. Я не ищу библиотеку, которая делает все это - я хочу написать это сам.

Ответы [ 2 ]

2 голосов
/ 15 января 2011

При рендеринге графика вы всегда делаете ошибки округления, потому что растровое изображение дискретно, а график нет.

Существует несколько способов копирования:

  1. использование сглаживания;это просто делает график более гладким.
  2. использует нелинейную интерполяцию.Рисование от точки a до b с использованием линейной интерполяции приводит к углам.Рассчитайте наклон графика (не отрезка линии!) В каждой точке и введите наклон в метод интерполяции (бикубическая или кривая Безье)

Использование векторных API, таких как WPF или Silverlight, может привести квещи, которые легче реализовать.

Заботиться об асимптотах довольно сложно.Сначала вы должны найти их, а затем пропустить значение, чтобы сделать «дыру» в графике.

1 голос
/ 12 февраля 2011

ОК, я исправил проблему. Где-то в процессе рисования я использовал int, а не float.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...