Artem: Как знаете. Мне эта задача встречалась в реальном проекте, и написанное там решение не нравится до сих пор - громоздкое и неэффективное. С тривиальными задачами такого обычно не бывает.
hoha: Похоже, что этот алгоритм работает только для целых координат. Причём, для небольших - чтобы можно было успеть перебрать все клетки за разумное время.
vitvov: Пункт 2 нужен, чтобы изолиния не уткнулась в вершину. Там удачный результат поиска - плохая ситуация, которую приходится специально обходить. Так что ошибки нет.
А насчёт "оптимизировать" - то если нужно только рисовать, и при этом устроят изолинии в виде ломаной, то всё просто: перебираете треугольники, для каждого смотрите максимальное и минимальное значение в вершинах и рисуете все изолинии, попавшие между ними (на каждую - один отрезок).
Если надо сглаживать или уметь проходить по изолиниям, то, конечно, сложнее - нужен быстрый поиск соседнего треугольника.
mellinare: Координаты. Вершинами прямоугольника будут (x1,y1), (x1,y2), (x2,y2), (x2,y1). Сортируются только числа - отдельно иксы, отдельно игреки.
Если стороны не параллельны осям, задача заметно усложняется.
Название функции - наверное. Но назначение и взаимодействие классов какой-нибудь большой библиотеки за 10 секунд (или минут) не поймёшь - его придётся изучать заново.
iegor: Зачем временный словарь? Завести новую таблицу, потом пройтись по старой, и все её непустые элементы занести в новую. Старую удалить.
Если смущает то, что всё это происходит внутри одного класса - то перенести slots и data во временные переменные, проинициализировать класс заново исходя из нового размера, и, пройдясь по старому массиву slots, занести непустые данные в таблицу.
Функция, которая читает модель? Ну да, есть такая функция. Даже целый класс - для разных способов навигации по модели. Вот только модель целиком в память не лезет, поэтому для каждого прохода всё равно приходится читать и интерпретировать файлы с данными.
Сохранять вычисленные координаты точек? Многовато их будет. Если писать на диск - то читать потом будет не дешевле, чем снова вычислять. А вычислять два раза, один для объёма, другой для площади - трата времени.
"Писать быстро" - это чтобы быстро появилась программа, или чтобы она быстро работала?
Т.е. в вашем случае - не должно быть функции которая сразу же считает и площадь поверхности и объём объекта
Бывает так, что для площади и объёма нужны одни и те же довольно долгие операции (прочитать огромную модель с диска / вычислить координаты точки по сложным формулам / посчитать возможные пересечения частей модели...) В этом случае вычисление площади и объёма отдельными функциями потребует вдвое больше времени, чем одновременное. И чем тогда лучше жертвовать - принципами или временем пользователя?
br1an: Ну, если у одного человека ставка составляет 44% от общей суммы, а у остальных 49 - по 1.3%, то с вероятностью больше половины должен победить кто-то из этих остальных. На то и вероятность, и это совершенно нормально.
Dvvarreyn: Я с этим не спорю. Вот только всё чаще убеждаюсь, что использование логической переменной (для выхода из двойного цикла, или для ситуации, которую я привёл здесь) позволяет чуть меньше думать над написанием кода, и даёт заметно более гибкий код - например, заменить квантор, реализованный через goto, на противоположный, или добавить к нему else-часть, не всегда просто, и получается не всегда красиво. Хотя goto эффективнее, и часто даёт более короткий код.
Переписать этот код, не дублируя вызовов, не вводя дополнительных переменных и не используя break или goto, вряд ли удастся. Так что здесь break, стоящий после H() - это замаскированный goto. идущий в обход G(), обойти который с помощью только if/else не получается.