Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2023, 00:08   #1
himecu
Пользователь
 
Регистрация: 09.12.2021
Сообщений: 32
По умолчанию Проблема с треугольной конструкцией: линия продолжает непрерывно подниматься

У меня проблема с треугольной конструкцией области. Все границы и неравенства правильные, но возникает непрерывная восходящая линия. Проверил код и алгоритмы, нет ошибок. Возможно, причина в дополнительной вершине в файле STL. Нужна помощь для решения проблемы. Прилагаю код и изображение:
Код:
void Not_borderline(int**& T,int size_T,double*& X,double* &Y,int q ) {
 
    int sizeT = size_T * q * q;
    int** newT = new int*[sizeT];
    for (int i = 0; i < sizeT; i++) {
        newT[i] = new int[3];
    }
    double* NewX = new double[size_T * ((q+2) * (q+1)/2)];
    double* NewY = new double[size_T * ((q+2) * (q+1)/2)];
    int numbDot = 0;
    int numbRect = 0;
    double* ACDX = new double[q - 1]; //точки на прямой АС
    double* ACDY = new double[q - 1];
    double* ABDX = new double[q - 1]; // на прямой AB
    double* ABDY = new double[q - 1];
    double* internal_points_X = new double[(q - 1) * q / 2];
    double* internal_points_Y = new double[(q - 1) * q / 2];
    for (int i = 0; i < size_T; i++) //главный цикл обраотки всех треугольников
    {
        Point a, b, c;
        a.x = X[T[i][0]];
        a.y = Y[T[i][0]];
        b.x = X[T[i][1]];
        b.y = Y[T[i][1]];
        c.x = X[T[i][2]];
        c.y = Y[T[i][2]];
 
        Point vectorAC;
        vectorAC.x = c.x - a.x;
        vectorAC.y = c.y - a.y;//напр вектор АС
 
        Point vectorAB;
        vectorAB.x = b.x - a.x;
        vectorAB.y = b.y - a.y;//напр вектор BС
        
       
        for (int i = 0; i < q - 1; i++) {
            ACDX[i] = ((i + 1) * vectorAC.x / q) + a.x;
        }
       
        for (int i = 0; i < q - 1; i++) {
            ACDY[i] = ((i + 1) * vectorAC.y / q) + a.y;
        }
        
        for (int i = 0; i < q - 1; i++) {
            ABDX[i] = ((i + 1) * vectorAB.x / q) + a.x;
        }
       
        for (int i = 0; i < q - 1; i++) {
            ABDY[i] = ((i + 1) * vectorAB.y / q) + a.y;
        }//заполняем массивы точками лежащими на прямых ас и бс
 
        int k = 0;
        Point vectorABDACD;
        for (int i = 1; i < q; i++) {
            if (i != q - 1) {
                vectorABDACD.x = ACDX[i] - ABDX[i];
                vectorABDACD.y = ACDY[i] - ABDY[i];//вектор прямой между точками на AB и AC
            }
            else {
                vectorABDACD.x = c.x-b.x;
                vectorABDACD.y = c.y - b.y;
            }
            for (int j = 0; j < i; j++) {
                if (i != q - 1) {
                    internal_points_X[k] = ABDX[i] + (j+1)*vectorABDACD.x/(i+1);
                    internal_points_Y[k] = ABDY[i] + (j + 1)* vectorABDACD.y / (i + 1);
                }
                else {
                    internal_points_X[k] = b.x + (j + 1) * vectorABDACD.x / (i + 1);
                    internal_points_Y[k] =b.y + (j + 1) * vectorABDACD.y / (i + 1); //точки на прямых между точками на AB и AC
                }
                k++;
            }
 
        }
        int numbDotTEMP = numbDot;
        NewX[numbDot] = a.x;
        NewY[numbDot] = a.y;
        newT[numbRect][0] = numbDot;
        numbDot++;
        NewX[numbDot] = ABDX[0];
        NewY[numbDot] = ABDY[0];
        newT[numbRect][1] = numbDot;
        numbDot++;
        NewX[numbDot] = ACDX[0];
        NewY[numbDot] = ACDY[0];
        newT[numbRect][2] = numbDot;
        numbDot++;
        numbRect++;
        k = 0;
        for (int i = 1; i < q; i++) {
            if (i != q - 1) {
                NewX[numbDot] = ABDX[i];
                NewY[numbDot] = ABDY[i];
                numbDot++;
            }
            else {
                NewX[numbDot] = b.x;
                NewY[numbDot] = b.y;
                numbDot++;
            }
            
            for (int j = 0; j < i; j++) {
                NewX[numbDot] = internal_points_X[k];
                NewY[numbDot] = internal_points_Y[k];
                k++;
                numbDot++;
            }
            if (i != q - 1) {
                NewX[numbDot] = ACDX[i];
                NewY[numbDot] = ACDY[i];
                numbDot++;
            }
            else {
                NewX[numbDot] = c.x;
                NewY[numbDot] = c.y;
                numbDot++;
            }
 
        }
        numbDotTEMP++;
 
        for (int i = 0; i < q - 1; i++) {
            for (int j = 0; j < 2 + i; j++) {
                newT[numbRect][0] = numbDotTEMP;
                newT[numbRect][1] = numbDotTEMP + 2 + i;
                newT[numbRect][2] = numbDotTEMP + 3 + i;
                cout << numbDotTEMP << "x=" << NewX[numbDotTEMP] << "     y=" << NewY[numbDotTEMP]<< " " << numbDotTEMP + 2 + i<<"x=" << NewX[numbDotTEMP + 2 + i] << "     y=" << NewY[numbDotTEMP + 2 + i] << " " << numbDotTEMP + 3 + i<< "x=" << NewX[numbDotTEMP + 3 + i] << "     y=" << NewY[numbDotTEMP + 3 + i] << endl;
                numbRect++;
                if (j > 0) {
                    newT[numbRect][0] = numbDotTEMP - 1;
                    newT[numbRect][1] = numbDotTEMP;
                    newT[numbRect][2] = numbDotTEMP + 2 + i;
                    cout << numbDotTEMP-2 << "x=" << NewX[numbDotTEMP - 2] << "     y=" << NewY[numbDotTEMP - 2] << " " << numbDotTEMP-1 << "x=" << NewX[numbDotTEMP - 1] << "     y=" << NewY[numbDotTEMP - 1] << " " << numbDotTEMP + 1 + i << "x=" << NewX[numbDotTEMP + 1 + i] << "     y=" << NewY[numbDotTEMP + 1 + i] << endl;
                    numbRect++;
                }
                numbDotTEMP++;
            }
        }
        
    }
    
    delete[] ACDX;
    delete[] ABDX;
    delete[] ACDY;
    delete[] ABDY;
    delete[] internal_points_X;
    delete[] internal_points_Y;
    for (int i = 0; i < size_T; i++) {
        delete[] T[i];
    }
    delete[] T;
    delete[] X;
    delete[] Y;
    T = newT;
    X = NewX;
    Y = NewY;
}
// Ограничивающие неравенства:
double F1(double x) {
    return x;
}
double G1(double x) {
    return pow(x,2);
}
 
