IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Закраска по методу Гуро и Фонга
сообщение
Сообщение #21


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(Malice @ 23.04.2007 23:34) *

Что ж тут не понятного ? Массив Line_ заполнен так [что соединяем, с чем, что, с чем, ..] т.е. на четных местах стоих первая точка, на нечетных - вторая. По-этому p*2-четная точка, p*2+1 следующая, т.е. с которой соединение.
Массив tetr так [x, y, z, x,y,z, и т.д.], принцип тот же..

спасибо за объяснение! а для чего умножение на 3?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Цитата(18192123 @ 23.04.2007 23:56) *

спасибо за объяснение! а для чего умножение на 3?

Ну так p*3=х, p*3+1=y, p*3+2=z как раз..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Гость






Цитата(18192123 @ 20.04.2007 8:11) *

Почему никто не хочет мне этого объяснить на моём примере?
Я хочу сделать сама, но мне нужно вначале понять, как начинать, а начинать нужно с взятия нормалей, нахождения их векторного произведения и нормирования полученного вектора....
Ну не пойму я, как выбрать в начале вектора!
( а в программе, которую оставил Malice для меня всё не понятно! Да и объёмчик внушительный!)


Сейчас я всё попробую объяснить на конкретном примере=)
Для начала я бы модифицировал сам пример для большего удобства работы.
Вообще я писал бы на объектах=), но не всё сразу.
Во первых описал бы типы:
Код

type
  TPoint3d = record {Трёхмерная точка}
    case byte of
      0: (x, y, z: real); {заданная либо тремя координатами в отдельных полях записи}
      1: (v: array[0..2] of real); {либо тремя элементами массива. Тогда 0й-x, 1й-y...}
  end;
  TNumLine = array[0..1] of integer; {тип, хранящий пару номеров вершин одного ребра}
  TNumPlane = array[0..2] of integer; {тип, хранящий тройку номеров вершин одной грани}
  TTetra = record {Тип, описывающий тетраэдр}
    Points: array[0..3] of TPoint3d;  {Все четыре вершины тетраэдра}
    Edges: array[0..5] of TNumLine;   {Все шесть ребер тетраэдра,
    заданные парами номеров соединяемых ребрами вершин из массива Points}
    Planes: array[0..3] of TNumPlane; {Все четыре треугольных грани тетраэдра.
    Каждая грань задана тройкой номеров вершин, входящих в неё. Номера вершин
    в соответствии с массивом Points.}
  end;

тогда наш тетраэдр будет задан следующей типизованной константой:
Код

const
  Tetra: TTetra = (
    Points: ( {Все точки тетраэдра}
      (X: -1; Y: -1; Z: -1), {0}
      (X: -1; Y: -1; Z:  1), {1}
      (X: -1; Y:  1; Z: -1), {2}
      (X: -1; Y:  1; Z:  1));{3}
    Edges: ( {Все рёбра тетраэдра}
      (0, 1),
      (0, 2),
      (0, 3),
      (1, 2),
      (2, 3),
      (3, 1));
    Planes: ( {Все грани тетраэдра}
      (0, 1, 2), {внимание! грани лучше задавать так, чтобы если смотреть на них}
      (0, 2, 3), {снаружи, то точки обхода грани шли против часовой стрелки}
      (0, 3, 1), {зачем это надо скажу ниже}
      (1, 2, 3))
  );

Тепрь бы я написал функции перевода координат из трёхмерных в экранные.
По-хорошему это надо делать с помощью афинных преобразований, но для начала сойдёт и выкорчевывание кода из привелённой выше по форуму программки.

Я обещал рассказать зачем надо обходить грани против часовой стрелки.
По порядку.
Грань -- это плоскость. Она задана тремя точками не лежащими на одной прямой.
К любой плоскости можно построить нормаль.
Любая точка -- это вектор. Положим все знакомы с операциями сложения/вычитания векторов, а также с операцией их векторного умножения.
Итак, плоскость задана тремя точками (векторами) a, b и c.
У нашего тетраэдра грани имеют две стороны: лицевую и изнаночную.
Положим точки a, b и c, если смотреть на грань с лицевой стороны расположены так, что двигаясь от a к b, от b к c и от c к a мы двигаемся против часовой стрелки.
Получаем два вектора: (ab)=b-a и (ac)=c-a. Векторное произведение v=(ab)*(ac) -- это вектор, перпендикулярный плоскости (abc). Прчем по правилу буравчика он будет смотреть из плоскости в нашу сторону, то есть в сторону лицевой стороны. Если нормировать этот вектор n=v/|v|, то получим как раз нормаль к плоскости abc.
Кстати, я не проверял координаты точек, которыми задан тетраэдр. Очень может быть, что они как раз не удовлетворяют требованию обхода против часовой стрелки. Я полагал, что нулевая точка тетраэдра -- это его вершина, а три другие в основании.
Так что нужно проверить, чтобы это было именно так.
Для первого раза хватит?
Потом дальше расскажу, если всё ещё интересно=).

P.S.
Я приношу свои извинения, если ошибся в синтаксисе. Писал прямо в браузере, и мог опечататься. К тому же сто лет не открывал Турбо Паскаля.
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.09.2020 22:55
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name