Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / попадание точки внутрь трёхмерного симплекса

попадание точки внутрь трёхмерного симплекса

Страницы: 1 2 3 4 5 6 7 Следующая »
glukhПостоялецwww15 ноя. 20125:07#0
Народ подскажите библиотеку для С (не С++) в которой есть такая функция:
Задан трёхмерный сиплекс координатами четырёх точек.
a1(x1, y1, z1), a2(x2, y2, z2), a3(x3, y3, z3), a3(x3, y3, z3)
Необходимо определить находится ли точка с координатами b(x, y, z) внутри симплекса или снаружи.

Только пожалуйста, не нужно мне объяснять как это сделать, я это и без вас прекрасно знаю, мне нужна конкретная рабочая написанная функция на чистом Си, и если вы не знаете где её раздобыть не пишите лучше ни чего, спасибо!

SuslikМодераторwww15 ноя. 20125:20#1
glukh
  float side0 = mixed_product(sub(points[1], points[0]), sub(points[2], points[0]), sub(testPoint, points[0]));
  float side1 = mixed_product(sub(points[2], points[0]), sub(points[3], points[0]), sub(testPoint, points[0]));
  float side2 = mixed_product(sub(points[3], points[0]), sub(points[1], points[0]), sub(testPoint, points[0]));
  float side3 = mixed_product(sub(points[3], points[1]), sub(points[2], points[1]), sub(testPoint, points[1]));
  if (side0 * side1 < 0) return 0;
  if (side1 * side2 < 0) return 0;
  if (side2 * side3 < 0) return 0;

  return 1;

библиотека называется suslib, платная. мне нужны 100% от миллионов, которые ты заработаешь.
glukhПостоялецwww15 ноя. 20126:06#2
Suslik
ты издеваешься? код функций sub() и mixed_product() хде? :(...
мне нужны 100% от миллионов, которые ты заработаешь

:) 100% не гарантирую, но в списке литературы и соавторов появишься точно...
SuslikМодераторwww15 ноя. 20126:12#3
glukh
> код функций sub() и mixed_product() хде? :(...
попробуй посмотреть в учебнике геометрии за восьмой класс.
Vector3 sub(const Vector3 a, const Vector3 b)
{
  Vector3 res;
  res.x = a.x - b.x;
  res.y = a.y - b.y;
  res.z = a.z - b.z;
}
float mixed_product(const Vector3 a, const Vector3 b, const Vector3 c)
{
  return a.x * b.y * c.z + a.y * b.z * c.x + b.x * c.y * a.z - a.z * b.y * c.x - a.y * b.x * c.z - a.x * b.z * c.y;
}

я настаиваю на 100% от миллионов. библиотека называется suslib, чтобы был копирайт. проверю. написал только что в браузере, так что мог где-нибудь знак перепутать.
glukhПостоялецwww15 ноя. 20127:17#4
Suslik
ну походу работает! Спасибо! Кинь номер карточки сбербанковской своей, я тебе пять сотен хоть скину, а то спасибо, как говорится не булькает...
struct Vector3 {
  double pos[3];
};
inline Vector3 sub(Vector3 * a, Vector3 * b) {
  Vector3 res;
  res.pos[0] = a->pos[0] - b->pos[0];
  res.pos[1] = a->pos[1] - b->pos[1];
  res.pos[2] = a->pos[2] - b->pos[2];
  return res;
};
inline double mixed_product(Vector3 a, Vector3 b, Vector3 c) {
  return a.pos[0]*b.pos[1]*c.pos[2] + a.pos[1]*b.pos[2]*c.pos[0] + b.pos[0]*c.pos[1]*a.pos[2] - a.pos[2]*b.pos[1]*c.pos[0] - a.pos[1]*b.pos[0]*c.pos[2] - a.pos[0] * b.pos[2] * c.pos[1];
};
inline int dotInSimpl(double * a, double * b, double * c, double * d, double * e) {
  double side1 = mixed_product(sub((Vector3*)c, (Vector3*)a), sub((Vector3*)d, (Vector3*)a), sub((Vector3*)e, (Vector3*)a));
  double side2 = mixed_product(sub((Vector3*)d, (Vector3*)a), sub((Vector3*)b, (Vector3*)a), sub((Vector3*)e, (Vector3*)a));
  double side3 = mixed_product(sub((Vector3*)d, (Vector3*)b), sub((Vector3*)c, (Vector3*)b), sub((Vector3*)e, (Vector3*)b));
  if (side1 * side2 < 0) return 0;
  if (side2 * side3 < 0) return 0;
  if (side3 * side1 < 0) return 0;
  return 1;
};

SuslikМодераторwww15 ноя. 20127:22#5
не время отвлекаться. тебя(нас) ждут миллионы!
ну и я там немного пофиксил код, забыл посчитать ориентацию относительно четвёртой грани.. ну так, по мелочи.
glukhПостоялецwww15 ноя. 20128:22#6
Suslik
:) вот подлец...
дай код с четвёртой гранью и номер карточки!
ЗЫ кстати сделал я таки сцену из связанных симплексов и волновой алгоритм для её растеризации... найти не могу симплекс с которого начинать волну нужно... короче осталось сделать этот поиск симплекса и сцену чуть-чуть усложнить и всё можно будет лажать UD по полной... кинуть позырить проект сырой?
вот он, на всякий случай: UD 3Д-симплексы, волновой алгоритм, воксельная сцена
glukhПостоялецwww15 ноя. 20128:29#7
ой... :)... я тупой и не внимательный... (переделывает код)
glukhПостоялецwww15 ноя. 20128:32#8
так подёт?
inline Vector3 sub(Vector3 * a, Vector3 * b) {
  Vector3 res;
  res.pos[0] = a->pos[0] - b->pos[0];
  res.pos[1] = a->pos[1] - b->pos[1];
  res.pos[2] = a->pos[2] - b->pos[2];
  return res;
};
inline double mixed_product(Vector3 a, Vector3 b, Vector3 c) {
  return a.pos[0]*b.pos[1]*c.pos[2] + a.pos[1]*b.pos[2]*c.pos[0] + b.pos[0]*c.pos[1]*a.pos[2] - a.pos[2]*b.pos[1]*c.pos[0] - a.pos[1]*b.pos[0]*c.pos[2] - a.pos[0] * b.pos[2] * c.pos[1];
};
inline int dotInSimpl(double * a, double * b, double * c, double * d, double * e) {
  double side0 = mixed_product(sub((Vector3*)b, (Vector3*)a), sub((Vector3*)c, (Vector3*)a), sub((Vector3*)e, (Vector3*)a));
  double side1 = mixed_product(sub((Vector3*)c, (Vector3*)a), sub((Vector3*)d, (Vector3*)a), sub((Vector3*)e, (Vector3*)a));
  double side2 = mixed_product(sub((Vector3*)d, (Vector3*)a), sub((Vector3*)b, (Vector3*)a), sub((Vector3*)e, (Vector3*)a));
  double side3 = mixed_product(sub((Vector3*)d, (Vector3*)b), sub((Vector3*)c, (Vector3*)b), sub((Vector3*)e, (Vector3*)b));
  if (side0 * side1 < 0) return 0;
  if (side1 * side2 < 0) return 0;
  if (side2 * side3 < 0) return 0;
  return 1;
};

