PDA

Просмотр полной версии : Стереометрия


BigDan
30.10.2006, 11:35
Делаю проэкт по математике(по стереометрии) во флеше.Так вот надо построить сечение в равносторонней триугольной пирамиде. Известны кординаты всех четырех вершин. Как зная эти кординаты потроить сечение?

etc
30.10.2006, 13:33
Вспомнить школьный курс геометрии.

BigDan
30.10.2006, 13:54
Вспомнить школьный курс геометрии.
Это не решает проблемы. Ведь на бумаге легче строить, чем на компе.

etc
30.10.2006, 14:15
Под школьным курсом я подразумевал формулы для вычисления сечения, а не рисование карандашом по бумаге.

wvxvw
30.10.2006, 16:46
тут только геометрией не обойдешься =) нужно еще немного алгебры =) Уравнение прямой, например.
ЗЫ. есть 2 способа. Матрицами и графами. Графами я не умею (не пробовал). А матрицами вроде не сложно =)

BigDan
30.10.2006, 20:33
Если не сложно, то реализацию подкиньте, пожалуйста.

wvxvw
30.10.2006, 21:41
у Гурского был пример с рисованием кубика в перспективе... кажется...
/* */


InitMovie();
InitScene();


/* InitMovie() initializes the global variables in the movie. Takes no parameters. */
function InitMovie() {
TransformMatrix = [[1,0,0], [0,1,0], [0,0,1], [0,0,0]];
f = 200;
moviewidth = 600;
movieheight = 400;
lines = 0;
curves = 0;
surfaces = 0;
}


/* InitScene() initializes the 3D scene, creating movie clips for each 3D object. Takes no parameters. */
function InitScene() {
createEmptyMovieClip("Scene", 1);
Scene._x = moviewidth/2;
Scene._y = movieheight/2;
make3Dobj("surface", [[[100,100,50], [100,-100,50], [0,0,50]], [[100,-100,50], [-100,-100,50]], [[-100,-100,50], [-100,100,50], [0,0,50]], [[-100,100,50], [100,100,50]]], 1, "0x000000", 0, "0xff0000", 100);
make3Dobj("surface", [[[100,100,30], [100,-100,30], [0,0,30]], [[100,-100,30], [-100,-100,30]], [[-100,-100,30], [-100,100,30], [0,0,30]], [[-100,100,30], [100,100,30]]], 1, "0x000000", 0, "0xff9900", 100);
make3Dobj("surface", [[[100,100,10], [100,-100,10], [0,0,10]], [[100,-100,10], [-100,-100,10]], [[-100,-100,10], [-100,100,10], [0,0,10]], [[-100,100,10], [100,100,10]]], 1, "0x000000", 0, "0xffff00", 100);
make3Dobj("surface", [[[100,100,-10], [100,-100,-10], [0,0,-10]], [[100,-100,-10], [-100,-100,-10]], [[-100,-100,-10], [-100,100,-10], [0,0,-10]], [[-100,100,-10], [100,100,-10]]], 1, "0x000000", 0, "0x00ff00", 100);
make3Dobj("surface", [[[100,100,-30], [100,-100,-30], [0,0,-30]], [[100,-100,-30], [-100,-100,-30]], [[-100,-100,-30], [-100,100,-30], [0,0,-30]], [[-100,100,-30], [100,100,-30]]], 1, "0x000000", 0, "0x0000ff", 100);
make3Dobj("surface", [[[100,100,-50], [100,-100,-50], [0,0,-50]], [[100,-100,-50], [-100,-100,-50]], [[-100,-100,-50], [-100,100,-50], [0,0,-50]], [[-100,100,-50], [100,100,-50]]], 1, "0x000000", 0, "0x660066", 100);
}


/* Create a 3D object using the parameters specified in function call. */
function make3Dobj(objtype, pointarray, lineweight, linecolour, linealpha, fillcolour, fillalpha) {
obj = Scene.createEmptyMovieClip(objtype + "_" + this[objtype + "s"], lines+curves+surfaces);
obj.pointarray = pointarray;
obj.lineweight = lineweight;
obj.linecolour = linecolour;
obj.linealpha = linealpha;
obj.fillcolour = fillcolour;
obj.fillalpha = fillalpha;
this[objtype + "s"] ++;
}


