2015-05-28 2 views
1

Я хотел бы нарисовать кривую, используя graphics.DrawCurve, и у меня есть значения x и y в отдельных массивах (float x[] и float y[]). Поскольку DrawCurve нуждается в массиве точек в качестве входных данных, мне нужно преобразовать или динамически создать массив точек из массивов float x и y. Есть ли быстрый способ для этого?Динамическое создание точечного массива

У меня есть около 20000 точек для построения кривой, полезно ли использовать graphics.DrawCurve?

+1

Единственный способ присоединиться к двум массивам вместе, но тогда вы бы не стали лучше со списком точек для начала? Что вы пробовали? – Sayse

+0

Я ничего не мог попробовать, кроме поиска. То, что я пытаюсь применить, сначала выделяет массив точек и динамически собирает значения x и y в выделенном массиве точек в цикле. Но до сих пор я не мог узнать, как выделить точечный массив. (почему минус голосование за?) – Lati

+1

Вы ищете [Zip] (https://msdn.microsoft.com/library/dd267698.aspx) (LINQ)? - Как в (untested): 'xArray.Zip (yArray, (x, y) => (новая точка (x, y))). ToArray()' – Corak

ответ

5

Есть несколько вопросов, чтобы ответить.

Я не мог узнать, как выделить точечный массив.

Ну, нет никакой разницы в распределении массива точек, чем сделать это для любого другого вида массива:

const int size = 100; 
Point[] pointArray = new Point[size]; 

Но массивы отсутствуют некоторые «удобства». Например, они имеют фиксированный размер, который необходимо указать в момент инициализации (выделения). И если вам нужно больше места, вам нужно вручную создать новый (больший) массив и скопировать все значения из старого в новое.

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

List<Point> pointList = new List<Point>(); 

А потом, где бы вы на самом деле нужно передать массив, вы можете просто получить его с помощью :

Point[] pointArray = pointList.ToArray(); 

динамически собирает х и у значений в массиве выделенной точки

При работе со списком, это так же просто, как:

pointList.Add(new Point(x, y)); 

Мы не знаем, как заполнить ваш float x[] и float y[]. Если возможно, у меня не было бы этих двух отдельных массивов в первую очередь и просто используйте pointList с самого начала. С одной оговоркой: System.Drawing.Point работает только с значениями int, а не с float значениями. Поэтому я предполагаю, что вы хотели собрать int значения для координат.

динамически создать массив точек из флоат массивов х и у

Если вы не можете изменить коллекцию координат и имеют работать с этими массивами, вы можете «молния» их вместе как это:

IEnumerable<Point> points = x.Zip(y, (xCoord, yCoord) => 
    (new Point((int)xCoord, (int)yCoord)); 

Или, если вы знаете, нужен массив:

Point[] pointArray = x.Zip(y, (xCoord, yCoord) => 
    (new Point((int)xCoord, (int)yCoord)).ToArray(); 

Для этого вам необходимо использовать System.Linq (другими словами, выше, чем .Net 2.0).

Если вы не можете использовать Linq, вы должны сделать это «вручную». Кое-что вроде:

int size = Math.Min(x.Length, y.Length); 
Point[] pointArray = new Point[size]; 

for (int index = 0; index < size; index++) 
{ 
    pointArray[index] = new Point((int)x[index], (int)y[index]); 
} 
+0

Спасибо за подробный ответ и обсуждение. У меня действительно есть числа с плавающей запятой, и я использовал следующий цикл: 'PointF [] pointArray = new PointF [500]; for (int i = 0; i <500; i ++) { pointArray [i] = new PointF ((float) yPoints [i], (float) xPoints [i]); } ' Однако создание списка и добавление точки в список не работают с Graphics.DrawCurve. Я действительно плаваю значения по оси x и на самом деле хорошо работает с Graphics.DrawCurve. Я до сих пор не пробовал решение Linq, и я отредактирую этот ответ, когда сравниваю время выполнения решений. – Lati

+0

Ах, ладно, так меняйте каждый «пункт» в моем ответе на «PointF», удалите '(int)' casting и забудьте о том, что я написал о необходимости 'int'^_ ^. Я не совсем понимаю, что вы подразумеваете под «созданием списка, а добавление точки в список не работает с Graphics.DrawCurve». Вы получаете исключение или ошибку компиляции? «не работает» может означать что угодно. - Вам не хватает каких-либо других параметров, необходимых для [Graphics.DrawCurve] (https://msdn.microsoft.com/library/aa327509.aspx)? – Corak

+0

К сожалению, в комментариях есть только 600 символов, поэтому я не мог писать подробно. Когда я использую «Список pointArray = новый Список (); for (int i = 0; i <500; i ++) { pointArray.Add (новый PointF ((float) yPoints [i], (float) xPoints [i])); } g.DrawCurve (ручка, pointArray, 1F); ' У меня возникла следующая ошибка (Ошибка 4 Аргумент 2: невозможно преобразовать из 'System.Collections.Generic.List 'to' System.Drawing.PointF [] ' – Lati

2

Вы можете создать List<Point>, который лучше, чем массивы.

List<Point> list = new List<Point>(); 
Point point=new Point(10,15); 
list.Add(point); 

Вы можете получить все координаты х и у двух массивов и скомпоновать в списке в качестве точек и чем использовать этот список, чтобы нарисовать кривую.

+1

Это не отвечает на вопрос. – Sayse

+1

Это на самом деле отвечает на вопрос. Однако решение Corak предложило более подробно и лучше обсудить проблему. Спасибо, в любом случае! – Lati

1

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

List<Point> points = new List<Point>(); 
for(int i = 0; i < x.Length; i++){ 
    points.Add(new Point(x[i],y[i]); 
} 

Я не вижу особой проблемы при использовании DrawCurve здесь.

Если вам нужен массив точек с помощью points.ToArray();

+0

Это то же самое, что и упоминалось в Mairaj. Но все равно спасибо! – Lati

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