Надеюсь, этот вопрос не слишком широк. Я не ищу кого-нибудь, кто напишет за меня этот алгоритм, но надеюсь, что то, что я пытаюсь здесь сделать, уже было сделано, и мне не удалось его найти, и я надеюсь, что кто-нибудь сможет подсказать, как обычно решаются такие проблемы.
Я пишу приложение, которое берет 3D-модель из программы САПР, считывает геометрические данные и выполняет на ее основе расчеты. В 3D-пространстве координаты представлены как положительные/отрицательные значения XYZ, и у меня есть оболочка для их хранения:
Код: Выделить всё
public class XyzCoords
{
public double X;
public double Y;
public double Z;
}
Предположим, пользователь создал 3D-модель автомобиля. В зависимости от того, как они ее смоделировали, она может быть обращена в направлении X+, X-, Y+, Y-, Z+ или Z-, а крыша может быть направлена в любом другом направлении. Пользователю необходимо указать направления вперед/вверх в моем приложении, чтобы он мог разобраться в модели и выполнить на ее основе расчеты. Направления представлены в виде перечислителя:
Код: Выделить всё
public enum Directions
{
Xpos,
Xneg,
Ypos,
Yneg,
Zpos,
Zneg
}
А выбор пользователя сохраняется в настройках вот так:
Код: Выделить всё
public Directions directionFw;
public Directions directionUp;
(Право указывать не обязательно, так как оно может быть экстраполировано из значений «Вперед/Вверх»)
Чтобы сделать расчеты и результаты независимыми от направления, я есть еще одна оболочка координат, которая представляет координаты как вперед/вверх/вправо:
Код: Выделить всё
public class FurCoords
{
public double F;
public double U;
public double R;
}
Теперь мне нужен конвертер, который может конвертировать из XyzCoords в FurCoords и обратно:
Код: Выделить всё
public static class XyzFurConverter
{
public FurCoordinates Convert(XyzCoords xyzCoords, Directions directionFw, Directions directionUp)
{
//...
}
public XyzCoords Convert(FurCoordinates coordinates, Directions directionFw, Directions directionUp)
{
//...
}
}
В ядре моего приложения положительный Z считается «Вперед», а положительный Y считается «Вверх», что делает X положительным «Вправо». Это означает, что если бы первая функция была вызвана следующим образом:
Код: Выделить всё
FurCoords furCoords = XyzFurConverter.Convert([1, 2, 3], Directions.Zpos, Directions.Ypos)
Тогда значения полей FurCoords следует записать так:
Проблема заключается в реализации преобразования. Это, конечно, можно сделать с помощью множества операторов if/switch для каждой возможной комбинации, но это кажется глупым способом, учитывая огромное количество комбинаций. Кто-нибудь сталкивался с подобной проблемой и мог бы подсказать, как обычно ее решают? Опять же, я не ищу кого-то, кто сделает за меня домашнее задание, просто несколько советов.
Подробнее здесь:
https://stackoverflow.com/questions/792 ... ased-on-us