/* Render the Scene, loop through all of the 3D objects and draw them using points calculated from transformation matrix. Takes no parameters. */
function RenderScene() {
i = 0;
while (i <= lines-1) {
obj = Scene["line_"+i];
obj.clear();
obj.lineStyle(obj.lineweight, obj.linecolour, obj.linealpha);
point1 = MatrixVectorMultiply(TransformMatrix, obj.pointarray[0]);
point2 = MatrixVectorMultiply(TransformMatrix, obj.pointarray[1]);
obj.moveTo(point1[0]/(1-(point1[2]/f)), point1[1]/(1-(point1[2]/f)));
obj.lineTo(point2[0]/(1-(point2[2]/f)), point2[1]/(1-(point2[2]/f)));
camdist = Math.sqrt(Math.pow((point1[0]+point2[0])/2,2)+Math.pow((point1[1]+point2[1])/2,2)+Math.pow(f-((point1[2]+point2[2])/2),2));
obj.swapDepths(Math.pow(f,3)-(Math.floor(camdist*100)));
i ++;
}
i = 0;
while (i <= curves-1) {
obj = Scene["curve_"+i];
obj.clear();
obj.lineStyle(obj.lineweight, obj.linecolour, obj.linealpha);
point1 = MatrixVectorMultiply(TransformMatrix, obj.pointarray[0]);
point2 = MatrixVectorMultiply(TransformMatrix, obj.pointarray[1]);
point3 = MatrixVectorMultiply(TransformMatrix, obj.pointarray[2]);
obj.moveTo(point1[0]/(1-(point1[2]/f)), point1[1]/(1-(point1[2]/f)));
obj.curveTo(point3[0]/(1-(point3[2]/f)), point3[1]/(1-(point3[2]/f)), point2[0]/(1-(point2[2]/f)), point2[1]/(1-(point2[2]/f)));
camdist = Math.sqrt(Math.pow((point1[0]+point2[0]+point3[0])/3,2)+Math.pow((point1[1]+point2[1]+point3[1])/3,2)+Math.pow(f-((point1[2]+point2[2]+point3[2])/3),2));
obj.swapDepths(Math.pow(f,3)-(Math.floor(camdist*100)));
i ++;
}
i = 0;
while (i <= surfaces-1) {
obj = Scene["surface_"+i];
obj.clear();
obj.lineStyle(obj.lineweight, obj.linecolour, obj.linealpha);
obj.beginFill(obj.fillcolour, obj.fillalpha);
j = 0;
xsum = ysum = zsum = 0;
while (j <= obj.pointarray.length-1) {
if (j == 0) {
point1 = MatrixVectorMultiply(TransformMatrix, obj.pointarray[j][0]);
obj.moveTo(point1[0]/(1-(point1[2]/f)), point1[1]/(1-(point1[2]/f)));
xsum += point1[0];
ysum += point1[1];
zsum += point1[2];
}
if (obj.pointarray[j].length == 2) {
point2 = MatrixVectorMultiply(TransformMatrix, obj.pointarray[j][1]);
obj.lineTo(point2[0]/(1-(point2[2]/f)), point2[1]/(1-(point2[2]/f)));
xsum += point2[0];
ysum += point2[1];
zsum += point2[2];
} else {
point1 = MatrixVectorMultiply(TransformMatrix, obj.pointarray[j][0]);
point2 = MatrixVectorMultiply(TransformMatrix, obj.pointarray[j][1]);
point3 = MatrixVectorMultiply(TransformMatrix, obj.pointarray[j][2]);
obj.curveTo(point3[0]/(1-(point3[2]/f)), point3[1]/(1-(point3[2]/f)), point2[0]/(1-(point2[2]/f)), point2[1]/(1-(point2[2]/f)));
xsum += point1[0]+point2[0]+point3[0];
ysum += point1[1]+point2[1]+point3[1];
zsum += point1[2]+point2[2]+point3[2];
}
camdist = Math.sqrt(Math.pow((xsum)/(j+1),2)+Math.pow((ysum)/(j+1),2)+Math.pow(f-((zsum)/(j+1)),2));
obj.swapDepths(Math.pow(f,3)-(Math.floor(camdist*100)));
j ++;
}
obj.endFill();
i ++;
}
}


