Форум: "Прочее";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];
ВнизПомогите решить, плиз? Найти похожие ветки
← →
AKE (2010-06-24 23:28) [0]Есть плоскость Ax+By+Cz + D = 0
Есть вектор {i, j, k}, лежащий в плоскости
Как найти вектор {a, b, c}, перпендикулярный вектору
{i, j, k} и тоже лежащий в плоскости...
← →
Rouse_ © (2010-06-24 23:30) [1]На асме решение пойдет? :)
← →
AKE (2010-06-24 23:32) [2]Rouse_ © (24.06.10 23:30) [1]
Нет лучше на Си.
Я вот кое что набрасал. Возможно функцию за денежку некоторую...#include "math.h"
struct T3DPoint{
double x;
double y;
double z;
};
struct Vector{
double i;
double j;
double k;
};
//Plane - coeffs of plane Ax+By+Cz+D=0
struct Plane{
double A;
double B;
double C;
double D;
};
Plane GetPlane(T3DPoint P1, T3DPoint P2, T3DPoint P3)
{
double A1 = (P2.y - P1.y)*(P3.z - P1.z)-(P3.y - P1.y)*(P2.z - P1.z);
double A2 = (P2.x - P1.x)*(P3.z - P1.z)-(P3.x - P1.x)*(P2.z - P1.z);
double A3 = (P2.x - P1.x)*(P3.y - P1.y)-(P3.x - P1.x)*(P2.y - P1.y);
Plane P;
P.A = A1;
P.B = -A2;
P.C = A3;
P.D = -P1.x*A1+P1.y*A2-P1.z*A3;
return P;
}
T3DPoint SetPoint(double x, double y, double z)
{
T3DPoint P;
P.x = x;
P.y = y;
P.z = z;
return P;
}
Vector SetVector(double i, double j, double k)
{
Vector V;
V.i = i;
V.j = j;
V.k = k;
return V;
}
← →
AKE (2010-06-24 23:33) [3]
//Normal vector to one vector, both lie in Plane
Vector NormalVectorInPlane(Plane P, Vector v)
{
Vector V;
double a = v.i;
double b = v.j;
double c = v.k;
double A = P.A;
double B = P.B;
double C = P.C;
double K1 = -a;
double K2 = -A;
V.i = 1;
if (B == 0)
{
if (C != 0)
{
V.k = - A/C;
if (b != 0)
{
V.j = (K1-V.k*c)/b;
} else
{
V.j = 1;
}
} else
{
}
}
else
{
if ((C*B-b*C) != 0)
{
V.k = (K1*B - K2*b)/(C*B - b*C);
} else
{
V.k = 1;
if (b == 0)
{
V.j = 1;
} else
{
V.j = (K1 - C)/b;
}
}
}
return V;
}
← →
AKE (2010-06-24 23:33) [4]Только работает не правильно...
← →
Rouse_ © (2010-06-24 23:34) [5]Ну студии у меня дома нема...
← →
AKE (2010-06-24 23:36) [6]Rouse_ © (24.06.10 23:34) [5]
Ну студии у меня дома нема...
Спасибо за ответ
← →
AKE (2010-06-24 23:37) [7]Rouse_ © (24.06.10 23:34) [5]
А может и на паскале?
← →
Rouse_ © (2010-06-24 23:39) [8]Да я ж писать то вечером не собираюсь :)
так просто валялась где-то подборка математики на асме с алголиба (как-то так сайт назывался)
← →
turbouser © (2010-06-24 23:42) [9]algolist.manual.ru
← →
AKE (2010-06-24 23:42) [10]Rouse_ © (24.06.10 23:39) [8]
С асмом разбираться лень, но если
не жалко может кинешь?
← →
RWolf © (2010-06-24 23:44) [11]все три вектора друг другу перпендикулярны — значит, любой из них находится векторным произведением двух остальных, с точностью до знака.
речь о векторах длины 1, конечно.
← →
AKE (2010-06-24 23:55) [12]RWolf © (24.06.10 23:44) [11]
То есть
{A,B,C}*{i, j, k} получиться искомый вектор?
← →
RWolf © (2010-06-24 23:57) [13]
> AKE (24.06.10 23:55) [12]
ага; а с минусом будет ещё один.
← →
AKE (2010-06-24 23:58) [14]RWolf © (24.06.10 23:57) [13]
Спасибо огромное...
← →
AKE (2010-06-25 00:19) [15]Вот что получилось
Vector NormalVectorInPlane(Plane P, Vector v)
{
Vector V;
double a1 = v.i;
double a2 = v.j;
double a3 = v.k;
double b1 = P.A;
double b2 = P.B;
double b3 = P.C;
V.i = a2*b3 - b2*a3;
V.j = b1*a3 - a1*b3;
V.k = a1*b2 - b1*a2;
return V;
}
← →
Ega23 © (2010-06-25 00:58) [16]1. Берёшь нормаль к плоскости.
2. Перемножаешь (векторно!) с исходным вектором.
3. Получаешь искомый.
4. Умножаешь на -1, получаешь второй искомый.
5. .....
6. PROFIT!
← →
AKE (2010-06-25 01:20) [17]Ega23 © (25.06.10 00:58) [16]
Спасибо, это уже было разобрано ранее...
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c