2016-06-13 4 views
0

Я добавил горизонтальную полосковую линию к диаграмме синусоидального типа, которая не имеет много точек данных. Есть ли способ найти пересечения х-координат?Графики: точки пересечения полос и кривых

+0

Пожалуйста, покажите WAHT вы испробовали – InitLipton

+0

Пожалуйста, предоставьте нам Infor, о которых библиотека и вы как раз используя какие рамки приложение разрабатывается в WPF (WF, , UWP, ...). –

+0

Я использую System.Windows.Forms.DataVisualization.Charting, и я еще ничего не пробовал, кроме поиска ближайших точек данных в моем исходном массиве fior, но точность не будет такой же хорошей, как фактические точки пересечения – user3760188

ответ

2

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

Или вы можете нам приблизиться с небольшой помощью от GDI+.

Как вы нашли, используя DataPoints непосредственно в тонко населенном наборе точек не будет работать.

Но есть интересное и простое обходное решение, которое может создать для вас увеличенный набор точек.

Для этого нужно использовать сплющенныеGraphicsPath:

Давайте предположим, что ваши ценности в List<PointF> points:

List<PointF> points = new List<PointF>(); 
for (int i = 0; i < 10; i++) points.Add(new PointF(i, (float)Math.Sin(i))); 

Теперь вы первый создать GraphicsPath от него:

using System.Drawing.Drawing2D; 
.. 
.. 
GraphicsPath gp = new GraphicsPath(); 
gp.AddCurve(points.ToArray()); 

Затем вы сглаживаете его:

Matrix m = new Matrix(); // identity 
gp.Flatten(m, yourFlatness); 

Это изменяет GraphicsPath из серии кривых, (которые являются идентичными кривыми сплайна Chart «с, кстати,) к серии отрезков. «Плоскость» определяет, насколько линии могут отклоняться от кривой. поэтому, чем меньше плоскость, которую вы используете (по умолчанию 0,25f), тем больше сегментов вы получаете.

Начато с 10 DataPoints показано ниже в красном цвете. После выпрямления с 0.1f, 0.01f и 0.001f мы получаем сегменты 19, 55 и 152 точек/линий соответственно ..:

enter image description here

Вы можете Acces их в gp.PathPoints массиве и получите гораздо ближе к реальным перекресткам. Добавьте немного интерполяции, и вы должны быть достаточно близко к джазу ..

+0

Отлично ... точно, как мне было нужно .. спасибо – user3760188

Смежные вопросы