int main()
{   
    // Массивы с координатами:  
    double* X = new double[(n + 1) * (m + 1)];
    double* Y = new double[(n + 1) * (m + 1)];
 
    int i, j;
    int q = 3;
    int p = 2 * n * m;
    int** T = new int* [p]; // Массив вершин.
 
    // Формирование сетки поверхности:
    int k = 0;
    for (i = 0; i <= n; i++) {
        for (j = 0; j <= m; j++) {
            X[k] = a + i * (b - a) / n;
            k++;
        }
    }
 
    k = 0;  
    for (i = 0; i <= n; i++) {
        for (j = 0; j <= m; j++) {
            Y[k] = F1(X[i * (n + 1)]) + (G1(X[i * (n + 1)]) - F1(X[i * (n + 1)])) * j / m;
            k++;
        }
    }
    // Выделим память под массив вершин:
    for (i = 0; i < p; i++) {
        T[i] = new int[3];
    }
    
    // Заолнение массива вершин:
    k = 0;
    for (i = 0; i <= n - 2; i++) {
        for (j = 0; j <= m - 1; j++) {
            T[k][0] = (m + 1) * i + j;
            T[k][1] = (m + 1) * (i + 1) + j;
            T[k][2] = (m + 1) * (i + 1) + j + 1;
            k++;
    
            T[k][0] = (m + 1) * i + j;
            T[k][1] = (m + 1) * (i + 1) + j + 1;
            T[k][2] = (m + 1) * (i)+j + 1;
            k++;
        }
    }
    
    i = n - 1;
    for (j = 0; j <= m - 1; j++) {
        T[k][0] = (m + 1) * i + j;
        T[k][1] = j;
        T[k][2] = j + 1;
        k++;
 
        T[k][0] = (m + 1) * i + j;
        T[k][1] = j + 1;
        T[k][2] = (m + 1) * (i)+j + 1;
        k++;
    }   
 
    // Выполним триангуляцию поверхности:
    Not_borderline(T, 2 * n * m, X, Y,3);
    // Выполним сохранение в файл:
    savetostl(X, Y, T,2*n*m*q); 
}
Сама триангуляционная область при неравенствах y>1 и y<4:
Снимок.PNG
himecu вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
непрерывно проигрывать файл .wav digitalis Мобильные ОС (Android, iOS, Windows Phone) 9 29.05.2020 10:56
Не могу разобраться с SQL запросом точнее с конструкцией if then else Pykhov БД в Delphi 15 27.08.2013 09:56
Популярность Delphi продолжает расти Rik Обсуждение статей 1 25.08.2011 14:39
Движение в треугольной комнате i.yakushev Помощь студентам 8 04.05.2011 20:20
Регистрация непрерывно поступающих данных Stepanru Microsoft Office Excel 2 02.04.2010 11:11