Страницы

Поиск по вопросам

среда, 24 апреля 2019 г.

Метод реализации графического интерфейса


Необходимо будет сделать подобную вещь в своей программе на c# Windows Forms, возможно и WPF. Из чего лучше всего сделать такой график? На нем нужно будет и многое другое вырисовывать, но главное это основные свечи(красные, зеленые). Как мысль, самая банальная, сделать координаты и рисовать по ним прямоугольники с линиями сверху и снизу. А при масштабировании вырисовывать другие, более мелкие или большие. Но, может быть, есть более лаконичное решение данной задачи?


Ответ

Ваш рисунок очень похож на Candlestick chart, название которого иногда переводят как японские свечи
Практически в каждой библиотеки для построения графиков такой тип тоже реализован, поэтому в первую очередь стоит рассмотреть готовые варианты прежде чем изобретать собственный велосипед.
Пример того, как может выглядеть такой график нарисованный при помощи библиотеки OxyPlot

Подчеркну, что кроме цвета фона использовались настройки по умолчанию, так как не ставил перед собой цели добиться соответствия с приведенным изображением.
Данные получены случайным образом, по примеру из репозитория.
Не буду копировать оттуда пример, но переведу его реализацию на F# для более наглядной демонстрации типов и методов библиотеки
let candleStickSeries() = let model = PlotModel(Title = "", LegendSymbolLength = 24.0 ) let s1 = new CandleStickSeries(Title = "", Color = OxyColors.Black) let r = Random()
Seq.initInfinite (fun _ -> r.NextDouble()) |> Seq.scan(fun price a -> price + a + 0.1) 100.0 |> Seq.indexed |> Seq.map (fun (i, price) -> let high = price + 10.0 + (r.NextDouble() * 10.0) let low = price - (10.0 + (r.NextDouble() * 10.0)) let open' = low + (r.NextDouble() * (high - low)) let close = low + (r.NextDouble() * (high - low)) new HighLowItem(float i, high, low, open', close)) |> Seq.take 30 |> Seq.iter s1.Items.Add
model.Series.Add(s1) model.Axes.Add(new LinearAxis(Position = AxisPosition.Left, MaximumPadding = 0.3, MinimumPadding = 0.3 )) model.Axes.Add(new LinearAxis(Position = AxisPosition.Bottom, MaximumPadding = 0.03, MinimumPadding = 0.03 ))
model
Если хотите добиться полного (или почти полного совпадения), то советую разбить вопросы на несколько небольших и задать их по метке выбранной библиотеки.

Комментариев нет:

Отправить комментарий