![]() |
Новый 3d редактор RiFLe - вопрос к математикам
Вложений: 2
Здраствуйте уважаемые форумчане. Запиливаю небольшой 3d редактор RiFLe(во вложении версия на текущий момент, скриншот) для удобства создания low-poly моделей типа рельефных надписей, стен с оконными и дверными проёмами, хотя можно сделать модель и посложнее.
Сделал автоматическое рисование треугольников(триангуляция Делоне), но вот никак не могу найти решение для простой на первый взгляд задачи - найти центр описанной около треугольника окружности в координатной форме. СУТЬ ПРОБЛЕМЫ В триангуляции использован исходник для нахождения координат центра описанной окружности, который, как оказалось, с ошибкой. Из-за этого треугольники не рисуются в случае, подобном примеру Example_with_Error. Есть статья на википедии http://ru.wikipedia.org/wiki/Описанная_окружность но там в векторной форме и непонятно как использовать эти два числа в скобке через запятую (перемножить или что?) ![]() Буду очень рад, если кот-нибудь подскажет как эти уравнения расписать подробно в координатной форме( чтоб запрогать их) Вот старый исходник, который счас в редакторе. Код:
Function InCircle(xp#, yp#, x1#, y1#, x2#, y2#, x3#, y3#, xc#, yc#, r#) |
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
Смешно выкладывать прототип редактора Модех, выдавая его за свой!, хоть бы название сменил!
|
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
Да, я думаю это было сказочной глупостью выкладывать то, хозяин чего постоянно кантуется на форуме...
|
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
Где там Модэкс? Возможно мы его потом в Модэкс и встроим, но счас он отдельно
|
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
жди, я потираю руки в предвкушении срача
|
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
Ещё раз разуйте глаза и взгляните на скриншот - это не модекс. Это мой редактор, который я писал для L.D.M.T и продолжил счас развивать
|
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
а тогда другое дело,
так сразу бы и отписался, |
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
нигде нет нормально пашуших исходников, или формул, хотя казалось бы...
|
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
Цитата:
Код:
Edge1.X = B.X - A.X Center - искомый центр окружности |
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
L.D.M.T. залогинься
|
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
Разобрался с проблемой:
Дело было в граничных условиях - если прямо на границу описанной окружности ложились еще точки, то функция выдавала true. Чтоб обойти это, в таком случае сортируем точки по величине угла к центру окружности (помог Atan2), чтоб узнать, в каком случае включать их, а в каком нет. Заодно это приводит к некоторому порядку в прорисовке треугольников Код:
Function InCircle4(xp#, yp#, x1#, y1#, x2#, y2#, x3#, y3#, xc#, yc#, r#) |
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
A_Z
немного побрюзжу по поводу кода :) - не забывай о погрешности float и сравнивай float переменные в виде разницы между ними: Код:
If Abs( переменная1 - переменная2 ) < EPSILON - сократи квадратные корни в вычислении радиуса и дистанции, для сравнения подобных величин можно обойтись без корня. - не используй для возведения в квадрат оператор ^, т.к. в блице это вызов функции, намного дороже чем просто перемножить Код:
... - не обязательно везде указывать тип переменной ( я про значок # ), достаточно при обьявлении или первом использовании. - не забывай обьявлять локальные переменные в функциях как Local, иначе может быть конфликт с глобальными переменными Код:
If (angle#>=90 And angle#<180) Or (angle#=>-90 And angle#<0) Код:
Return ( angle >= 90 And angle < 180 ) Or ( angle => -90 And angle < 0 ) |
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
Cпасибо Platon, это все учту:)
конкректно по вопросу почему ... If rasst#=radius# ... - это как раз и есть граничное условие в триангуляции Делоне, что больше чем 3 точки оказывается на описанной окружности (скажем надо протриангулировать прямоугольник - там два треугольника, но если описывать окружность вокруг них, то четвёртая точка прямоугольника будет лежать на её границе) - поэтому конкретно для этого случая и приходится делать так. |
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
A_Z
Это условие лишнее, т.к. у тебя выше него есть два условия - расстояние меньше радиуса и расстояние больше радиуса, если оба условия не сработают, то значит расстояние равно радиусу и смысла еще раз это проверять нет :) |
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
Platon. ещё раз
если прямо на ГРАНИЦУ описанной окружности ложились еще точки, то функция выдавала true. Чтоб обойти это, в таком случае сортируем точки по величине угла к центру окружности (помог Atan2), чтоб узнать, в каком случае включать их, а в каком нет. Заодно это приводит к некоторому порядку в прорисовке треугольников |
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
без этого условия триангуляция не пашет правильно.
|
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
A_Z
А теперь включи логику и вдумайся Код:
If rasst#<radius# Then Return True Код:
If rasst#=radius# Не на алгоритм смотри, а на логику кода :) |
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
Логика
если участников<5 идём в зал 1 если участников>5 идём в зал 2 если участников=5 разбираем подробнее кто пришел и выбираем куда идти в зависимости от ДОПОЛНИТЕЛЬНЫХ условий. Короче нарисуй простой квадрат разбей на 2 треугольника диагональю попробуй описать окружность ты увидишь, что 4я точка тоже ложится на ИМЕННО ЕЁ ГРАНИЦУ для другого треугольника произойдёт та же ерунда Это является граничным условием, поскольку в триангуляци Делоне при случае попадания 4й точки НА ГРАНИЦУ БЛ*ТЬ окружности, надо самому выбирать, рисовать треугольник или нет ;) |
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
Цитата:
если участников>5 идём в зал 2 мы не пошли в зал 1 и не пошли в зал 2, значит участников не меньше 5 и не больше 5, т.е. ровно 5, и проверять что их 5 не нужно. ЗЫ Ты или тупой или тролль, уж извни за прямоту :) |
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
Можешь стереть If rasst#=radius# и endif в конце, если они тебе так не нравятся.
Но код нужен в любом случае Последний пример ты глава секции танцев, сегодня могут прийти от 4х до 6х человек.: Если пришло<5 то с разбитием на пары проблем нет - 4 человека - 2 пары в случае>5 тож нет проблем - 3 пары но в случае с 5ю нужно решать как их разбить на пары. Для этого и нужен код П.с. Сам ты тупой или тролль, если уже 2 часа придираешься к ерунде:) ;) |
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
Не знаю что там по поводу танцев:-D но если переменная, может быть <5 и она же может быть >5 то её можно проверять и на =5. Если только условия выглядит так
If rasst#=5.0 но не так If rasst#=radius# что-то вроде If rasst#=5.0 then end |
Ответ: Новый 3d редактор RiFLe - вопрос к математикам
Лишняя проверка здесь зрительный маркер для удобства отслеживания ветвления, наглядности, что дальнейший текст связан по смыслу именно не со сработавшими ранее условиями... Конечно же она лишняя и любой желающий, если ему так хочется, может её выпилить, и да, код сработает без неё и быстрее причём...
|
Часовой пояс GMT +4, время: 01:55. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot