У меня проблема с треугольной конструкцией области. Все границы и неравенства правильные, но возникает непрерывная восходящая линия. Проверил код и алгоритмы, нет ошибок. Возможно, причина в дополнительной вершине в файле 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