2016-02-26 4 views
0

У меня есть пространственная (т. Е. 3D) карта, которую я планирую генерировать. Общая карта разбита на следующие термины и размеры:Как представить комплексный вектор?

ПРИМЕЧАНИЕ: Hektum - это составленное слово вместо использования квадранта, поскольку квадрант обозначает четверти. Hektum, в данном случае, обозначает 16ths.

Вселенной (128 х 128 х 128 области)
область (16 х 16 х 16 секторов)
сектор (4 х 4 х 4 Hektums)
Hektum (64.0 х 64,0 х 64,0 векторы)
Vector3 (с плавающей точкой (х), поплавок (г), поплавок (у))

Моя проблема заключается в определении типа, который представляет собой spatial_vector - конкретно, когда дело доходит до Vector3(float, float, float). Скажем, я хочу представить местоположение, при этом Vector3 не имеет смысла. Полное местоположение включает в себя что-то вроде следующего:

spatial_loc = SpatialVector(`1976984.2197.44.0.4532.36.001.17.9027`) 

, где части, разделенные периодами являются:

область (х: 24, г: 85, у: 120) = 1976984
сектор (х: 5, г: 9, у: 8) = 2197
Hektum (х: 0, г: 3, у: 2) = 44
... , то все, что следует:
вектор (х: 0,4532, z: 36,001, y: 17,9027) = ???

Проблема действительно два раза (но я хорошо ж/сосредоточив внимание на # 1 и в зависимости от ответов просим пользовательскую CTYPE помощи другого вопрос):

  1. Как я могу представлять 4-я часть вектора, так как в нем есть поплавки? Остальные части (x, z, y) преобразуются в линейные значения.
  2. Стоит ли писать собственный ctype, так что это можно рассматривать как значение? В некотором смысле было бы разумно сделать это в математических целях.

В идеале, как часть # 2, подняты следующие вопросы:

  1. Я прочитал документацию Python на написание новых типов. Однако каковы шаги для этого? то есть с использованием другой IDE (Intelli-J для примера) и способа компиляции и т. д.
  2. Значение типа (struct) может быть присвоено как v = 3. Возможно ли иметь аналогичное назначение с пользовательским значением ctype?Например:

    spatial_loc = 1976984.2197.44.0.4532.36.001.17.9027

Опять же, проблема # 1 мой главный вопрос: как я могу представить в простом формате с Vector3(float, float, float).

+2

Поплавки являются плохим выбором для вашего приложения, они не равномерно расположены в декартовом пространстве. Гораздо лучше использовать 3 x 32-битные целочисленные значения. Это имеет дополнительное преимущество в том, чтобы более аккуратно устанавливать вашу существующую схему. На самом деле, почему бы вам просто не использовать 64-битные целые числа - биты 0-6 - это Вселенная, 7-10 - Region, 11-12 - Hektum, что-то вроде этого. –

+0

@HighPerformanceMark: Я просто думал о bitarray и маскирующих битах, как вы предлагаете. Как насчет использования Decimal (...) вместо float? «Равномерно разнесенная» проблема довольно незначительна в отношении такой обширной территории, не так ли? – IAbstract

+0

@HighPerformanceMark: можете ли вы расширить свои проблемы с неравномерным интервалом поплавков в декартовом пространстве? Это из-за точности? Я слышал, что numpy - это инструмент для поплавков, но у меня возникают проблемы с его установкой в ​​моей системе Windows. – IAbstract

ответ

0

Я не уверен, что вы новичок, который смотрит на слишком сложное решение или опытный программист с проблемами производительности.

Я полагаю, что будет у вас в середине ...

Я никогда не будет смотреть на первый ctypes решений.

Во-первых, я бы создал класс Python с функциями для работы с вашими проблемами с представлением, такими как str и repr.

Простое представление, которое вы можете использовать, это кортежи или именованные кортежи. Тем не менее, они неизменны. Списки тоже будут хороши, но я бы использовал атрибуты экземпляра для класса.

Я также хотел бы решить все проблемы с float-вектором с numpy и scipy. Это библиотеки для эффективной математической обработки.

Извините, если вы находитесь за его пределами.

+0

Не касается проблем с производительностью на данный момент. @HighPerformanceMark упомянул, по существу, использование bitarray и вообще избегая поплавков. – IAbstract

Смежные вопросы