/* Sets the global transformation matrix using matrix multiplication routine. Temporary transformation matrix generated from x, y, z coordinates passed as parameters. */
function SetTransformMatrix(x, y, z, M) {
vectorLength = Math.sqrt(x*x+y*y+z*z);
if (vectorLength>.0001) {
x /= vectorLength;
y /= vectorLength;
z /= vectorLength;
Theta = vectorLength/500;
cosT = Math.cos(Theta);
sinT = Math.sin(Theta);
tanT = 1-cosT;
T =[[], [], []];
T[0][0] = tanT*x*x+cosT;
T[0][1] = tanT*x*y-sinT*z;
T[0][2] = tanT*x*z+sinT*y;
T[1][0] = tanT*x*y+sinT*z;
T[1][1] = tanT*y*y+cosT;
T[1][2] = tanT*y*z-sinT*x;
T[2][0] = tanT*x*z-sinT*y;
T[2][1] = tanT*y*z+sinT*x;
T[2][2] = tanT*z*z+cosT;
TransformMatrix = MatrixMatrixMultiply(T, M);
}
}


/* Performs a matrix-matrix multiplication with matrix A and matrix B parameters. Returns matrix C as result. */
function MatrixMatrixMultiply(A, B) {
C = [[], [], []];
C[0][0] = A[0][0]*B[0][0]+A[0][1]*B[1][0]+A[0][2]*B[2][0];
C[0][1] = A[0][0]*B[0][1]+A[0][1]*B[1][1]+A[0][2]*B[2][1];
C[0][2] = A[0][0]*B[0][2]+A[0][1]*B[1][2]+A[0][2]*B[2][2];
C[1][0] = A[1][0]*B[0][0]+A[1][1]*B[1][0]+A[1][2]*B[2][0];
C[1][1] = A[1][0]*B[0][1]+A[1][1]*B[1][1]+A[1][2]*B[2][1];
C[1][2] = A[1][0]*B[0][2]+A[1][1]*B[1][2]+A[1][2]*B[2][2];
C[2][0] = A[2][0]*B[0][0]+A[2][1]*B[1][0]+A[2][2]*B[2][0];
C[2][1] = A[2][0]*B[0][1]+A[2][1]*B[1][1]+A[2][2]*B[2][1];
C[2][2] = A[2][0]*B[0][2]+A[2][1]*B[1][2]+A[2][2]*B[2][2];
return C;
}


/* Performs a matrix-vector multiplication with matrix A and vector B parameters. Returns vector C as result. */
function MatrixVectorMultiply(A, B) {
C = [];
C[0] = A[0][0]*B[0]+A[0][1]*B[1]+A[0][2]*B[2];
C[1] = A[1][0]*B[0]+A[1][1]*B[1]+A[1][2]*B[2];
C[2] = A[2][0]*B[0]+A[2][1]*B[1]+A[2][2]*B[2];
return C;
}
Этому примеру сто лет в обед... но чет ничего другого не нашел...

BigDan
30.10.2006, 23:31
У меня есть Гурский и его исходники. Опять же это не решает проблемы. Я не прошу нарисовать объемную фигуру, а прошу объяснить как построить сечение.

FourSide
31.10.2006, 12:42
Честно признаться, но я не понимаю, про какое именно сечение идёт речь. Ведь сечений (фактически, плоскостей) через пирамиду может идти бесконечное множество.
Про какое именно сечение идёт речь?

BigDan
31.10.2006, 12:45
Честно признаться, но я не понимаю, про какое именно сечение идёт речь. Ведь сечений (фактически, плоскостей) через пирамиду может идти бесконечное множество.
Про какое именно сечение идёт речь?
Хотя б одно. Вся задача сводится к тому, что надо узнать кординаты 4 точек через которые будет проходить сечение.

