Обновление значений переменных, прежде чем я дам эту инструкцию - PullRequest
0 голосов
/ 02 апреля 2019

Я заранее прошу прощения за этот способ длинного поста. Я работаю над функцией C #, чтобы объединить ориентацию треугольников меша для проекта Unity3D. Я использую тип Vector3, который представляет собой структуру, составленную из float array [3].

Чтобы сделать это, я беру первый треугольник и проверяю, указывает ли он наружу или внутрь. После этого я проверяю наличие наименьшего и проверяю порядок индексов треугольника. Если я нахожу пару индексов в порядке, я переворачиваю их. вот пример:

  • индексы базового треугольника: 1 2 3
  • индексы второго треугольника:
    • 1 2 4 (1 2 в том же порядке, что и базовый треугольник, необходимо переключиться на 2 1 4)
    • 4 2 1 (2 1 не в том же порядке, то ничего не делать)

Проверка возвращает мне следующий треугольник, чтобы проверить, найдет ли он; в противном случае он возвращает нулевой вектор.
если «next» не равно NULL, я делаю «следующий» треугольник для «current», я сохраняю фиксированный треугольник в переменной, чтобы программа не продолжала проверять одни и те же индексы и повторяла проверку.

Проблема в том, что некоторая переменная обновляет свои значения до того, как инструкция испортит мои условия.

Как вы можете видеть в приведенном ниже коде, у меня есть действительно сложный оператор If, который пытается найти, присутствуют ли два треугольника в одном и том же порядке (необязательно в одной и той же позиции), например:

1 2 3 (base)

все следующие возможные результаты необходимо перевернуть на

1 2 4 -> 2 1 4
4 1 2 -> 1 4 2
2 4 1 -> 4 2 1

, что минус перед mesh.Index[] необходим, потому что он использует IndexList значения вместо mesh.Index, и я не знаю почему.

Я использую эту пользовательскую структуру для тестирования программы вне Unity

public struct SimplifiedMesh
{
    //this stores the order of the vertices needed to 
    //create all the triangles of the mesh.
    public int[] Index; 
    it list all the vertices of the mesh
    public Vector3[] Vertex;
};

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

int[] IndexList = new int[Unimesh.Index.Length]; IndexList = Unimesh.Index;

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

FirstCheck(Unimesh, CentreofMesh, currentIndices);

//this will tell the program this triad is already checked
IndexList[currentIndices[0]] *= -1;
IndexList[currentIndices[0] + 1] *= -1;
IndexList[currentIndices[0] + 2] *= -1;

Следующее сейчас самое сложное. Вот легенда переменных:

  • currentIndices - это Array[3], хранящий позицию трех индексов последнего проверенного треугольника в массиве mesh.Index. Он используется, чтобы найти один;
  • next - это возвращаемая переменная, которая возвращает следующий вектор, который будет рассматриваться для проверки, или ноль, если он не нашел никаких треугольников.
  • mesh.Index[currentIndices[0-1-2] - текущие индексы
  • FlipNormals получите индексы сетки, перейдите к трем индексам, указанным «Flipvector», и поменяйте местами первые два, инвертировав их порядок

и вот код

static int[] AdiacentFace(SimplifiedMesh mesh, int[] IndexList, int[] currentIndices)
{
    int[] next = new int[3];
    for (int i = 0; i < IndexList.Length; i += 3)
    {
        if (IndexList[i] > 0 || IndexList[i + 1] > 0)
        {
            if
              // e restituisce la nuova terna modificata
                ((IndexList[i] == -mesh.Index[currentIndices[0]] && (IndexList[i + 1] == -mesh.Index[currentIndices[1]] || IndexList[i + 2] == -mesh.Index[currentIndices[2]])) ||
                (IndexList[i + 1] == -mesh.Index[currentIndices[0]] && (IndexList[i + 2] == -mesh.Index[currentIndices[1]] || IndexList[i] == -mesh.Index[currentIndices[2]])) ||
                (IndexList[i + 2] == -mesh.Index[currentIndices[0]] && (IndexList[i] == -mesh.Index[currentIndices[1]] || IndexList[i + 1] == -mesh.Index[currentIndices[2]])))
            {
                int[] Flipvector = new int[3];
                Flipvector[0] = mesh.Index[i];
                Flipvector[1] = mesh.Index[i+1];
                Flipvector[2] = mesh.Index[i + 2];
                FlipNormals(mesh, Flipvector);
                // Elimina la terna per i successivi controlli
                IndexList[i] *= -1;
                IndexList[i + 1] *= -1;
                IndexList[i + 2] *= -1;
                // Ritorna gli indici del nuovo vettore
                next[0] = i;
                next[1] = i + 1;
                next[2] = i + 2;
                return next;
            }
            else if
            ((IndexList[i] == -mesh.Index[currentIndices[0]] && (IndexList[i + 2] == -mesh.Index[currentIndices[1]] || IndexList[i + 1] == -mesh.Index[currentIndices[2]])) ||
            (IndexList[i + 1] == -mesh.Index[currentIndices[0]] && (IndexList[i] == -mesh.Index[currentIndices[1]] || IndexList[i + 2] == -mesh.Index[currentIndices[2]])) ||
            (IndexList[i + 2] == -mesh.Index[currentIndices[0]] && (IndexList[i + 1] == -mesh.Index[currentIndices[1]] || IndexList[i] == -mesh.Index[currentIndices[2]])))
            {
                // Elimina la terna per i successivi controlli
                IndexList[i] *= -1;
                IndexList[i + 1] *= -1;
                IndexList[i + 2] *= -1;
                // Ritorna gli indici del nuovo vettore
                next[0] = i;
                next[1] = i + 1;
                next[2] = i + 2;
                return next;
            }
        }
    }
    next = null;
    return next;
}

1 Ответ

0 голосов
/ 03 апреля 2019

Я нашел решение. Я новичок в C #, и я не знал, что операция «IndexList = Unimesh.Index» между массивами передает ссылку, а не отдельные значения. Мне удалось решить проблему таким образом. От:

int[] IndexList = new int[Unimesh.Index.Length]; Indexlist = Unimesh.Index;

до:

int[] IndexList = new int[Unimesh.Index.Length];
For (int i = 0; i < Unimesh.Index.Length; i++)
    {
    IndexList[i] = Unimesh.Index[i];
    }

Таким образом я копирую только значения, а не ссылку на массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...