Pull to refresh

Comments 10

1) В процессе прочтения первого предложения я впал в ступор целых два раза: «математический анализ», который как бы не к месту, и прекрасное «наиболее лучший».
2) Используйте для формул что-то приличное, ибо вот это
a^ = b^ + c^ — 2*b*c*cos(ALPHA)
, к тому же с потерянными степенями, выглядит не очень.
3) Такую кучу кода неплохо бы как-то пояснять (например, не поясните необходимость своего класса Exception вместо дерева stl-евских классов исключений? И это просто первое, что попалось на глаза, которые разбежались от вида такого числа папок/подпапок/файлов при условно простом алгоритме)
4) Посчитайте точность/полноту/F-меру, чтобы можно было хоть как-то оценивать результат. Круто было бы сравнить с чьими-то уже существующими реализациями похожих вещей.
Спасибо за замечания! Действительно, в большинстве я с вами полностью согласен. Буду исправляться.
И хабракат тогда уж лучше совсем уберите. Что есть, что нету…
Я чуть про код ещё выскажусь, если не возражаете (совсем уж вчитываться не стал, но частично глянул):

— определитесь со стилем (например, страшно видеть абсолютно по-разному офомленные if-ы или имена переменных, находящиеся в 3 строчках друг от друга)
— структура Point: сигнатура оператора «равно» — ещё куда ни шло, хотя парамтр там бы const ссылку сделать, но вернуть вы ничего не забыли там случайно?
— инкапсуляция? (пример её отсутствия тут и тут, хотя бы)
— велосипеды? половина math как минимум
— (это по вкусу, может быть) обилие указателей, где можно использовать объекты/сслылки.
Писал явно C-разработчик.
Прошу прощения за столь грубый стиль. Не буду спорить, что код далек от совершенства, но существует ли совершенный код? Да и играет ли он ключевую роль в данной теме?
Скажу прямо, что ни одного серьезного замечания вы не выдвинули, не смотря на то, что в коде явно покопались. Все что сделано, сделано не просто так — на то есть причины. Не буду я также спорить, что есть масса способов что-либо сделать лучше. Нужно иметь ввиду, что в данном случае код прилагается к основной теме. Да и, к тому же, если кто-то действительно заинтересован, он может просто получить исходники и изменить все, что считает нужным. Ну, что ж, все равно спасибо вам. Очень приятно, что исходники кого-то заинтересовали.
Потому что код в данном случае не на первом месте, я в него полез не сразу) Идеального кода нет, но есть приятночитаемый. И «покопался» — сильное слово, в основном .h файлы посомтрел… И я не предлагаю вам бежать всё переписывать, я просто даю несколько советов, которые мне кажутся полезными. Прислушиваться к ним или нет — ваше право, разумеется.
Нет, ну правда. Тот же math: getDistance надо заменить на один вызов hypot(p1.x-p2.x, p1.y-p2.y); fabs есть функция; вместо _angle по идее можно acos использовать, если правильно понял.
Для вычисления угла удобнее использовать не теорему косинусов, а скалярное и псевдовекторное (косое) произведение векторов.

если a, b и c — радиус-векторы Ваших точек, то
BA = a — b = {x1-x2, y1-y2}
BC = c — b = {x3-x2, y3-y2}

( BA * BC ) = |BA| * |BC| * cos (BA,BC) = (x1-x2) * (x3-x2) + (y1-y2) * (y3-y2)
[ BA x BC ] = |BA| * |BC| * sin (BA,BC) = (x1-x2) * (y3-y2) — (y1-y2) * (x3-x2)
[ BA x BC ] / (BA * BC) = tg (BA,BC) = tg (BETA) = ((x1-x2) * (y3-y2) — (y1-y2) * (x3-x2)) / ((x1-x2) * (x3-x2) + (y1-y2) * (y3-y2))
Чтобы не путаться в знаках, можно использовать функцию atan2, которая вычисляет арктангенс y / x по заданным x и y c учётом знаков и нулей.
Sign up to leave a comment.

Articles