Mr.TyanVaryПостоялецwww15 ноя. 201210:39#9
Suslik
> suslib
хочу.
aloha_hawaiiПостоялецwww15 ноя. 201211:13#10
знаю что в пустоту скажу, но если точек много, а тетраедртрёхмерный симплекс один, можно нормали предрасчитать для скорости.
> suslib
третьим буду.
MikleМодераторwww15 ноя. 201211:51#11
glukh
> ты издеваешься? код функций sub() и mixed_product() хде?
То есть ты пишешь движок, активно использующий векторы, и всё ещё не имеешь функций Product и Subtract?
FROLПостоялецwww15 ноя. 201211:57#12
Suslik
> библиотека называется suslib
Блин, хочу такую)))
glukhПостоялецwww15 ноя. 201212:02#13
Mikle
не-не-не... у меня там ваще векторов нету, даже нормаль треугольника задана не вектором а порядком обхода точек - по часовой/против... я не говорю что это правильно, наверняка если пользоваться линейной алгеброй получится тоже самое, но я увы учился программировать а не линейную алгебру, так что в ней полный ноль... :(...
1 frag / 2 deathsУчастникwww15 ноя. 201212:09#14
Suslik
> return a.x * b.y * c.z + a.y * b.z * c.x + b.x * c.y * a.z - a.z * b.y * c.x
> - a.y * b.x * c.z - a.x * b.z * c.y;

12 умножений для вычислений объёма?
Да я же уже вижу, как сделать 10.

Страницы: 1 2 3 4 5 6 7 Следующая »

/ Форум / Программирование игр / Графика

Тема в архиве.

2001—2018 © GameDev.ru — Разработка игр