forked from vimsh/TimingEditor
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTimingForm.Smoothing.cs
More file actions
128 lines (111 loc) · 3.7 KB
/
TimingForm.Smoothing.cs
File metadata and controls
128 lines (111 loc) · 3.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using NSFW.TimingEditor.Utils;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace NSFW.TimingEditor
{
public partial class TimingForm
{
private void SmoothButton_Click(object sender, EventArgs e)
{
Smooth(dataGrid.SelectedCells);
}
private static void SmoothVertically(DataGridViewSelectedCellCollection selectedCells)
{
var columnsGroup = selectedCells.ToList().GroupBy(p => p.ColumnIndex);
SmoothCells(columnsGroup);
}
private static void SmoothHorizontally(DataGridViewSelectedCellCollection selectedCells)
{
var rowsGroup = selectedCells.ToList().GroupBy(p => p.RowIndex);
SmoothCells(rowsGroup);
}
private static List<double> Smooth(List<double> arr)
{
List<double> result = new List<double>();
int windowSize = 1;
for (int i = 0; i < arr.Count; i++)
{
int leftOffeset = i - windowSize;
int from = leftOffeset >= 0 ? leftOffeset : 0;
int to = i + windowSize + 1;
int count = 0;
double sum = 0;
for (int j = from; j < to && j < arr.Count; j++)
{
sum += arr[j];
if (j == i)
{
sum += arr[j] * 2;
count += 2;
}
count++;
}
result.Add(sum / count);
}
return result;
}
private static void SmoothCells(IEnumerable<IGrouping<int, DataGridViewCell>> groupedCells)
{
foreach (var r in groupedCells)
{
var cells = r.OrderBy(p => p.ColumnIndex).ToArray();
var values = cells.Select(p => p.ValueAsDouble()).ToList();
var cleanData = Smooth(values);
for (int i = 0; i < cleanData.Count; i++)
{
cells[i].Value = cleanData[i].ToString();
}
}
}
private static void Smooth(DataGridViewSelectedCellCollection selectedCells)
{
SmoothHorizontally(selectedCells);
SmoothVertically(selectedCells);
}
private static bool SelectedColumn(System.Collections.ICollection selectedCells)
{
var column = -1;
var total = 0;
foreach (DataGridViewCell cell in selectedCells)
{
total++;
if (column == -1)
{
column = cell.ColumnIndex;
}
else
{
if (column != cell.ColumnIndex)
{
total--;
}
}
}
return (column != -1) && (total > 2);
}
private static bool SelectedRow(IEnumerable selectedCells)
{
var row = -1;
var total = 0;
foreach (DataGridViewCell cell in selectedCells)
{
total++;
if (row == -1)
{
row = cell.RowIndex;
}
else
{
if (row != cell.RowIndex)
{
total--;
}
}
}
return (row != -1) && (total > 2);
}
}
}