miramax
31.10.2006, 12:54
Твоей задаче нужно частное решение частного случая. Довольно не просто будет её решить, врядли кто-то на форуме будет выкладываться по полной, что бы дать тебе готовый рецепт

BigDan
31.10.2006, 13:03
Ну может кто раньше делал, или где-то видел, подкиньте исходник.

FourSide
31.10.2006, 15:46
Хотя б одно. Вся задача сводится к тому, что надо узнать кординаты 4 точек через которые будет проходить сечение.
Сразу еще одно уточнение - в треугольной пирамиде (пирамида с основанием в виде треугольника) пересечение с её ребрами будет иметь 3 точки.

По сути (примерное решение, но возможно неправильное) - мы знаем координаты всех вершин. Допустим, точка А - верхушка пирамиды, а точки Б,С и Д - вершины основания. Тогда пересечение будет иметь точки, рандомно лежащие на отрезках АБ, АС и АД.

Пояснение: Если мы знаем две вершины, то мы можем провести прямую через них (формулу уравнения можно найти в инете). Отсюда и находим рандомное значение между двумя точками.

Вобщем, теоретически не очень сложно, просто начертить примерно на бумажке, понять суть, найти все формулы и отрисовать.

BigDan
31.10.2006, 16:17
Ладно. Будем работать.....

kruasan
31.10.2006, 16:57
Если ты все знаешь о вершинах пирамиды и о плоскости, пересекающей ее, то по сути у тебя на руках 6 уравнений прямой и одно уравнение плоскости. Находишь точки пересечения каждой прямой с плоскостью и получаешь необходимые вершины.

Тебе в учебник по стереометрии (9 или 10 или 11-й класс, не помню)
1. Уравнения плоскости
2. Уравнение прямой, проходящей через 2 заданные точки

По алгебре:
Системы линейных уравнений.

wvxvw
31.10.2006, 18:40
2 FourSide:
Не путай человека, точек может быть и четыре =) Одна плоскость может пересекать 2 другие пересекающиеся плоскости так, что при этом получатся 2 непересекающиеся прямые =)

valvika
01.11.2006, 13:18
Я знаю точно как это сделать. Делал давно и на другом языке кодировки. Ессно исходника нет. Но в голове остался жив алгоритм. Я помогу если нужно, Но код писать будешь сам.
Исходные данные:
Треугольная ( не важно - будет работать с любой п-угольной ) пирамида SABC (S-вершина ).
Три точки M,N,P - нужно задать каким 3-м плоскостям они принадлежат ( точки могут не лежать на ребрах, если они лежат в 2-х или одной плоскости - задача упростится ).
Необходимо сразу определить плоскость в которой не лежит ни одной точки из M,N,P.
Нужно также определить точку пересечения ( одну из S,A,B,C ) в которой пересекаются именно те три плоскости которым принадлежат M,N,P.
Разработай ( возьми готовую ) функцию нахождения уравнения прямой, проходящей через две заданные точки.
Разработай функцию нахождения точки пересечения двух прямых.
Разработай функцию нахождения точки пересечения прямой и плоскости( плоскость задана трамя точками, прямая - двумя или уравнением ).
Сделай проект с этими исходными данными, я посмотрю и мы продолжим, если заинтересован.
ЗЫ. Если хотя бы одна из точек M,N,P не лежит на ребрах, то придется строить дополнительные плоскости.
ЗЫ. Не надейся, что эта работа на 2 часа, скорее на два дня.

Еще по теме. Штуку эту лучше сделать под мобильные устройства и дать возможность закачки, скажем за 0,5wmz. Школьники будут рады. Через год отобьешь затраты труда и получишь прибыль. Эта тема изучается на старте Стереометрии и дается тяжеловато. Сорри, личное мнение.

valvika
01.11.2006, 14:51
Цитата из удаленного сообщения:
Я думал что плоскость должна быть четырехугольная, а не трёх-..
Плоскость не бывает четырехугольной или трехугольной. Плоскость задается в пространстве тремя точками.
Вы имеете ввиду четырехугольник лежащий на плоскости?

Отсутствие элементарных понятий в математике делает бесполезным обсуждение путей разработки проекта.