Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module main;
- import std.stdio;
- import std.conv;
- import std.string;
- import std.array;
- import std.math;
- import std.range;
- import std.format;
- import canvas;
- import dlib.image.color;
- import dlib.image.io.png;
- void main()
- {
- // Чтение массива данных (y) из файла
- auto a = appender!(double[]);
- foreach(line; File("test.txt").byLine)
- a.put(line.strip.to!double);
- double[] y = a.data;
- // Второй массив для хранения логарифмов,
- // чтобы не "портить" первый нулями
- double[] y2 = new double[y.length];
- y2[] = 0;
- uint period = 11;
- uint k = (period - 1) / 2;
- auto sk = new double[y.length - k];
- sk[] = 0;
- for (uint i = k + 1; i < y.length - k; i++)
- {
- sk[i] = 0;
- for (uint j = i - k; j < i + k + 1; j++)
- {
- y2[j] = log(y[j]);
- // Проверка на NaN (NaN'ов теперь быть не должно)
- assert( !isNaN(y2[j]), format("y2[%s] = %s", j, y2[j]) );
- sk[i] += y2[j];
- }
- sk[i] = exp(sk[i] / period);
- // Проверка на бесконечность (не должно быть)
- assert( sk[i] != double.infinity, format("sk[%s] = %s", i, sk[i]) );
- // Для C#:
- // ppl.Add(new PointPair(i, sk[i]));
- }
- // Рисуем график
- {
- Canvas c = new Canvas(512, 256, White);
- plotData(c, y, Blue);
- plotData(c, sk, Red);
- c.image.savePNG("output.png");
- }
- }
- /*
- * Всякие ненужные Наташе функции...
- */
- string format(T...)(string f, T t)
- {
- auto writer = appender!string;
- formattedWrite(writer, f, t);
- return writer.data;
- }
- void plotData(Canvas c, double[] y, Color4 col)
- {
- double px = 0, py = c.image.width / 2;
- foreach(i; 0..y.length)
- {
- auto x = i * 10;
- double Y = y[i];
- auto ny = Y * 20;
- if (x > 0 && Y > 0 && py > 0)
- {
- if (py < c.image.height)
- c.drawLineAA(px, py, x, ny, col);
- }
- px = x;
- py = ny;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement