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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2015, 20:34   #1
schack
Новичок
Джуниор
 
Регистрация: 18.04.2015
Сообщений: 2
По умолчанию Заданы точки в 3-мерном пространстве А(12.1,-3.1, -11.7) В(3.3,-8.7,9.9) С(6.9,22.7,5.1) D(10.9,-5.5,13.8) Определить объём образо

Заданы точки в 3-мерном пространстве А(12.1,-3.1, -11.7) В(3.3,-8.7,9.9) С(6.9,22.7,5.1) D(10.9,-5.5,13.8) Определить объём образованной фигуры с++ нужна прога
schack вне форума Ответить с цитированием
Старый 19.04.2015, 02:28   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

сколько платите и какие сроки?
p51x вне форума Ответить с цитированием
Старый 19.04.2015, 12:35   #3
schack
Новичок
Джуниор
 
Регистрация: 18.04.2015
Сообщений: 2
По умолчанию

нужна прога

200 сотки до послезавтра

200 до послезавтра

V=0;

1.1.Задаем уравнение плоскости ADC , т.е. S1
1.2.Задаем уравнение плоскости ACB , т.е. S2
1.3.Задаем уравнение плоскости ABD , т.е. S3
1.4.Задаем уравнение плоскости BDC , т.е. S4

2.Организуем тройной цикл для каждой точки куба в который вписана фигура ABCD ,т.е. i = -25, i <= 25, i++ для каждого тела циклов

3.Проверяем местоположение каждой точки А(i,l,k) относительно плоскостей S
3.1 если А(i,l,k) под S1
3.2 если А(i,l,k) под S2
3.3 если А(i,l,k) под S3
3.4 если А(i,l,k) над S4

4.Если А(i,l,k) удовлетворяет условиям 3.1-3.4 то V++

Результат V и будет объём образованной фигуры

Последний раз редактировалось Stilet; 18.05.2015 в 07:28.
schack вне форума Ответить с цитированием
Старый 18.05.2015, 00:23   #4
sklees
Пользователь
 
Регистрация: 21.04.2013
Сообщений: 23
По умолчанию ответ: 10352

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//ввод данных  //A(12.1,-3.1,-11.7)В(3.3,-8.7,9.9)С(6.9,22.7,5.1)D(10.9,-5.5,13.8)
StaticArray<float, 3>A;
	A[0] = 12.1;
	A[1] = -3.1;
	A[2] = -11.7;
StaticArray<float, 3>B;
	B[0] = 3.3;
	B[1] = -8.7;
	B[2] = 9.9;
StaticArray<float, 3>C;
	C[0] = 6.9;
	C[1] = 22.7;
	C[2] = 5.1;
StaticArray<float, 3>D;
	D[0] = 10.9;
	D[1] = -5.5;
	D[2] = 13.8;
//подстановка значений 1 треугольник ABC
float x11 = A[0];
float y11 = A[1];
float z11 = A[2];
float x12 = B[0];
float y12 = B[1];
float z12 = B[2];
float x13 = C[0];
float y13 = C[1];
float z13 = C[2];
//подстановка значений 2 треугольник ACD
float x21 = A[0];
float y21 = A[1];
float z21 = A[2];
float x22 = C[0];
float y22 = C[1];
float z22 = C[2];
float x23 = D[0];
float y23 = D[1];
float z23 = D[2];
//подстановка значений 3 треугольник ABD
float x31 = A[0];
float y31 = A[1];
float z31 = A[2];
float x32 = B[0];
float y32 = B[1];
float z32 = B[2];
float x33 = D[0];
float y33 = D[1];
float z33 = D[2];
//подстановка значений 4 треугольник BCD
float x41 = B[0];
float y41 = B[1];
float z41 = B[2];
float x42 = C[0];
float y42 = C[1];
float z42 = C[2];
float x43 = D[0];
float y43 = D[1];
float z43 = D[2];
//параметры матрицы 1
float a12 = x12 - x11;
float b12 = y12 - y11;
float c12 = z12 - z11;
float a13 = x13 - x11;
float b13 = y13 - y11;
float c13 = z13 - z11;
//параметры матрицы 2
float a22 = x22 - x21;
float b22 = y22 - y21;
float c22 = z22 - z21;
float a23 = x23 - x21;
float b23 = y23 - y21;
float c23 = z23 - z21;
//параметры матрицы 3
float a32 = x32 - x31;
float b32 = y32 - y31;
float c32 = z32 - z31;
float a33 = x33 - x31;
float b33 = y33 - y31;
float c33 = z33 - z31;
//параметры матрицы 4
float a42 = x42 - x41;
float b42 = y42 - y41;
float c42 = z42 - z41;
float a43 = x43 - x41;
float b43 = y43 - y41;
float c43 = z43 - z41;
//параметры плоскости 1
float A1 = b12*c13 - b13*c12;
float B1 = c12*a13 - c13*a12;
float C1 = a12*b13 - a13*b12;
float D1 = -x11*A1 - y11*B1 - z11*C1;
//параметры плоскости 2
float A2 = b22*c23 - b23*c22;
float B2 = c22*a23 - c23*a22;
float C2 = a22*b23 - a23*b22;
float D2 = -x21*A2 - y21*B2 - z21*C2;
//параметры плоскости 3
float A3 = b32*c33 - b33*c32;
float B3 = c32*a33 - c33*a32;
float C3 = a32*b33 - a33*b32;
float D3 = -x31*A3 - y31*B3 - z31*C3;
//параметры плоскости 4
float A4 = b42*c43 - b43*c42;
float B4 = c42*a43 - c43*a42;
float C4 = a42*b43 - a43*b42;
float D4 = -x41*A4 - y41*B4 - z41*C4;
//вычисление перпендикуляра
Label1->Caption = FloatToStr(D1/sqrt(A1*A1+B1*B1+C1*C1+0.00001));
Label2->Caption = FloatToStr(D2/sqrt(A2*A2+B2*B2+C2*C2+0.00001));
Label3->Caption = FloatToStr(D3/sqrt(A3*A3+B3*B3+C3*C3+0.00001));
Label4->Caption = FloatToStr(D4/sqrt(A4*A4+B4*B4+C4*C4+0.00001));
//условия под-над
int signABC = 1;
if (D1 < 0) signABC = -1;
int signACD = 1;
if (D2 < 0) signACD = -1;
int signABD = 1;
if (D3 < 0) signABD = -1;
int signBCD = 1;
if (D4 < 0) signBCD = -1;
//вычисление объема
float V = 0;
ProgressBar1->Max = 35*35*35;
for (int i = -12; i < 23; i = i + 1)
for (int l = -12; l < 23; l = l + 1)
for (int k = -12; k < 23; k = k + 1){
 ProgressBar1->Position ++;
 if (signABC*(A1*i + B1*l + C1*k + D1) >= 0)
 if (signACD*(A2*i + B2*l + C2*k + D2) >= 0)
 if (signABD*(A3*i + B3*l + C3*k + D3) >= 0)
 if (signBCD*(A4*i + B4*l + C4*k + D4) >= 0) {
  V = V + 1;
 }
 }
 ShowMessage("Объем заданной фигуры равен " + FloatToStr(V));
}
//-----------------------------------------------------------------------
Результат для данной фигуры 10352
точность можно увеличить если V = V + 0.5 и циклы i=i+0.5 при увеличении длительности просчета

P.S. если вместо пирамиды просчитать шар то так и пи недолго высчитать

Последний раз редактировалось Stilet; 18.05.2015 в 07:28.
sklees вне форума Ответить с цитированием
Старый 02.10.2015, 00:38   #5
sklees
Пользователь
 
Регистрация: 21.04.2013
Сообщений: 23
По умолчанию коррекция кода

sorry - и не предполагал что т.О(0,0,0) не находится внутри фигуры
Построил по точкам тетрахедрон - нашел точку внутри по которой и строится вычисление - т.М(8.2, 3.0, 5.9)

Код:
//условия под-над
float MX = 8.2;
float MY = 3.0;
float MZ = 5.9;
float signABC = 1;
if ((A1*MX + B1*MY + C1*MZ + D1) < 0) signABC = -1;
float signACD = 1;
if ((A2*MX + B2*MY + C2*MZ + D2) < 0) signACD = -1;
float signABD = 1;
if ((A3*MX + B3*MY + C3*MZ + D3) < 0) signABD = -1;
float signBCD = 1;
if ((A4*MX + B4*MY + C4*MZ + D4) < 0) signBCD = -1;
sklees вне форума Ответить с цитированием
Старый 05.10.2015, 09:24   #6
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

skless. прошу тебя не пиши так код никогда.
Автору
Формула для расчёта
Цитата:
V = ((X₂-X₁)*(Y₃-Y₁)*(Z₄-Z₁) + (Y₂-Y₁)*(Z₃-Z₁)*(X₄-X₁) +
(Z₂-Z₁)*(X₃-X₁)*(Y₄-Y₁) + (Z₂-Z₁)*(Y₃-Y₁)*(X₄-X₁) +
(Y₂-Y₁)*(X₃-X₁)*(Z₄-Z₁) + (X₂-X₁)*(Z₃-Z₁)*(Y₄-Y₁))/6;
Реализация на С++

Код:
float VolumePiramide()
{
  float Ax = 12.1; float Ay = -3.1; float Az = -11.7;  
  float Bx = 3.3;   float By = -8.7; float Bz = 9.9;
  float Cx = 6.9;   float Cy = 22.7; float Cz = 5.1;
  float Dx = 10.9; float Dy = -5.5; float Dz = 13.8;

 return ((Bx-Ax)*(Cy-Ay)*(Dx-Az) + (By-Ay)*(Cz-Az)*(Dx-Ax) + 
     (Bz-Az)*(Cx-Ax)*(Dy-Ay) + (Bz-Az)*(Cy-Ay)*(Dx-Ax) + 
     (By-Ay)*(Cx-Ax)*(Dz-Az) + (Bx-Ax)*(Cz-Az)*(Dy-Ay))/6;
}
Проверить можно тут http://www.webmath.ru/web/prog8_1.php
Формула отсюда http://www.kakprosto.ru/kak-132609-k...dinaty-vershin
теория тут http://www.pm298.ru/reshenie/cmk4.php

удачи
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 14.10.2015, 01:55   #7
sklees
Пользователь
 
Регистрация: 21.04.2013
Сообщений: 23
По умолчанию точность

JUDAS, проверил, сравнил, сравнил по формуле и по методу итераций, точность метода итераций составила 0.44% что довольно-то и хорошо
прошу скорректировать
Код:
return ((Bx-Ax)*(Cy-Ay)*(Dz-Az) + (By-Ay)*(Cz-Az)*(Dx-Ax) + 
     (Bz-Az)*(Cx-Ax)*(Dy-Ay) - (Bz-Az)*(Cy-Ay)*(Dx-Ax) - 
     (By-Ay)*(Cx-Ax)*(Dz-Az) - (Bx-Ax)*(Cz-Az)*(Dy-Ay))/6;
sklees вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить объём оперативной памяти Janger Общие вопросы Delphi 4 30.09.2014 21:18
как определить наименьший нечетный элемент в двух мерном массиве ВДПУ Помощь студентам 13 27.05.2012 13:35
Вывести точки в 3-х мерном пространстве [Паскаль] Елена777Алиса Помощь студентам 4 08.12.2010 21:27