Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Суммирование массивов. 
V
    Опции темы
Elfet
Дата 3.7.2007, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Мне нужно как-то суммировать массивы. Как это лучше седлать? 
Код

            ReturnArray(); // например эта функция возвращает массив длиной от 1 до 3 Trigon[]

            Trigon[] trigons; - и мне их нужно все собрать в один массив. Как это лучше делать?



--------------------
PM MAIL WWW Skype   Вверх
stab
Дата 4.7.2007, 04:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 7
Всего: 48



создать новый требуемой длины. есть ещё Array.Resize, но по сути это тоже самое.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
ivashkanet
Дата 4.7.2007, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 3
Всего: 149



Elfet, создай List<Trigon>. Добавь в него сколько нужно элементов, в потом скопируй его в массив:
Код
public void CopyTo(T[] array)


PM MAIL WWW ICQ   Вверх
Elfet
Дата 4.7.2007, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



ivashkanet, так я и хотел. Это так всегда делается? smile


--------------------
PM MAIL WWW Skype   Вверх
ivashkanet
Дата 4.7.2007, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 3
Всего: 149



Цитата(Elfet @  4.7.2007,  09:41 Найти цитируемый пост)
Это так всегда делается?

Не знаю smile Я  с такой задачей не сталкивался smile

Но если тебе НЕизвестен размер итогового массива, то этот вариант просто создан для тебя.
Если известен, то просто наполняй массив.


В общем, идея в том, что ты стремишься как можно уменьшить количество ресайзов массива (это за тебя делает List<>)


PM MAIL WWW ICQ   Вверх
Elfet
Дата 4.7.2007, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



ivashkanet,  smile 


--------------------
PM MAIL WWW Skype   Вверх
ivashkanet
Дата 4.7.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 3
Всего: 149



Elfet, smile 
PM MAIL WWW ICQ   Вверх
Elfet
Дата 4.7.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Код

    public class QuadStrip : Polygon
    {
        public QuadStrip(Vector[] points, Color color)
            : base(points, color)
        {
        }

        public override Trigon[] Triangulation()
        {
            List<Trigon> trigons = new List<Trigon>();
            for (int i = 0; i < points.Length - 3; i += 2)
            {
                trigons.AddRange(new Quadic(points[i], points[i + 1], points[i + 3], points[i + 2], color).Triangulation());
            }

            Trigon[] array = new Trigon[trigons.Count];
            trigons.CopyTo(array);

            return array;
        }
    }



--------------------
PM MAIL WWW Skype   Вверх
stab
Дата 4.7.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 7
Всего: 48



а что мешает сразу создать array размера points.Length - 2 и обойтись без overhead'ов на перераспределение памяти? насколько я понимаю триангуляция четырёхугольника - это всегда два треугольника.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
ivashkanet
Дата 4.7.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 3
Всего: 149



И еще: 
Цитата(Elfet @  4.7.2007,  11:24 Найти цитируемый пост)
new Quadic(points[i], points[i + 1], points[i + 3], points[i + 2], color).Triangulation()

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

Тем более, ИМХО, алгоритм ее общий для всех фигур (и не зависит от числа вершин): фиксируешь точку, а потом пробегаешь последовательно по всем остальным последовательным парам.

Добавлено через 32 секунды
т.е. треугольников всегда будет 
Цитата(stab @  4.7.2007,  11:47 Найти цитируемый пост)
points.Length - 2


PM MAIL WWW ICQ   Вверх
Elfet
Дата 4.7.2007, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



stab, да! Точно smile

Цитата(ivashkanet @  4.7.2007,  13:53 Найти цитируемый пост)
Мне кажется невыгодно создавать экземпляр класса только для того, чтобы получить его триангуляцию. 

угу, точно. перепишу.

Цитата(ivashkanet @  4.7.2007,  13:53 Найти цитируемый пост)
Тем более, ИМХО, алгоритм ее общий для всех фигур (и не зависит от числа вершин): фиксируешь точку, а потом пробегаешь последовательно по всем остальным последовательным парам.

ммм. что-то не понимаю. остальным последовательным парам? ведь всегда поразному? 
user posted image



--------------------
PM MAIL WWW Skype   Вверх
Elfet
Дата 4.7.2007, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Отлично работает! smile
Код

    public class QuadStrip : Polygon
    {
        public QuadStrip(Vector[] points, Color color)
            : base(points, color)
        {
        }

        public override Trigon[] Triangulation()
        {
            Trigon[] trigons = new Trigon[points.Length - 2];
            for (int i = 0; i < points.Length - 2; i++)
            {
                trigons[i] = new Trigon(points[i], points[i + 1], points[i + 2], color);
            }
            return trigons;
        }
    }



PS
Кнопка код по умолчанию даёт nocolor :/
PM MAIL WWW Skype   Вверх
ivashkanet
Дата 4.7.2007, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 3
Всего: 149



Elfet, да. Про невыпуклые многоугольники я не подумал  smile 
PM MAIL WWW ICQ   Вверх
Elfet
Дата 4.7.2007, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Если бы со сферой ещё помогли бы!  smile 
Код

    public class Sphere : Polygon
    {
        private float radius;
        public float Radius
        {
            get
            {
                return radius;
            }
        }

        public Sphere(Vector basePoint, float radius, Color color, int quotient)
            : base(null, color)
        {
            SetSphere(basePoint, radius, quotient);
        }

        private int n;

        public void SetSphere(Vector basePoint, float radius, int n)
        {
            this.radius = radius;
            this.n = n;

            points = new Vector[2 * (n + 1) * (n / 2)];

            int next = 0;

            double theta1, theta2, theta3;
            double x, y, z, px, py, pz;

            if (radius < 0) radius = -radius;
            if (n < 0) n = -n;
            if (n < 4 || radius <= 0)
            {
                return;
            }
            for (int j = 0; j < n / 2; j++)
            {
                theta1 = j * 2 * Math.PI / n - Math.PI / 2;
                theta2 = (j + 1) * 2 * Math.PI / n - Math.PI / 2;
                //QuadStrip
                for (int i = 0; i <= n; i++)
                {
                    theta3 = i * 2 * Math.PI / n;
                    x = Math.Cos(theta2) * Math.Cos(theta3);
                    y = Math.Sin(theta2);
                    z = Math.Cos(theta2) * Math.Sin(theta3);
                    px = basePoint.X + radius * x;
                    py = basePoint.Y + radius * y;
                    pz = basePoint.Z + radius * z;
                    points[next++] = new Vector((float)px, (float)py, (float)pz);
                    x = Math.Cos(theta1) * Math.Cos(theta3);
                    y = Math.Sin(theta1);
                    z = Math.Cos(theta1) * Math.Sin(theta3);
                    px = basePoint.X + radius * x;
                    py = basePoint.Y + radius * y;
                    pz = basePoint.Z + radius * z;
                    points[next++] = new Vector((float)px, (float)py, (float)pz);
                }
            }
        }

        public override Trigon[] Triangulation()
        {
            List<Trigon> trigons = new List<Trigon>();

            int next = 0;
            for (int j = 0; j < n / 2; j++)
            {
                Vector[] quad = new Vector[2 * (n + 1)];
                int k = 0;
                for (int i = 0; i <= n; i++)
                {
                    quad[k++] = points[next++];
                    quad[k++] = points[next++];
                }
                try
                {
                    trigons.AddRange(new QuadStrip(quad, color).Triangulation());
                }
                catch { }
            }

            Trigon[] array = new Trigon[trigons.Count];
            trigons.CopyTo(array);

            return array;
        }
    }



--------------------
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.